Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 4

Сортировка массива структуры

15.04.2018, 17:51. Показов 626. Ответов 1

Студворк — интернет-сервис помощи студентам
У меня есть структура

C++
1
2
3
4
5
6
struct AirData {
    string marka_LA;
    string bortovoyNomer;
    int nomerReica;
    char vremayPosadki[6];
};
Так же текстовый файл из которого я запалняю эту структуру , который имеет вид:

марка б.номер номер рейса время посадки
ТУ-154 Б-373 1763 23:35
ВВ-213 В-132 393 23:38
ВВ-123 в-213 3422 -09:32
Дд-231 ы-123 2321 -12:23
Rw-123 as-12 2321 32:23
функция сортировки :

C++
1
2
3
4
5
6
void swap_base(AirData &t1, AirData &t2) {   // функция для сотировки
    AirData tmp;
    tmp = t2;
    t2 = t1;
    t1 = tmp;
}




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
int main() {
    int N = 0; // количество строк
    string line;
    fstream file;
    file.open(fileName);
 
    // считываем кол-во строк
    if (file.is_open()){
        while (getline(file, line)) {
            N++;
        }
    }
    file.close();
    AirData base[N]; // Массив структуры данных
 
    file.open(fileName);
    if (file.is_open()){
        while (!file.eof()) {
            getline(file, line, ch);
            for (int j = 0; j < N; j++){
                for (int i = 0; i < 4; i++){
                    if (i == 0) {
                        file >> base[j].marka_LA;
 
                    }
                    if (i == 1) {
                        file >> base[j].bortovoyNomer;
                    }
                    if (i == 2) {
                        file >> base[j].nomerReica;
                    }
                    if (i == 3) {
                        file >> base[j].vremayPosadki;
                    }
 
                }
            }
 
        }
я заполняю массив струтуры, а дальше мне нужно отсортировать и вывести на экран по такому правилу: если время посадки >= 0, то сортировать по этому времени, если же < 0 , то сортировать по номеру рейса. не получается правильно оформить обработку

C++
1
2
3
4
5
6
7
8
for (int i = 0; i < N; i++) {
    for(int j = i + 1; j < N; j++) {
        for(int v = 0; v < 6; v++){
            if (base[i].vremayPosadki[v] >= base[j].vremayPosadki[v])
                swap_base(base[i], base[j]);
        }
    }
}
// Если самолет в воздухе ( время меньше 0)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (int k = 0; k < N; k++){
 
    if (base[k].vremayPosadki[0] == '-'){ // если время <0 то производим сортиоровку по номеру рейса хорошо)
        for (int i = k; i < N; i++) {
            for(int j = i + 1; j < N; j++) {
                if (base[i].nomerReica > base[j].nomerReica)
                    swap_base(base[i], base[j]);
            }
        }
 
    }
}
 
    for( int i=0; i< N;i++) {
        cout <<"marka_LA: "<< base[i].marka_LA <<" bortovoyNomer: "<<base[i].bortovoyNomer<<" nomerReica: "<<base[i].nomerReica<<" vremayPosadki: "<<base[i].vremayPosadki<<endl;
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2018, 17:51
Ответы с готовыми решениями:

Структуры. Сортировка массива структуры
Здравствуйте! В чем моя ошибка?? Нужно отсортировать массив структуры по возрастанию среднего балла?? Делаю это с помощью...

Сортировка массива структуры train
Здравствуйте. Имеется структура Train, собственно в ней нужна сортировка, так-то она присутствует, но не выполняется. Подскажите...

сортировка массива структуры
задание собственно =) азработка консольного приложения на языках C++ и C# Разработать консольное приложение в средах Borland...

1
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
15.04.2018, 19:32
вот-с. Решил, что лучше переписать твою программу вот так:
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
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <vector>
#include <Windows.h>
using namespace std;
 
int end()//функция окончания работы программы, ждет нажатия клавиши перед тем как закрыть консоль
{
    cout << endl << "END" << endl;
    _getch();
    return 0;
}
 
struct AirData//структура данных
{
    string mark_AC, tail_num, time;
    int flight_num;
};
 
template <class T>
void VectorOut(vector<T>& base)//вывод содержимого вектора
{
    for(int i = 0; i < base.size(); i++)
        cout << base[i] << endl;
}
 
ostream& operator<<(ostream& out, AirData& ad)//перегрузка оператора << для удобного вывода данных о структуре
{
    out << "Mark:          " << ad.mark_AC << endl
        << "Tail Number:   " << ad.tail_num << endl
        << "Flight Number: " << ad.flight_num << endl
        << "Landing time:  " << ad.time << endl;
    return out;
}
 
void inputData(ifstream& input, vector<AirData>& DATA)//ввод данных из файла
{
    char temp;
    int w; //счетчик поля данных (марка, бортовой номер и т.д.)
    while(input) //пока данные в файле не закончатся 
    {
        w = 0; //новая строчка => новые данные
        DATA.push_back(AirData()); //добавляем новый элемент в конец вектора
        while((temp = input.get()) != '\n' && input) //считываем символ, записывем его в temp, так же проверяем чтобы это не был
        {                                            //переход на новую строку + не забываем о том, что файл может кончится
            if(temp == ' ' || !w) //если новое поле данных
            {
                switch(w) //определяем что это
                {
                    case 0:
                        input >> DATA.back().mark_AC;
                        break;
                    case 1:
                        input >> DATA.back().tail_num;
                        break;
                    case 2:
                        input >> DATA.back().flight_num;
                        break;
                    case 3:
                        input >> DATA.back().time;
                        break;
                }
                w++; //инкрементируем счетчик поля данных
            }
        }
    }
}
 
int time_to_min(string time)//перевод строку со временем в целочисленный вид
{
    int r = 0, temp = 0;
    for(int i = 0; i < time.size(); i++)
    {
        if(time[i] >= '0' && time[i] <= '9') //если это цифры
        {
            temp = temp * 10 + time[i] - 48; 
        }
        else if(time[i] == ':') //если с часов перешли на минуты
        {
            r = temp * 60; //переводим часы в минуты
            temp = 0; //обнуляем временную переменную
        }
    }
    r += temp; //добавляем минуты
    return r;
}
 
int main()
{
    SetConsoleCP(1251); //изменям кодировку в консоли чтобы она понимала русские буквы
    SetConsoleOutputCP(1251);
 
    ifstream fin; //объект файлового ввода
    fin.open("test.txt");
    if(!fin.is_open()) //если файл не открылся
    {
        cout << "Can't open the file!";
        return end();
    }
    vector<AirData> base; //создаем вектор для данных. Вектор удобен + не надо считать сколько у нас рейсов.
    inputData(fin, base); //вводим данные 
    fin.close(); //закрываем файл, он больше не нужен
 
    bool out = false; //флажок для сортировки пузырьком чтобы не идти дальше по массиву и не тратить время
    for(int i = 0; i < base.size(); i++)//обычная сортировка пузырьком, переносим рейсы, которые ещё в воздухе, вверх
    {
        out = false;
        for(int j = i; j < base.size() && !out; j++) 
            if(base[i].time[0] != '-' && base[j].time[0] == '-')
            {
                swap(base[i], base[j]);
                out = true;
            }
    }
 
    int in_flight = 0; //счетчик самолетов, которые ещё летят
    for(int i = 0; i < base.size(); i++) //считаем количество летящих самолетов
        if(base[i].time[0] == '-')
            in_flight++;
 
    for(int i = 0; i < in_flight; i++) //сортируем пузырьком рейсы, которые ещё летят по критерию номера
    {
        out = false;
        for(int j = 0; j < in_flight && !out; j++)
            if(base[i].flight_num > base[j].flight_num)
            {
                swap(base[i], base[j]);
                out = true;
            }
    }
 
    int temp; //временная переменная чтобы постоянно не обращаться к функ. time_to_min с одинаковым запросом
    for(int i = in_flight; i < base.size(); i++) //сортировка пузырьком прилетевших самолетев по критерию времени
    {
        out = false;
        temp = time_to_min(base[i].time);
        for(int j = 0; j < base.size() && !out; j++)
            if(temp < time_to_min(base[j].time)) //переводим строку в минуты и сравнимаем уже целые значения. Можно, конечно, все решить иначе, но мне лень
            {
                swap(base[i], base[j]);
                out = true;
            }
    }
 
    VectorOut(base); //выводим отсортированный вектор
 
    return end();
}
Спрашивай, если что-то непонятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2018, 19:32
Помогаю со студенческими работами здесь

Сортировка массива, с элементами структуры
Есть структура Structure в программе создаем массив из элементов типа Structure. Необходимо сделать сортировку по какому либо признаку...

Сортировка структуры
Не могу придумать алгоритм сортировки структуры, пока все что получилось это найти наибольшее значение. //Макросы #define FILE_PATH ...

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

Структуры. Сортировка
Всем привет! Подскажите пожалуйста, если я создал структуру с тремя компонентами: &lt;имя&gt;,&lt;возраст&gt;,&lt;пол&gt; и я хочу...

сортировка структуры.
Возникла проблема при сортировке. возможно в коде есть и моя ошибка. ну суть в том, что он не работает. нужно отсортировать названия...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru