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

C++ сортировка структуры по возрастанию времени - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
TOSHH
Сообщений: n/a
15.05.2009, 19:07     C++ сортировка структуры по возрастанию времени #1
ребят,такое задание было у меня в Pascal,в С++ возникли проблемы с ним,не могу провести сортировку(хотя бы любым способом),помогите пожалуйста,ввод я обеспечил,а дальше никак((

В процессе функционирования АСУ ВД в файле фиксируются данные о самолетах, выполняющих полет в зоне действия АСУ. Каждая запись имеет структуру типа:

11:15 ТУ-154М Б-3726 Ташкент
время посадки Марка ЛА бортовой т
номер


1) подготовить программу, сортирующую записи с использованием индексной сортировки линейным методом в порядке возрастания времени посадки; результаты печатать в виде таблицы;
2) обеспечить входной контроль времени посадки, уникальности бортового номера и и пункта отправления, выполнить отладку и тестирование.

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
/*******************************************************************************
 *                              С  +  +                                        *
 *-----------------------------------------------------------------------------*
 * Project Type  : Win32 Console Application                                   *
 * Project Name  : 11111                                                       *
 * File Name     : main.CPP                                                    *
 * Programmer(s) :                                                 *
 * Modifyed By   :                                                             *
 * Created       : 29/04/09                                                    *
 * Last Revision : 6/05/09                                                     *
 * Comment(s)    : СТРУКТУРЫ, МАССИВ СТРУКТУР, УКЗАТЕЛЬ НА СТРУКТУРУ           *
 *                 ПЕРЕДАЧА МАССИВА СТРУКТУР В ФУНКЦИЮ                         *
 *                 ЧТЕНИЕ МАССИВА СТРУКТУР ИЗ ФАЙЛА                            *
 *                 ЗАПИСЬ МАССИВА СТРУКТУР В ФАЙЛ                              *
 *                 ВСЕ ФАЙЛЫ ТЕКСТОВЫЕ                                         *
 *                                                                             *
 *******************************************************************************/
#include <iostream>
 
using namespace std;
// читаем данные с файла
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
 
 
 
struct Airplane
{
   char vremy[10];    //время
   char marka[40];    //марка
   char bort_num[10]; //бортовой номер
   char punkt[20];    //пункт отправления
};
 
 
//ПРОТОТИПЫ ФУНКЦИЙ
//void PrintStud (Airplane *pSt, int QStud); //печать структуры
 
 
 
 
// Главная функция прорграммы
 
void main()
{
 
 
 
//===============================================================
//чтение массива стуктур из файла
//образец файла исходных данных STUD1.TXT
 
//данные идут с 1-й позиции
 
    const M_MAX = 10;
 
    const char fNAME[]="STUD1.TXT";
    const char fNAME_Out[]="RES1.dat";
 
 
     FILE *fp=NULL;            // объявим указатель на входной файл
     FILE *fp_out=NULL;        // объявим указатель на выходной файл
 
     int NRec;                 //число записей
     int i,k,j;
     
    
    Airplane AGroup[M_MAX], ASt;
    
     fp = fopen (fNAME,"rt");          //открытие входного файла
     if (fp == NULL)
     {
       fprintf(stderr,"\a\n\tCannot open file %s ! \n\n", fNAME);
 //      return 1;
    }
//-----------------------------------------------
    i=0;
printf ("\n\t AIRPLANE LIST \n");
     cout<<endl;
 cout<<" _____________________________________ "<<endl;
     cout<<"| Vremy |  Marka  |  Bort  |   Punkt  |"<<endl;
     cout<<"|_______|_________|________|__________|"<<endl;
     while ((!feof(fp)) && (i < M_MAX))
     {
 
    
        
//чтение в массив        
 
         fscanf (fp," %s %s %s %s ",  AGroup[i].vremy,AGroup[i].marka, AGroup[i].bort_num, AGroup[i].punkt); //&AGroup[i].name -работает
 
    
     
         printf ("%s %s %s %s %s %s %s %s     \n","|",AGroup[i].vremy,"|",AGroup[i].marka,"|",AGroup[i].bort_num,"|", AGroup[i].punkt);
        
         cout<<"|_______|_________|________|__________|"<<endl;
         i++;
         k=i;  
     }
   NRec = i;//  i - 1; //без проверки !!!
 
   fclose(fp);
 
 
 
 
 
 
//----------------------------------------------------------------
запись результатов в файл
 
     if ((fp_out = fopen (fNAME_Out,"wt")) == NULL)
     {
      fprintf(stderr,"\a\n\tCannot open file %s ! \n\n", fNAME_Out);
     return 1;
    }
 
    пишем группу самолетов в файл
     for (i=0; i<NRec; i++)
     {
          fprintf (fp_out, "  %s %s %s %s \n", AGroup[i].vremy 
                                                     , AGroup[i].marka
                                                     , AGroup[i].bort_num
                                                     , AGroup[i].punkt);  //форматная запись в файл
     }//for i
    
     fclose(fp_out);   // закрываем выходной файл
 
    
 
 
}//main()
Эта программа в Pascal
Pascal
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
program zapisy;
uses crt;
const
 maxn=20;         {максимальное число записей}
 fname='zap.txt'; {имя файла}
type
 zap=record   {запись zap}
     time:string[5];  {поле записи - time }
     marka:string[8]; {поле записи-marka}
     bort:string[7];  {поле записи-bort}
     punkt_otpravlenya:string[15]; {поле записи- punkt_otpravlenya}
 
     end;
 vec_mas=array[1..maxn] of zap;      {массив записей}
 vec_ind=array[1..maxn] of integer;  {массив индексов}
 vec_key=array[1..maxn] of string;   {массив ключей}
 
 sort_vec=record  {запись sort_vec}
  ind:vec_ind;
  key:vec_key;
  end;
 
 
procedure read_zap(var xmas:vec_mas;var   k:integer);{процедура чтения записей из файла}
 var
  f:text;          {текстовая переменная}
 
 begin
  assign(f,fname); {привязка внешнего файла с данными к внутренней файловой переменной}
  reset(f);        {окрытие файла в режиме чтения}
  k:=0;
 
  while (not EOF(f)) and (k<maxn) do  {считываем записи до конца файла или до максимального числа записей}
  begin
   k:=k+1;                              {счетчик количества записей}
   read(f,xmas[k].time);                {считываем время посадки}
   read(f,xmas[k].marka);               { считываем марку ЛА}
   read(f,xmas[k].bort);                {считываем бортовой номер}
   readln(f,xmas[k].punkt_otpravlenya); {считываем пункт отправления}
 
 
  if k=maxn then {если в файле больше 20 записей,то вывод сообщения}
    begin
    writeln('Исходный файл переполнен! Действия будут произведены с первыми ',maxn,' записями.');{вывод сообщения}
    readln;
    end;
end;
 
end;{конец процедуры чтения записей из файла}
 
procedure proverka_bort(xmas:vec_mas;k: integer);  {функция проверки корректности бортового номера}
var
  i,j:integer;       {переменные цикла}
  temp:integer;      {числовая переменная}
  code:integer;      {позиция первого недопустимого символа}
begin
   {проверка на уникальность бортового номера}
   for i:=1 to k do
   begin
   for j:=1 to k do
   begin
    if (xmas[i].bort=xmas[j].bort) and (i<>j) then
    begin
         writeln('Бортовой номер записей ',i,' и ',j,' совпадает!');
         readln;
         halt;
       end;
   end;
   end;
   {проверка на правильность ввода бортового номера}
   for i:=1 to k do
     begin
     val(copy(xmas[i].bort,4,4),temp,code); {  функция,преобразующая строковую запись в числовое представление}
      {если последние 4 символа бортового номера не цифры,если первый символ бортового номера  не буква,
       а второй символ не тире,то то вывод сообщения об ошибке ввода}
     if (code<>0) or (temp>9999) or (temp<0) or
     (ord(xmas[i].bort[2])<65) or (ord(xmas[i].bort[2])>90) or  {перевод символа в код ASCII}
     (xmas[i].bort[3]<>'-') then
     begin
     writeln('Hеправильно введен бортовой номер записи ',i);
     readln;
     halt;
     end;
    end;
 
end;  {конец процедуры proverka_bort}
 
procedure proverka_punkta( xmas:vec_mas;k:integer);  {процедура проверки уникальности пункта отпарвления}
var i,j:integer;   {переменный циклов}
 
begin
for i:=1 to k do
  begin
     for j:=1 to k do
 
      if (xmas[i].punkt_otpravlenya=xmas[j].punkt_otpravlenya) and (i<>j) then {проверка на уникальность пункта отправления}
      begin
          writeln('Пункт отправления записей ',i,' и ', j  ,' совпадает!');
          readln;
         halt;
      end;
  end;
 
 
end;{конец процедуры proverka_punkta}
 
procedure proverka_vremya(xmas:vec_mas; k: integer ); {процедура входного контроля времени}
var temp1,temp2,code:integer; {переменные для часов и минут и позиции первого недопустимого символа}
    i:integer;  {переменная цикла}
begin
      for i:=1 to k do
        begin
         val(copy(xmas[i].time,1,2),temp1,code); {переменной temp1 присваиваем значение часов}
         val(copy(xmas[i].time,4,2),temp2,code); {переменной temp2 присваиваем значение минут}
 
     if (temp1<0) or (temp1>23) then   {проверяем правильность ввода часов}
     begin
     writeln('В записи ', i, ' неправильно заданы часы');
      readln;
         halt;
     End
         else
          if (temp2<0) or (temp2>59) then  {проверяем правильность ввода минут}
     begin
     writeln('В записи ', i, ' неправильно заданы минуты');
      readln;
         halt;
     End;
     end;
 
end;{конец процедуры proverka_vremya}
 
 
procedure  sortirovka( xmas:vec_mas; var rec:sort_vec;k:integer); {процедура сортировки}
 var
  i,j,tempn:integer;
  tempg:string; {строковая переменная}
  begin
   for i:=1 to k do
    with rec do  {присоединение массива индексов и ключей}
      key[i]:=(xmas[i].time); {присваиваем  key поочередно записи времени}
   for i:=2 to k do
    begin
     with rec do {присоединение массива индексов и ключей}
      begin
       {копия очередного неотсортированного элемента}
       tempg:=key[i];
       tempn:=ind[i];
       {поиск позиции места вставки}
       j:=i-1;
       while (tempg<key[j]) and (j>0) do
        begin
        {сдвиг элементов вправо для освобождения позиции}
         key[j+1]:=key[j];
         ind[j+1]:=ind[j];
         j:=j-1;
        end;
        {вставка элементов}
       key[j+1]:=tempg;
       ind[j+1]:=tempn;
      end;
    end;
end;  {конец процедуры sortirovka }
 
 
 
 
procedure vyvod(xmas:vec_mas;ind:vec_ind;k:integer);  {процедура вывода данных на экран}
 var
  i,j:integer; {переменные циклов}
begin
                             {шапка таблицы}
  writeln(' ______________________________________________________________');
  writeln('|Время посадки | Марка ЛА | Бортовой номер | Пункт отправления |');
  writeln(' ______________________________________________________________');
 
  for i:=1 to k do   {цикл для вывода записей}
   begin
      writeln('|    ',xmas[ind[i]].time:2,'     | ',xmas[ind[i]].marka:8,' |    ',xmas[ind[i]].bort:7,'     |   '
    ,xmas[ind[i]].punkt_otpravlenya); {печать записей в форме таблицы}
      writeln(' _______________________________________________________________');
   end;
end;{конец процедуры vyvod}
 
                        {*****MAIN PROGRAM*****}
var
  kol:integer;   {переменная для количества записей}
  mas:vec_mas;   {переменая для массива}
  rez:sort_vec;  {переменная для массива индекcов и ключей}
  i:integer;     {переменная цикла}
begin
  clrscr;                     {очистка экрана}
  read_zap(mas,kol);          {вызов процедуры}
  clrscr;                     {очистка экрана}
  proverka_vremya(mas, kol ); {вызов процедуры}
  proverka_bort (mas, kol);   {вызов процедуры}
  proverka_punkta( mas,kol);  {вызов процедуры}
 
  for i:=1 to kol do rez.ind[i]:=i;
  writeln('Исходные данные:');
  vyvod(mas,rez.ind,kol);     {вызов процедуры}
 
  sortirovka(mas,rez,kol);    {вызов процедуры}
  readln;
  clrscr; {очистка экрана}
  writeln('Данные после сортировки в порядке возрастания времени посадки:');
  vyvod(mas,rez.ind,kol);     {вызов процедуры}
  readln;
end. {конец программы}
Добавлено через 30 минут 20 секунд
да,исходные данный имеют такой вид

16:45 TU-154M N-1711 Moskva
12:34 AN-123N B-5678 Voroneg
12:49 TU-775K N-5685 Bryansk
15:35 TU-254M V-1340 Tashkent
14:23 AN-123N B-5078 Voroneg
13:02 TU-775K I-7053 Kazan
19:45 AN-183N B-5671 Kaluga
16:45 TU-854M Z-2445 Lipeck
14:23 AN-123N B-5000 Astana
19:45 TU-175K V-1345 Parizh
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2009, 19:07     C++ сортировка структуры по возрастанию времени
Посмотрите здесь:

C++ Сортировка поля структуры по возрастанию
C++ Сортировка массива по возрастанию
Структуры: график учёта рабочего времени C++
C++ Сортировка массива по возрастанию
C++ Сортировка столбцов по возрастанию
Сортировка по возрастанию C++
C++ сортировка по возрастанию
Сортировка массива по возрастанию C++
C++ Быстрая сортировка по возрастанию
C++ Упорядочить номера маршрутов по возрастанию (структуры)
C++ Сортировка массива по возрастанию
C++ Сортировка массива по возрастанию

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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