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

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

Восстановить пароль Регистрация
 
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.03.2014, 10:41     Сортировка массива структур через сортировку массива указателей #1
Ошибка возникает в функции 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;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2014, 10:41     Сортировка массива структур через сортировку массива указателей
Посмотрите здесь:

Сортировка массива структур C++
C++ Сортировка массива структур
Сортировка массива структур C++
Сортировка массива структур C++
Написать перебор символов в строке и сортировку массива структур C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
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;
        }
    }
}
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.03.2014, 11:10  [ТС]     Сортировка массива структур через сортировку массива указателей #3
Ilot, это для уже пройденный этап =)) Преподаватель задал задание отсортировать массив структур через сортировку массива адресов, так как это ускоряет работу программы (в Вашем варианте функция будет работать с копией значений, а это более затратно).
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
19.03.2014, 11:19     Сортировка массива структур через сортировку массива указателей #4
Заблуждаетесь. Вы же сами формируете массив объектов, а не массив указателей на объекты. Отсюда вопрос - вы понимаете, что хотите?
В данном случае следует создавать массив указателей на объекты:
C++
1
student ** pStud = new student* [k];
И вот уже их сортировать
Хотя может это я не совсем до конца понимаю ваш код
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.03.2014, 11:27  [ТС]     Сортировка массива структур через сортировку массива указателей #5
Ilot, я понимаю, что нужно, но вот объяснить толком не могу =(

Мне показалось, что Вы поняли, что мне нужно - создать сначала массив указателей, а потом с ними работать. Сейчас попробую. А также Ваше понимание того, что мне нужно в этой программе, скорее всего совпадает с ходом моих мыслей относительно написания сортировки (судя по последнему сообщению).
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
19.03.2014, 11:41     Сортировка массива структур через сортировку массива указателей #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот подправил через указатели. Шибко в коде не разбирался, но надеюсь нигде не приврал:
Кликните здесь для просмотра всего текста
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;
        }
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 11:57     Сортировка массива структур через сортировку массива указателей
Еще ссылки по теме:

C++ Сортировка массива указателей на char
C++ сортировка массива стуктур посредством указателей
C++ Сортировка массива структур через switch по любому полю

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

Или воспользуйтесь поиском по форуму:
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.03.2014, 11:57  [ТС]     Сортировка массива структур через сортировку массива указателей #7
Ilot, спасибо большое =) Всё работает хорошо. И теперь всё происходит через адреса. Круто! Спасибо ещё раз.
Yandex
Объявления
19.03.2014, 11:57     Сортировка массива структур через сортировку массива указателей
Ответ Создать тему
Опции темы

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