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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
#1

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

19.03.2014, 10:41. Просмотров 1093. Ответов 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;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2014, 10:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка массива структур через сортировку массива указателей (C++):

Сортировка массива структур через switch по любому полю - C++
Столкнулся с проблемой сортировки массива по любому из полей, а точнее не пойму как реализовать эту сортировку для нескольких &quot;жильцов&quot;...

Реализовать сортировку массива структур по заданному полю - C++
Помогите правильно отсортировать структуры по среднему балу и записать их в файл структура: struct student { char name; int...

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

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

Сортировка массива указателей - C++
Всем доброго вечера Столкнулся я с проблемой примерно вот такого: типа у меня есть класс class tourism { friend tourism...

Сортировка динамического массива указателей - C++
Собственно я написал шаблон класса, а там нужно сделать сортировку выбором. Как это сделать с указателями я не знаю. Получилось вот...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 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
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 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
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 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;
        }
    }
}
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.03.2014, 11:57  [ТС] #7
Ilot, спасибо большое =) Всё работает хорошо. И теперь всё происходит через адреса. Круто! Спасибо ещё раз.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 11:57
Привет! Вот еще темы с ответами:

Сортировка массива указателей на char - C++
Есть массив указателей на char-ы. Нужно отсортировать их по алфавиту. Прошу помочь как можно скорее, если это возможно.

Сортировка массива указателей на строки - C++
Приветствую. Есть задание: &quot;Напишите программу, которая вводит строки с клавиатуры с помощью cin&gt;&gt;...в объявленный Вами двухмерный...

сортировка массива стуктур посредством указателей - C++
Доброго времени суток. Есть у меня 1 задачка: пытаюсь её решить: #include&lt;iostream&gt; #include&lt;fstream&gt; using namespace...

Сортировка массива указателей на абстрактный базовый класс - C++
Я создал абстрактный базовый класс (с названием Base) и два производных класса (с названиями Two и Three). После инициализации объектов...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.03.2014, 11:57
Ответ Создать тему
Опции темы

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