0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
1

Сортировка в структуре

28.05.2014, 12:33. Показов 4319. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно считать в структуру информацию из файла, и отсортировать по зарплате. В файле записана информацию: Имя, год рождения, и зарплата. Со строки 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);
 
 
 
        }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2014, 12:33
Ответы с готовыми решениями:

Сортировка в структуре
Мне нужно отсортировать структуру по дате рождения #include &lt;iostream&gt; #include &lt;windows.h&gt;...

Сортировка в структуре
По заданию нужно ввести данные в структуре, отсортировать по цене (от наименьшей к наибольшей) и...

Сортировка в структуре
Надо отсоритровать структуру по параметру &quot;Телефон&quot; Листал форум, вроде все написано правильно,...

Сортировка в структуре
Структура: struct Worker { string Name; int Year; ...

13
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
28.05.2014, 12:41 2
Serge666, Как минимум это вообще не сортировка....а я даже не знаю что.....
C++
1
if (dbase[i].pay < dbase[j].pay)
рассчитан на то, что j<i....у вас это не соблюдается.
Если же этот обход привести в порядок, то нужен еще один внешний цикл, который будет это все действо повторять до тех пор, пока будет хоть одна замена.
0
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;
Все равно не сортирует.
Напишите пожалуйста, как должно быть.
0
2 / 2 / 5
Регистрация: 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;
    }
Сортировать должно от МАХ к МИН
0
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
30.05.2014, 14:19  [ТС] 5
Для проверки, я записываю не в исходный файл, а в другой, скажем так тестовый)
Слева исходник, справа, "сортированный".
Riddleman, все равно так же получается, на скрине.
[cut]
p.s Скрин почему-то не отображается
0
2 / 2 / 5
Регистрация: 03.03.2013
Сообщений: 49
30.05.2014, 14:31 6
А тебя не настораживает что до сортировки у тебя одни числа а после сортировки совсем другие, почему так? Что ты с ними делаешь?
0
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
30.05.2014, 14:34  [ТС] 7
Ничего, в том то и дело, я считываю из файла, в структуру, и все.
0
2 / 2 / 5
Регистрация: 03.03.2013
Сообщений: 49
30.05.2014, 14:34 8
А результат как ты выводишь???
Или я тупой или лыжи не едут ))))
0
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);
вот так, не правильно вывожу?)
0
2 / 2 / 5
Регистрация: 03.03.2013
Сообщений: 49
30.05.2014, 14:46 10
Скинь весь проект чтобы посмотреть весь чудо-код в куче, исходный тхт не забудь.
0
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 байт, 14 просмотров)
0
2 / 2 / 5
Регистрация: 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 например и небило б гемора. И сканфом ты не умеешь пользоватся, я не переделывал - уменшыл токо количество символов, прими к сведеню.
0
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 25
31.05.2014, 00:24  [ТС] 13
Что-то нифига не сортирует. Да записывать стал правильно, но он просто копирует из одного файла в другой.
0
2 / 2 / 5
Регистрация: 03.03.2013
Сообщений: 49
31.05.2014, 15:32 14
Лучший ответ Сообщение было отмечено Serge666 как решение

Решение

Ты даешь программе файл с записями, програма считывает их,сортирует от МАХ к МИН и записывает в другой файл уже отсортированные. Чего тебе еще надо??? Опредились чего ты хочешь. Все оно сортирует я проверял раз с 10, глаза разуй.
1
31.05.2014, 15:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2014, 15:32
Помогаю со студенческими работами здесь

Сортировка в структуре
Нужно создать структуру, вбить туда инфу: имя, факультет, группа, пропусков. вывести список у кого...

Сортировка данных в структуре
Написал код для структуры, содержащей список фамилий, имен, номеров телефона, дней рождения Нужно...

Сортировка данных в Структуре С++
Доброго времени суток, дорогие форумчане! Возникла следующая проблема. Нужно отсортировать...

Сортировка данных в структуре
Здравствуйте, как отсортировать структуру по количеству детей в семье struct Department1 {...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru