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

Упорядочить массив структур

13.01.2015, 09:29. Показов 1777. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть массив Train Rasp[] в нём инициализированы ячейки такого типа Rasp[j].time и Rasp[j].timenaz и другие одни имеют тип данных char другие int как отсортировать такой массив? использую метод пузырька, но что-то ругается на тип переменной


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//упорядочивание элементов в массиве по возрастанию их значений
for (int js=1; js<str-1; js++)
 
for (int is=0; is<(str-1)-js; is++)
 
if (Rasp[is].time>Rasp[is+1].time){ //если текущий элемент больше следущего, то
 
// зададим переменные для временного хранения
    char a; // в какой тип ? 
 
a = Rasp[is]; //сохранить значение текущего элемента;
 
 
Rasp[is].numr = Rasp[is+1].numr; //заменить текущий элемент следующим;
 
 
Rasp[is+1].numr = a; //заменить следующий элемет текущим.
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2015, 09:29
Ответы с готовыми решениями:

Создать массив структур, заполнив его информацией из файла “input.txt”. Упорядочить этот массив по убыванию суммы баллов
В файле “input.txt” задано количество студентов механикоматематического факультета ННГУ и их...

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

Структуры.Обработка массивов структур.Создать массив структур из 10-ти элементов
Создать массив структур из 10-ти элементов: &lt;Номер договора&gt;&lt;Фамилия клиента&gt;&lt;стоимость...

Блочная сортировка структур (Отсортировать массив структур по фамилии)
Подскажите алгоритм блочной сортировки структур на языке С++. Мне нужно отсортировать массив...

12
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,698
13.01.2015, 10:33 2
Если в структуре нет указателей, то присвоение можно использовать (RASPIS имя структуры):
C++
1
2
3
RASPIS a=Rasp[is];
Rasp[is].numr = Rasp[is+1].numr;
Rasp[is+1].numr = a;
Но если там указатели, и память выделялась динамически, то так делать нельзя.
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 23
13.01.2015, 13:23  [ТС] 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
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
#include <iostream> // для ввода/вывода
#include <math.h> // для работы с математическими функциями
#include <ctime> // для работы с временем
#include <conio.h> //
#include <iomanip>
#include <cstring>
 
using namespace std;
 
 
// структура расписания
    struct Train{
 
// типы данных в структуре - стобцы
    char numr[5]; // номер поезда +, (количество символов в строке + 1 - нулевой)
    char otpr[20]; // пункт отправления
    char nazn[20]; // пункт прибытия +
    int time; // время отправления +
    int timetravel; // время в пути
    int timenaz; // время прибытия
 
};
 
 
// функция ввод данных в массив +
    void insert_to_train(Train *st){
 
    cout << "# "; // номер поезда
    cin >> st->numr;
    
    cout << "п. отп. "; // пункт отправления
    cin >> st->otpr;
 
    cout << "п. при. "; // пункт прибытия
    cin >> st->nazn;
 
    cout << "вр. отп. "; // время отправления
    cin >> st->time;
 
    cout << "вр. в пути "; // время в пути
    cin >> st->timetravel;
 
    cout << "вр. при. "; // время прибытия
    cin >> st->timenaz;
 
    cout << endl; // новая строка
 
}
 
 
// функция сортировки +, по времени отправления
    void sort_train(Train *st,const int str){
 
 
Train *Rasp[str];
 
// зададим переменные для временного хранения
Train buf;
 
//упорядочивание элементов в массиве по возрастанию их значений
for (int js=1; js<str-1; js++)
 
for (int is=0; is<(str-1)-js; is++)
 
if (strcmp(Rasp[is].time, Rasp[is+1].time) > 0){ //если текущий элемент больше следущего, то
 
Train buf = Rasp[is]; //сохранить текущую строку;
 
Rasp[is] = Rasp[is+1]; //заменить текущую строку;
 
Rasp[is+1] = buf; //заменить следующий элемент текущей строкой.
 
}
 
}
 
 
    int j = 0; // для определения количества совпадений
 
// функция вывода подходящего +
    void display_train(Train *st, char find[20]){//
 
// проверяем условие
    if(strcmp(st->nazn, find) == 0){
 
    cout << st->numr << " | " << st->otpr << " | " << st->nazn << " | " << st->time << " | " << st->timetravel << " | " << st->timenaz << endl;
 
}
    else{
 
    j++;
 
}
 
}
 
 
 
int main(){// реализация 
    setlocale(LC_ALL, "Russian");
 
 
    const int str = 2; // - строк в массиве
 
    Train Rasp[str]; // создаём массив, строки расписания
 
// - - - - - - - - 
 
// заполнение массива
for(int i = 0; i <= str-1; i++){
 
    cout << i+1 << " Поезд: ";
    insert_to_train(&Rasp[i]);
 
}
// - - - - - - - - 
 
 
 
 
// - - - - - - - - 
    sort_train(&Rasp[str], str); // вызов сортировки
// - - - - - - - - 
 
 
// - - - - - - - - 
// вывод расписания
 
// ввести пункт назначения
    cout << "Пункт прибытия?";
    char find_in[20]; // переменная для пункта прибытия
    cin >> find_in; // ввод пункта
 
// - - - - 
    cout << "\n \n Расписание поездов" << endl;
    cout << " № | п. отп.| п. при.| вр. отп.| вр. в пути| вр. при." << endl;
 
// перебор пассива
    for(int i = 0; i <= str-1; i++){
 
    display_train(&Rasp[i], find_in);
 
}
    if(str == j){
    
    cout << "Поезд не найден!" << endl;
    
    }
 
// - - - - - - - -  
 
system("pause");
}
Добавлено через 1 час 7 минут
я только изучаю с++ поэтому многова не понимаю
0
26 / 26 / 18
Регистрация: 16.01.2014
Сообщений: 161
13.01.2015, 19:48 4
Я так понял, что сортировка должна идти по переменной time.
Тогда никаких проблем. Сравнивайте по переменной time, а меняйте местами сразу элементы структуры.
То есть смена будет проходить следующим образом
C++
1
2
3
Train a = Rasp[i];
Rasp[i] = Rasp[i+1];
Rasp[i+1] = a;
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 23
13.01.2015, 20:11  [ТС] 5
ага хорошо, но как передать массив? я подписал где ругается

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// функция сортировки +, по времени отправления, метод пузырька в порядке убывания
    void sort_train(Train *st,const int str){
 
 
Train Rasp[str];  ___> ругается
 
//упорядочивание элементов в массиве по возрастанию их значений
for (int js=1; js<str-1; js++)
 
for (int is=0; is<(str-1)-js; is++)
 
if (strcmp(Rasp[is].time, Rasp[is+1].time) > 0){ //если текущий элемент больше следущего, то
 
// зададим переменную для временного хранения
    Train buf = Rasp[is]; //сохранить текущую строку;
 
    Rasp[is] = Rasp[is+1]; //заменить текущую строку;
 
    Rasp[is+1] = buf; //заменить следующий элемент текущей строкой.
 
}
 
}


C++
1
    sort_train(&Rasp[str], str); // вызов сортировки, ___> правильно ли я вызываю
0
26 / 26 / 18
Регистрация: 16.01.2014
Сообщений: 161
13.01.2015, 20:28 6
C++
1
2
3
4
5
6
7
8
9
10
11
void sort_train(Train Rasp, const int str) {
    Train buf = NULL;
    for (int js=0; js<str-1; js++) {
        for (int is = 0; is < (str - 1) - js; is++)
            if (Rasp[is].time > Rasp[is + 1].time) {
                buf = Rasp[is];
                Rasp[is] = Rasp[is + 1];
                Rasp[is + 1] = buf;
            }
    }
}
Я не стал проверять ваш метод сортировки. Будем надеяться, что он правильный.

Добавлено через 1 минуту
C++
1
sort_train(Rasp, str);
Вот правильный вызов.
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 23
13.01.2015, 21:16  [ТС] 7
нет не получается

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
#include <iostream> // для ввода/вывода
#include <math.h> // для работы с математическими функциями
#include <ctime> // для работы с временем
#include <conio.h> //
#include <iomanip>
#include <cstring>
 
using namespace std;
 
 
// структура расписания
    struct Train{
 
// типы данных в структуре - стобцы
    char numr[5]; // номер поезда +, (количество символов в строке + 1 - нулевой)
    char otpr[20]; // пункт отправления
    char nazn[20]; // пункт прибытия +
    int time; // время отправления +
    int timetravel; // время в пути
    int timenaz; // время прибытия
 
};
 
 
// функция ввод данных в массив +
    void insert_to_train(Train *st){
 
    cout << "# "; // номер поезда
    cin >> st->numr;
    
    cout << "п. отп. "; // пункт отправления
    cin >> st->otpr;
 
    cout << "п. при. "; // пункт прибытия
    cin >> st->nazn;
 
    cout << "вр. отп. "; // время отправления
    cin >> st->time;
 
    cout << "вр. в пути "; // время в пути
    cin >> st->timetravel;
 
    cout << "вр. при. "; // время прибытия
    cin >> st->timenaz;
 
    cout << endl; // новая строка
 
}
 
 
// функция сортировки +, по времени отправления, метод пузырька в порядке убывания
    void sort_train(Train Rasp,const int str){
 
Train buf = NULL;
 
//упорядочивание элементов метод "пузырька"
    for (int js=1; js<str-1; js++)
 
        for (int is=0; is<(str-1)-js; is++)
 
            if (strcmp(Rasp[is].time, Rasp[is+1].time) > 0){ //если текущий элемент больше следущего, то
 
// зададим переменную для временного хранения
                buf = Rasp[is]; //сохранить текущую строку;
 
                Rasp[is] = Rasp[is+1]; //заменить текущую строку;
 
                Rasp[is+1] = buf; //заменить следующий элемент текущей строкой.
 
            }
 
}
 
 
    int j = 0; // для определения количества совпадений
 
// функция вывода подходящего +
    void display_train(Train *st, char find[20]){//
 
// проверяем условие
    if(strcmp(st->nazn, find) == 0){
 
    cout << st->numr << " | " << st->otpr << " | " << st->nazn << " | " << st->time << " | " << st->timetravel << " | " << st->timenaz << endl;
 
}
    else{
 
    j++;
 
}
 
}
 
 
 
int main(){// реализация 
    setlocale(LC_ALL, "Russian");
 
 
    const int str = 2; // - строк в массиве
 
    Train Rasp[str]; // создаём массив, строки расписания
 
// - - - - - - - - 
 
// заполнение массива
for(int i = 0; i <= str-1; i++){
 
    cout << i+1 << " Поезд: ";
    insert_to_train(&Rasp[i]);
 
}
// - - - - - - - - 
 
// - - - - - - - - 
    sort_train(Rasp, str);  // вызов сортировки
// - - - - - - - - 
 
// - - - - - - - - 
// вывод расписания
 
// ввести пункт назначения
    cout << "Пункт прибытия?";
    char find_in[20]; // переменная для пункта прибытия
    cin >> find_in; // ввод пункта
 
// - - - - 
    cout << "\n \n Расписание поездов" << endl;
    cout << " № | п. отп.| п. при.| вр. отп.| вр. в пути| вр. при." << endl;
 
// перебор пассива
    for(int i = 0; i <= str-1; i++){
 
    display_train(&Rasp[i], find_in);
 
}
    if(str == j){
    
    cout << "Поезд не найден!" << endl;
    
    }
 
// - - - - - - - -  
 
system("pause");
}
0
26 / 26 / 18
Регистрация: 16.01.2014
Сообщений: 161
13.01.2015, 21:27 8
Вы сравниваете методом strcmp, а надо использовать обычное сравнение int-ов.
Да, и я немного подзабыл сам C++. Наверное, все же, правильно будет вызов осуществлять через функцию, т.е. так
C++
1
sort_train(&Rasp, str);
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 23
13.01.2015, 21:44  [ТС] 9
нет, как-то, по другому читаю но пока не нахожу
0
26 / 26 / 18
Регистрация: 16.01.2014
Сообщений: 161
13.01.2015, 22:00 10
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
#include <iostream> // для ввода/вывода
#include <math.h> // для работы с математическими функциями
#include <ctime> // для работы с временем
#include <iomanip>
#include <cstring>
 
using namespace std;
 
struct Train{
    char numr[5];
    char otpr[20];
    char nazn[20];
    int time;
    int timetravel;
    int timenaz;
};
 
void insert_to_train(Train *st){
 
    cout << "# ";
    cin >> st->numr;
 
    cout << "п. отп. ";
    cin >> st->otpr;
 
    cout << "п. при. ";
    cin >> st->nazn;
 
    cout << "вр. отп. ";
    cin >> st->time;
 
    cout << "вр. в пути ";
    cin >> st->timetravel;
 
    cout << "вр. при. ";
    cin >> st->timenaz;
 
    cout << endl;
 
}
 
void sort_train(Train *Rasp, int str) {
    Train buf;
    for (int js = 0; js < str - 1; js++) {
        for (int is = 0; is < (str - 1) - js; is++)
            if (Rasp[is].time > Rasp[is + 1].time) {
                buf = Rasp[is];
                Rasp[is] = Rasp[is + 1];
                Rasp[is + 1] = buf;
            }
    }
}
 
void display_train(Train *st, char *find){//
    if(strcmp(st->nazn, find) == 0){
        cout << st->numr << " | " << st->otpr << " | " << st->nazn << " | " << st->time << " | " << st->timetravel << " | " << st->timenaz << endl;
    }
}
 
 
 
int main() {
    setlocale(LC_ALL, "Russian");
    int str = 2;
    Train Rasp[str];
    for(int i = 0; i < str; i++){
        cout << i+1 << " Поезд: ";
        insert_to_train(&Rasp[i]);
    }
 
    sort_train(Rasp, str);
 
    cout << "Пункт прибытия?";
    char find_in[20];
    cin >> find_in;
 
    cout << "\n \n Расписание поездов" << endl;
    cout << " № | п. отп.| п. при.| вр. отп.| вр. в пути| вр. при." << endl;
 
    for(int i = 0; i < str; i++){
        display_train(&Rasp[i], find_in);
    }
}
0
1 / 1 / 3
Регистрация: 12.01.2015
Сообщений: 10
13.01.2015, 22:08 11
Если здесь ругается:
C#
1
2
int str = 2;
 Train Rasp[str];
Попробуйте сделать так:
C#
1
2
const int str = 2;
 Train Rasp[str];
0
26 / 26 / 18
Регистрация: 16.01.2014
Сообщений: 161
13.01.2015, 22:20 12
DiSharky, у меня на gcc 4.8.2 все запустилось, вроде.

А вот и работа программы.
Миниатюры
Упорядочить массив структур  
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 23
14.01.2015, 13:14  [ТС] 13
странно у меня в Visual Studio 10.0 так и не стартонула

Добавлено через 12 часов 45 минут
УРА! всё заработало спасибо всем!!!
0
14.01.2015, 13:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2015, 13:14
Помогаю со студенческими работами здесь

Массив структур, сохранение начала каждой из структур
Я создал такую структуру class Lancuch { public: char cos; Lancuch * nastepny; }; Lancuch...

Динамический массив структур в другом массиве структур
Можно ли реализовать динамический (или статический) массив структур в другом массиве структур?...

Упорядочить записи структур по 3 первым цифрам телефона
В коде объявлен массив структур и записан в файл. Осталось упорядочить их но у меня просто не...

Как объявить динамический массив структур, и как выглядит обращение к полям структур по указателю?
Ребята подскажите как объявить динамический массив структур, и как выглядит обращение к полям...

Массив структур в массиве структур
Всем добрый день. Делаю менюшку для управления и терзаю Arduino IDE слегка подвис со следующей...

Упорядочить массив структур по дате рождения
нужно упорядочить массив по дате рождения, но выходит ошибка(( struct ZNAK { ...


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

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

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