Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
11 / 11 / 12
Регистрация: 19.02.2014
Сообщений: 72
1

Сортировка массива структур через сортировку массива указателей

19.03.2014, 10:41. Просмотров 2630. Ответов 6
Метки нет (Все метки)

Ошибка возникает в функции void sort(student **ppStud, int k, char ch). Кто видит ошибку - помогите, пожалуйста.

Код программы:

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <time.h>
#include <memory.h>
#include <memory>
#include <stdlib.h>
#include <iomanip>
using namespace std;
const int ArSize = 10;
const int n = 5;
struct student
{
    char name[ArSize];
    char surname[ArSize];
    int notes[n];
    double average;
};
 
typedef bool (*tFunc1)(double Left, double Right);
typedef bool (*tFunc2)(int Left, int Right);
typedef bool (*tFunc3)(char Left, char Right);
void inite(student * pStud, int k);
void show(student * pStud, int k);
void sort(student **ppStud, int k, char ch);
template <typename temp>
bool Asc(temp Left, temp Right);
template <typename temp>
bool Desc(temp Left, temp Right);
int main()
{   
    cout << "Enter the number of students: ";
    int k;
    while (cin >> k && (k < 1))
        cout << "There is no sence to create the list without\n"
                "even one student. Enter another number: ";
    student * pStud = new student [k];
    inite(pStud, k);
    show(pStud, k);
    cout << "Press 1 in order to sort the students\n"
            "in Ascent, and 2 - in Descent: ";
    char ch;
    while (cin >> ch && ch != '1' && ch != '2')
        cout << "Enter another number: ";
    sort(&pStud, k, ch);
    show(pStud, k);
    delete [] pStud;
}
void inite(student *pStud, int k)
{
    srand(unsigned (time(0)));
    char name_stud[5][25] = {"Ludvig", "Sasha", "Amadei", "Karl", "Salvador"};
    char surname_stud[5][25] = {"Bethoven", "Ten", "Mozart", "Marks", "Dali"};
    for (int i = 0; i < k; ++i)
    {
        strcpy_s(pStud[i].name, name_stud[rand()%5]);
        strcpy_s(pStud[i].surname, surname_stud[rand()%5]);
        for (int j = 0; j < n; ++j)
            pStud[i].notes[j] = rand()%3 + 3;
        int sum = 0;
        for (int j = 0; j < n; ++j)
            sum += pStud[i].notes[j];
        pStud[i].average = (double) sum/n;
    }
}
void show(student *pStud, int k)
{
    cout << endl;
    cout << char (218);
    for (int i = 0; i < 3; ++i)
        cout << char (196);
    cout << char (194);
    for (int i = 0; i < 10; ++i)
        cout << char (196);
    cout << char (194);
    for (int i = 0; i < 9; ++i)
        cout << char (196);
    cout << char (194);
    for (int i = 0; i < 5; ++i)
        cout << char (196) << char (196) << char (194);
    for (int i = 0; i < 12; ++i)
        cout << char (196);
    cout << char (191) << endl;
    cout << char (179) << setw(3) << "Num" << char (179);
    cout << setw(ArSize) << "First name" << char (179);
    cout << setw(ArSize-1) << "Last name" << char (179);
    for (int i = 0; i < n; ++i)
        cout << "#" << i + 1 << char (179);
    cout << "Average mark" << char (179) << endl;
    for (int j = 0; j < k; ++j)
    {
        cout << char (195);
        for (int i = 0; i < 3; ++i)
            cout << char (196);
        cout << char (197);
        for (int i = 0; i < ArSize; ++i)
            cout << char (196);
        cout << char (197);
        for (int i = 0; i < ArSize - 1; ++i)
            cout << char (196);
        cout << char (197);
        for (int i = 0; i < 5; ++i)
            cout << char (196) << char (196) << char (197);
        for (int i = 0; i < 12; ++i)
            cout << char (196);
        cout << char (180) << endl;
        cout << char (179) << setw(3) << j + 1 << char (179);
        cout << setw(ArSize) << pStud[j].name << char (179);
        cout << setw(ArSize-1) << pStud[j].surname << char (179);
        for (int i = 0; i < n; ++i)
            cout << " " << pStud[j].notes[i] << char (179);
        cout << setw(8) << pStud[j].average << setw(5) << char (179);
        cout << endl;
    }
    cout << char (192);
    for (int i = 0; i < 3; ++i)
        cout << char (196);
    cout << char (193);
    for (int i = 0; i < 10; ++i)
        cout << char (196);
    cout << char (193);
    for (int i = 0; i < 9; ++i)
        cout << char (196);
    cout << char (193);
    for (int i = 0; i < 5; ++i)
        cout << char (196) << char (196) << char (193);
    for (int i = 0; i < 12; ++i)
        cout << char (196);
    cout << char (217) << endl << endl;
}
template <typename temp>
bool Asc(temp Left, temp Right)
{
    return Left > Right;
}
template <typename temp>
bool Desc(temp Left, temp Right)
{
    return Left < Right;
}
void sort(student **ppStud, int k, char ch)
{
    tFunc1 pFunc1;
    if (ch == '1')
        pFunc1 = Asc;
    else
        pFunc1 = Desc;
    student *pTemp = new student;
    for (int i = 0; i < k - 1; ++i)
    {
        int f = i + 1;
        for (int j = i + 2; j < k; ++j)
            if (pFunc1(ppStud[f]->average, ppStud[j]->average))
                f = j;
        if (!pFunc1(ppStud[f]->average, ppStud[i]->average))
        {
            pTemp = ppStud[f];
            ppStud[f] = ppStud[i];
            ppStud[i] = pTemp;
        }
    }
    delete pTemp;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2014, 10:41
Ответы с готовыми решениями:

Сортировка массива структур через switch по любому полю
Столкнулся с проблемой сортировки массива по любому из полей, а точнее не пойму как реализовать эту...

Реализовать сортировку массива структур
В общем, есть массив структур(список студентов, их группа и оценки) и нужно реализовать сортировку...

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

Как сделать сортировку этого массива структур?
как сделать сортировку этого массива структур по name, autor и god? struct mas { char name; ...

6
Эксперт С++
1884 / 1232 / 354
Регистрация: 16.05.2013
Сообщений: 3,231
Записей в блоге: 6
19.03.2014, 10:56 2
Что вы над указателями извращаетесь перепишите эту функцию так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void sort(student *ppStud, int k, char ch)
{
    tFunc1 pFunc1;
    if (ch == '1')
        pFunc1 = Asc;
    else
        pFunc1 = Desc;
    student pTemp;
    for (int i = 0; i < k - 1; ++i)
    {
        int f = i + 1;
        for (int j = i + 2; j < k; ++j)
            if (pFunc1(ppStud[f].average, ppStud[j].average))
                f = j;
        if (!pFunc1(ppStud[f].average, ppStud[i].average))
        {
            pTemp = ppStud[f];
            ppStud[f] = ppStud[i];
            ppStud[i] = pTemp;
        }
    }
}
0
11 / 11 / 12
Регистрация: 19.02.2014
Сообщений: 72
19.03.2014, 11:10  [ТС] 3
Ilot, это для уже пройденный этап =)) Преподаватель задал задание отсортировать массив структур через сортировку массива адресов, так как это ускоряет работу программы (в Вашем варианте функция будет работать с копией значений, а это более затратно).
0
Эксперт С++
1884 / 1232 / 354
Регистрация: 16.05.2013
Сообщений: 3,231
Записей в блоге: 6
19.03.2014, 11:19 4
Заблуждаетесь. Вы же сами формируете массив объектов, а не массив указателей на объекты. Отсюда вопрос - вы понимаете, что хотите?
В данном случае следует создавать массив указателей на объекты:
C++
1
student ** pStud = new student* [k];
И вот уже их сортировать
Хотя может это я не совсем до конца понимаю ваш код
0
11 / 11 / 12
Регистрация: 19.02.2014
Сообщений: 72
19.03.2014, 11:27  [ТС] 5
Ilot, я понимаю, что нужно, но вот объяснить толком не могу =(

Мне показалось, что Вы поняли, что мне нужно - создать сначала массив указателей, а потом с ними работать. Сейчас попробую. А также Ваше понимание того, что мне нужно в этой программе, скорее всего совпадает с ходом моих мыслей относительно написания сортировки (судя по последнему сообщению).
0
Эксперт С++
1884 / 1232 / 354
Регистрация: 16.05.2013
Сообщений: 3,231
Записей в блоге: 6
19.03.2014, 11:41 6
Лучший ответ Сообщение было отмечено montkay как решение

Решение

Вот подправил через указатели. Шибко в коде не разбирался, но надеюсь нигде не приврал:
Кликните здесь для просмотра всего текста
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include <iostream>
#include <string.h>
#include <time.h>
#include <memory.h>
#include <memory>
#include <stdlib.h>
#include <iomanip>
using namespace std;
const int ArSize = 10;
const int n = 5;
struct student
{
    char name[ArSize];
    char surname[ArSize];
    int notes[n];
    double average;
};
 
typedef bool (*tFunc1)(double Left, double Right);
typedef bool (*tFunc2)(int Left, int Right);
typedef bool (*tFunc3)(char Left, char Right);
void inite(student ** pStud, int k);
void show(student ** pStud, int k);
void sort(student **ppStud, int k, char ch);
template <typename temp>
bool Asc(temp Left, temp Right);
template <typename temp>
bool Desc(temp Left, temp Right);
int main()
{
    cout << "Enter the number of students: ";
    int k;
    while (cin >> k && (k < 1))
        cout << "There is no sence to create the list without\n"
                "even one student. Enter another number: ";
    student ** pStud = new student* [k];
    for(int i = 0; i < k; ++i)
        pStud[i] = new student;
    inite(pStud, k);
    show(pStud, k);
    cout << "Press 1 in order to sort the students\n"
            "in Ascent, and 2 - in Descent: ";
    char ch;
    while (cin >> ch && ch != '1' && ch != '2')
        cout << "Enter another number: ";
    sort(pStud, k, ch);
    show(pStud, k);
    for(int i = 0; i < k; ++i)
        delete pStud[i];
    delete [] pStud;
}
void inite(student **pStud, int k)
{
    srand(unsigned (time(0)));
    char name_stud[5][25] = {"Ludvig", "Sasha", "Amadei", "Karl", "Salvador"};
    char surname_stud[5][25] = {"Bethoven", "Ten", "Mozart", "Marks", "Dali"};
    for (int i = 0; i < k; ++i)
    {
 
        strcpy(pStud[i]->name, name_stud[rand()%5]);
        strcpy(pStud[i]->surname, surname_stud[rand()%5]);
        for (int j = 0; j < n; ++j)
            pStud[i]->notes[j] = rand()%3 + 3;
        int sum = 0;
        for (int j = 0; j < n; ++j)
            sum += pStud[i]->notes[j];
        pStud[i]->average = (double) sum/n;
    }
}
void show(student **pStud, int k)
{
    cout << endl;
    cout << char (218);
    for (int i = 0; i < 3; ++i)
        cout << char (196);
    cout << char (194);
    for (int i = 0; i < 10; ++i)
        cout << char (196);
    cout << char (194);
    for (int i = 0; i < 9; ++i)
        cout << char (196);
    cout << char (194);
    for (int i = 0; i < 5; ++i)
        cout << char (196) << char (196) << char (194);
    for (int i = 0; i < 12; ++i)
        cout << char (196);
    cout << char (191) << endl;
    cout << char (179) << setw(3) << "Num" << char (179);
    cout << setw(ArSize) << "First name" << char (179);
    cout << setw(ArSize-1) << "Last name" << char (179);
    for (int i = 0; i < n; ++i)
        cout << "#" << i + 1 << char (179);
    cout << "Average mark" << char (179) << endl;
    for (int j = 0; j < k; ++j)
    {
        cout << char (195);
        for (int i = 0; i < 3; ++i)
            cout << char (196);
        cout << char (197);
        for (int i = 0; i < ArSize; ++i)
            cout << char (196);
        cout << char (197);
        for (int i = 0; i < ArSize - 1; ++i)
            cout << char (196);
        cout << char (197);
        for (int i = 0; i < 5; ++i)
            cout << char (196) << char (196) << char (197);
        for (int i = 0; i < 12; ++i)
            cout << char (196);
        cout << char (180) << endl;
        cout << char (179) << setw(3) << j + 1 << char (179);
        cout << setw(ArSize) << pStud[j]->name << char (179);
        cout << setw(ArSize-1) << pStud[j]->surname << char (179);
        for (int i = 0; i < n; ++i)
            cout << " " << pStud[j]->notes[i] << char (179);
        cout << setw(8) << pStud[j]->average << setw(5) << char (179);
        cout << endl;
    }
    cout << char (192);
    for (int i = 0; i < 3; ++i)
        cout << char (196);
    cout << char (193);
    for (int i = 0; i < 10; ++i)
        cout << char (196);
    cout << char (193);
    for (int i = 0; i < 9; ++i)
        cout << char (196);
    cout << char (193);
    for (int i = 0; i < 5; ++i)
        cout << char (196) << char (196) << char (193);
    for (int i = 0; i < 12; ++i)
        cout << char (196);
    cout << char (217) << endl << endl;
}
template <typename temp>
bool Asc(temp Left, temp Right)
{
    return Left > Right;
}
template <typename temp>
bool Desc(temp Left, temp Right)
{
    return Left < Right;
}
void sort(student **ppStud, int k, char ch)
{
    tFunc1 pFunc1;
    if (ch == '1')
        pFunc1 = Asc;
    else
        pFunc1 = Desc;
 
    for (int i = 0; i < k - 1; ++i)
    {
        int f = i + 1;
        for (int j = i + 2; j < k; ++j)
            if (pFunc1(ppStud[f]->average, ppStud[j]->average))
                f = j;
        if (!pFunc1(ppStud[f]->average, ppStud[i]->average))
        {
            student* pTemp = ppStud[f];
            ppStud[f] = ppStud[i];
            ppStud[i] = pTemp;
        }
    }
}
1
11 / 11 / 12
Регистрация: 19.02.2014
Сообщений: 72
19.03.2014, 11:57  [ТС] 7
Ilot, спасибо большое =) Всё работает хорошо. И теперь всё происходит через адреса. Круто! Спасибо ещё раз.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2014, 11:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Реализовать сортировку массива структур по заданному полю
Помогите правильно отсортировать структуры по среднему балу и записать их в файл структура:...

Связка массива структур с классом без применения указателей
У меня такая задача по учебе: Написать программу с использованием объектно-ориентированных...

Написать перебор символов в строке и сортировку массива структур
Задание: заполнить массив структур (по сути - таблицу) из файла или с клавиатуры и отсортировать (в...

Можно ли элементам массива указателей на void присваивать адреса структур
Здравствуйте, возникла проблема - создал структуру, одним из полей которой является массив...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.