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

Структуры. Сортировка массива структуры - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
25.11.2011, 03:23     Структуры. Сортировка массива структуры #1
Здравствуйте!

В чем моя ошибка??

Нужно отсортировать массив структуры по возрастанию среднего балла??

Делаю это с помощью пузырьковой сортировки

Данные в структуру считываю с файла

C++
1
2
3
4
5
6
Ivanov 203 3 4 5 2 3 
Petrov 402 4 2 3 4 3 
Homenko 303 2 5 4 1 1
Zaletov 101 4 5 5 5 5 
Sidorov 304 1 4 5 4 5 
Reznik 304 1 1 1 1 1
вот код:

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
86
87
88
89
90
91
92
93
#include "iostream"
#include "fstream"
 
using namespace std;
 
struct student
{
    char name[20];
    int group;
    int  ses[5];
};
 
double sort(student *,int n);    // прототип функции
 
int main()
{
    setlocale(LC_CTYPE,"Russian"); //русский шрифт в консоле
    int n, i, j;
    cout << "Введите количество структур типа студент - ";
    cin >> n; //число элементов в массиве структур
    //выделение динамической памяти
    //под массив структур
    student *stud1 = new student [n];
 
    ifstream instr("inform.txt");   //открытие файла для ввода
    if(!instr)
    {
        cout<<"File can not be open\n";
        return 0;
    }                                          //выход из программы
 
    //заполнение массива считыванием из файла
    for(i = 0; i < n; i++)
    { 
        instr >> stud1[i].name >> stud1[i].group;
        cout << stud1[i].name << " " << stud1[i].group; 
            for(j = 0; j < 5; j++)
            {
                instr >> stud1[i].ses[j];
                cout << " " << stud1[i].ses[j];
            }   
            cout << endl;
    }  
    instr.close();
 
    cout << endl;
    sort(stud1, n);
 
    for(i = 0; i < n; i++)
    { 
        cout << stud1[i].name << " " << stud1[i].group; 
            for(j = 0; j < 5; j++)
            {
                cout << " " << stud1[i].ses[j];
            }   
            cout << endl;
    }  
    
    system("pause >> null");
    return 0;
}
 
double sort(student *gr, int n)
{
    double s;
    double *avg = new double [n];
    
    for(int i = 0; i < n; i++)
    {
        s = 0.;
        for(int j = 0; j < 5; j++)
        {
            s += gr[i].ses[j];
            avg[i] = s / 5;
        }
        cout << gr[i].name << " " << avg[i] << "\n";
    }
    cout << endl;
    for (int i = n - 1; i > 0; i--)
    {
        for(int j = 0; j < i; j++)
        {
            if(avg[j] > avg[j + 1])
            {
                student x = gr[j];
                gr[j] = gr[j + 1];
                gr[j + 1] = x;
            }
        }
    }
    delete [] avg;
    return 0;
}

Сортирует оно как бы первые три фамилии между собой и последние три фамилии между собой!
так же поступает и с большим количеством студентов! делит как бы массив пополам?

В чем ошибка??
Миниатюры
Структуры. Сортировка массива структуры  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2011, 03:23     Структуры. Сортировка массива структуры
Посмотрите здесь:

C++ Структуры(сортировка)
Сортировка, Функции, Структуры C++
сортировка структуры. C++
C++ Структуры. Сортировка
C++ Сортировка структуры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dyosick
 Аватар для dyosick
61 / 61 / 6
Регистрация: 25.08.2008
Сообщений: 178
25.11.2011, 03:59     Структуры. Сортировка массива структуры #2
Уж извини, как-то в твоем коде неохота разбираться.

Но могу посоветовать следующее: есть STL-левская функия sort, вот она за тебя всю работу сортировки сама сделает, ты главное правильно реализуй функцию сравнения, которую нужно передать третьим параметром функцие sort. Это не сложно.

Желаю удачи!
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
25.11.2011, 04:21  [ТС]     Структуры. Сортировка массива структуры #3
Мне бы хотелось так сказать без стандартных функций!

вот сама функция сортировки!

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
double sort(student *gr, int n)
{
        double s;
        double *avg = new double [n];
        
        for(int i = 0; i < n; i++)
        {
                s = 0.;
                for(int j = 0; j < 5; j++)
                {
                        s += gr[i].ses[j];
                        avg[i] = s / 5;
                }
                cout << gr[i].name << " " << avg[i] << "\n";
        }
        cout << endl;
        for (int i = n - 1; i > 0; i--)
        {
                for(int j = 0; j < i; j++)
                {
                        if(avg[j] > avg[j + 1])
                        {
                                student x = gr[j];
                                gr[j] = gr[j + 1];
                                gr[j + 1] = x;
                        }
                }
        }
        delete [] avg;
        return 0;
}
на одномерном массиве она работает на ура!

а вот с массивом структур что то не сильно хочет работать, хочется узнать причину!
dyosick
 Аватар для dyosick
61 / 61 / 6
Регистрация: 25.08.2008
Сообщений: 178
25.11.2011, 13:47     Структуры. Сортировка массива структуры #4
Вроде бы работает, я твой алгоритм закомментил, ниже привел свой.
Причина некорректной работы тут не одна: когда выполняется условие avg[j] > avg[j + 1], то надо менять местами не только элементы массива gr , а и avg. А с другими, чесно гаворя, я не разбирался, склепал свой вариант. Ну, думая, теперь уже сам разберешься

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
double sort(student *gr, int n)
{
        double s;
        double *avg = new double [n];
        
        for(int i = 0; i < n; i++)
        {
                s = 0.;
                for(int j = 0; j < 5; j++)
                {
                        s += gr[i].ses[j];
                        avg[i] = s / 5;
                }
                cout << gr[i].name << " " << avg[i] << "\n";
        }
        cout << endl;
        /*
        for (int i = n - 1; i > 0; i--)
        {
                for(int j = 0; j < i; j++)
                {
                        if(avg[j] > avg[j + 1])
                        {
                                student x = gr[j];
                                gr[j] = gr[j + 1];
                                gr[j + 1] = x;
                        }
                }
        }*/
        
        bool flag = true;
        
        while(flag) {
            flag = false;        
                    
            for(int i = 0; i < n - 1; ++i) {
                if(avg[i] > avg[i + 1]) {
                    student x = gr[i];
                    gr[i] = gr[i + 1];
                    gr[i + 1] = x;
                    
                    double temp = avg[i];
                    avg[i] = avg[i + 1];
                    avg[i + 1] = temp;
                    
                    flag = true;
                }
            }
        }
        
        delete [] avg;
        return 0;
}
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
25.11.2011, 14:55  [ТС]     Структуры. Сортировка массива структуры #5
Спасибо, все четко!)
Yandex
Объявления
25.11.2011, 14:55     Структуры. Сортировка массива структуры
Ответ Создать тему
Опции темы

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