Форум программистов, компьютерный форум CyberForum.ru

Сортировка в структуре - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Serge666
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
28.05.2014, 12:33     Сортировка в структуре #1
Нужно считать в структуру информацию из файла, и отсортировать по зарплате. В файле записана информацию: Имя, год рождения, и зарплата. Со строки 44 по 54 выполняю сортировку, правильно ли я ее делаю? Если нет, подскажите как это сделать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
 
#include <cstdio>
#include <cstring>
#include <iostream.h>
using namespace std;
int main()
{system("chcp 1251>0");
 
 
    const int l_name=20;
 
    struct Sotr{
        char name[l_name+1];
        int birth_year;
        float pay;
    };
 
    const int l_base=50;
    Sotr dbase [l_base];
    char name [l_name+1];
    FILE *fin;
 
    if ((fin=fopen("D:\\Test.txt","r"))==NULL){
        puts ("Ошибка открытия файла");
        system ("pause");
        return 1;
    }
    int i=0;
    while (!feof(fin)){
        fgets(dbase[i].name,l_name,fin);
        fscanf(fin,"%d%f\n",&dbase[i].birth_year,&dbase[i].pay);
        i++;
        if(i>l_base){puts("Слишком длинный файл"); system ("pause"); return 1;}
        }
 
float t=0;
int j;
 
    for (i = 0; i < l_base; i++)
    {
for (j = 1; j < l_base; j++)
    {
if (dbase[i].pay < dbase[j].pay) {
 
 
t=dbase[i].pay; dbase[i].pay=dbase[j].pay;
 dbase[j].pay=t;
}
}
    }
 
fprintf (fin, "%s, %d, %d", dbase[i].name, dbase[i].birth_year, dbase[i].pay);
fclose(fin);
 
 
 
        }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2014, 12:33     Сортировка в структуре
Посмотрите здесь:

C++ Сортировка в структуре
Сортировка данных в структуре C++
Сортировка данных в Структуре С++ C++
C++ Сортировка в структуре (ошибка в коде)
Сортировка в структуре C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
28.05.2014, 12:41     Сортировка в структуре #2
Serge666, Как минимум это вообще не сортировка....а я даже не знаю что.....
C++
1
if (dbase[i].pay < dbase[j].pay)
рассчитан на то, что j<i....у вас это не соблюдается.
Если же этот обход привести в порядок, то нужен еще один внешний цикл, который будет это все действо повторять до тех пор, пока будет хоть одна замена.
Serge666
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
30.05.2014, 13:07  [ТС]     Сортировка в структуре #3
Поменял на
C++
1
2
3
4
5
6
7
    for (i = 0; i < l_base; i++)
    
    {
if (dbase[i].pay > dbase[i+1].pay) {
 
t=dbase[i].pay; dbase[i].pay=dbase[i+1].pay;
 dbase[i+1].pay=t;
Все равно не сортирует.
Напишите пожалуйста, как должно быть.
Riddleman
1 / 1 / 4
Регистрация: 03.03.2013
Сообщений: 49
30.05.2014, 13:58     Сортировка в структуре #4
Походу должно быть вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(int i=0; i<l_base; i++)
    {
        int max=i;
        for( int n=(i+1); n<l_base; n++)
        {
            if(dbase[max].pay < dbase[n].pay)
            {
                max=n;
            }
        }
        float t = dbase[i].pay;
        dbase[i].pay = dbase[max].pay;
        dbase[max].pay = t;
    }
Сортировать должно от МАХ к МИН
Serge666
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
30.05.2014, 14:19  [ТС]     Сортировка в структуре #5
Для проверки, я записываю не в исходный файл, а в другой, скажем так тестовый)
Слева исходник, справа, "сортированный".
Riddleman, все равно так же получается, на скрине.
[cut]
p.s Скрин почему-то не отображается
Riddleman
1 / 1 / 4
Регистрация: 03.03.2013
Сообщений: 49
30.05.2014, 14:31     Сортировка в структуре #6
А тебя не настораживает что до сортировки у тебя одни числа а после сортировки совсем другие, почему так? Что ты с ними делаешь?
Serge666
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
30.05.2014, 14:34  [ТС]     Сортировка в структуре #7
Ничего, в том то и дело, я считываю из файла, в структуру, и все.
Riddleman
1 / 1 / 4
Регистрация: 03.03.2013
Сообщений: 49
30.05.2014, 14:34     Сортировка в структуре #8
А результат как ты выводишь???
Или я тупой или лыжи не едут ))))
Serge666
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
30.05.2014, 14:41  [ТС]     Сортировка в структуре #9
C++
1
2
3
4
5
6
FILE *her;
her=fopen ("D:\\Test2.txt", "w");
for (i = 0; i <l_base; i++)
fprintf (her, "%s %d %d\n", dbase[i].name, dbase[i].birth_year, dbase[i].pay);
fclose(fin);
fclose(her);
вот так, не правильно вывожу?)
Riddleman
1 / 1 / 4
Регистрация: 03.03.2013
Сообщений: 49
30.05.2014, 14:46     Сортировка в структуре #10
Скинь весь проект чтобы посмотреть весь чудо-код в куче, исходный тхт не забудь.
Serge666
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
30.05.2014, 14:48  [ТС]     Сортировка в структуре #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
 
#include <cstdio>
#include <cstring>
#include <iostream.h>
using namespace std;
int main()
{system("chcp 1251>0");
 
 
    const int l_name=20;
 
    struct Sotr{
        char name[l_name+1];
        int birth_year;
        int pay;
    };
 
 
 
    const int l_base=4;
    Sotr dbase [l_base];
    char name [l_name+1];
    FILE *fin;
 
 
 
 
    if ((fin=fopen("D:\\Test.txt","r"))==NULL){
        puts ("Ошибка открытия файла");
        system ("pause");
        return 1;
    }
    int i=0;
    while (!feof(fin)){
        fgets(dbase[i].name,l_name,fin);
        fscanf(fin,"%d%d\n",&dbase[i].birth_year,&dbase[i].pay);
        i++;
        if(i>l_base){puts("Слишком длинный файл"); system ("pause"); return 1;}
        }
 
 
 
for(int i=0; i<l_base; i++)
    {
        int max=i;
        for( int n=(i+1); n<l_base; n++)
        {
            if(dbase[max].pay < dbase[n].pay)
            {
                max=n;
            }
        }
        float t = dbase[i].pay;
        dbase[i].pay = dbase[max].pay;
        dbase[max].pay = t;
    }
                                    //swap(dbase[j].pay, dbase[j-1].pay);
}
}
    }
FILE *her;
her=fopen ("D:\\Test2.txt", "w");
for (i = 0; i <l_base; i++)
fprintf (her, "%s %d %d\n", dbase[i].name, dbase[i].birth_year, dbase[i].pay);
fclose(fin);
fclose(her);
system ("pause");
 
 
 
        }
Вложения
Тип файла: txt Test.txt (111 байт, 6 просмотров)
Riddleman
1 / 1 / 4
Регистрация: 03.03.2013
Сообщений: 49
30.05.2014, 15:48     Сортировка в структуре #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//#include "stdafx.h"
#pragma hdrstop
//#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
#include <string.h> 
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
    system("chcp 1251>0");
 
 
    const int l_name=8;
 
    struct Sotr{
        char name[l_name+1];
        int birth_year;
        int pay;
    };
 
 
 
    const int l_base=4;
    Sotr dbase [l_base];
    char name [l_name+1];
    FILE *fin;
 
 
 
 
    if ((fin=fopen("D:\\Test.txt","r"))==NULL){
        puts ("Ошибка открытия файла");
        system ("pause");
        return 1;
    }
    int i=0;
    while (!feof(fin)){
        fgets(dbase[i].name,l_name,fin);
        fscanf(fin,"%d%d\n",&dbase[i].birth_year,&dbase[i].pay);
        cout<<dbase[i].name<<' '<<dbase[i].birth_year<<' '<<dbase[i].pay<<'\n';
        i++;
        if(i>l_base){puts("Слишком длинный файл"); system ("pause"); return 1;}
        }
 
 
 
 
    for(int i=0; i<l_base; i++)
    {
        int max=i;
        for( int n=(i+1); n<l_base; n++)
        {
            if(dbase[max].pay < dbase[n].pay)
            {
                max=n;
            }
        }
        Sotr t; 
        t.pay = dbase[i].pay;
        strcpy(t.name,dbase[i].name);
        t.birth_year=dbase[i].birth_year;
        dbase[i].pay = dbase[max].pay;
        dbase[i].birth_year = dbase[max].birth_year;
        strcpy(dbase[i].name,dbase[max].name);
        
        dbase[max].pay = t.pay;
        dbase[max].birth_year = t.birth_year;
        strcpy(dbase[max].name ,t.name);
    }
                                    //swap(dbase[j].pay, dbase[j-1].pay);
    FILE *her;
    her=fopen ("D:\\Test2.txt", "w");
    for (i = 0; i <l_base; i++)
    fprintf (her, "%s %d %d\n", dbase[i].name, dbase[i].birth_year, dbase[i].pay);
    fclose(fin);
    fclose(her);
    system ("pause");
 
 return 0;
 
}
Теперь все сортирует как надо. С тебя причетается. Давно я такого говнокода не колотил ))). Да, и начинай изучать указатели.

Добавлено через 10 минут
Да, и начинай изучать указатели. И вообще эту твою структуру зипиндюрить в какой нибудь контейнер, в vector например и небило б гемора. И сканфом ты не умеешь пользоватся, я не переделывал - уменшыл токо количество символов, прими к сведеню.
Serge666
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
31.05.2014, 00:24  [ТС]     Сортировка в структуре #13
Что-то нифига не сортирует. Да записывать стал правильно, но он просто копирует из одного файла в другой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2014, 15:32     Сортировка в структуре
Еще ссылки по теме:

C++ Сортировка по фамилии в структуре
Сортировка и поиск данных в структуре C++
C++ Сортировка в структуре

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Riddleman
1 / 1 / 4
Регистрация: 03.03.2013
Сообщений: 49
31.05.2014, 15:32     Сортировка в структуре #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ты даешь программе файл с записями, програма считывает их,сортирует от МАХ к МИН и записывает в другой файл уже отсортированные. Чего тебе еще надо??? Опредились чего ты хочешь. Все оно сортирует я проверял раз с 10, глаза разуй.
Yandex
Объявления
31.05.2014, 15:32     Сортировка в структуре
Ответ Создать тему
Опции темы

Текущее время: 12:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru