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

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

15.04.2018, 17:51. Показов 642. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru