Получение сведений о наличии билетов аэрофлот

    Калининградский Государственный Технический Университет

    Кафедра систем управления и вычислительной техники 
 

                  Работа  защищена с оценкой

                  _______________  ________

                        (дата) 

                  Гудков  А.Л.

  
 
 
 
 
 

    Получение сведений о наличии билетов 

    на  рейсы Аэрофлота 
 

    Пояснительная записка по курсовой работе по дисциплине  «Программирование» 
 
 
 
 
 
 

    Работа  допущена Работу выполнил студент

    к защите учебной группы 08–ИЭ 

    Гудков  А.Л. Четвергов Е.С. 
 

    __________ ____________

    (дата)  (дата) 
 
 
 
 
 
 

Калининград, 2009 
Аннотация 

     В настоящей пояснительной записке приведены результаты разработки программы решения задачи «Получение сведений о наличии билетов на рейсы Аэрофлота», выполненной в соответствии с заданием по курсовой работе по дисциплине «Программирование» – постановка указанной задачи, проектные решения и программа (на языке Турбо-Паскаль), результаты испытания (тестирования) программы.

 

СОДЕРЖАНИЕ 
 
 
 

 

    1. Описание постановки  задачи

    1. Характеристика  задачи

    Задача  «Получение сведений о наличии билетов на рейсы Аэрофлота» решается с целью получения списка авиарейсов с опередленным пунктом назначения и временем вылета. Исходными для решения задачи данными является набор данных (файл) на магнитном диске, содержащий информацию об авиарейсах. В начале решения задачи задается (вводится с клавиатуры) запрос, представляющий собой две строковых переменных - пункт назначения и время вылета - и определяющий, для каких рейсов должны быть получены указанные выше сведения (результаты решения задачи).

    1. Исходные  данные

    Исходная  для решения задачи «Получение сведений о наличии билетов на рейсы Аэрофлота» информация содержится в одном дисковом файле и в указываемом (вводимом с клавиатуры) в начале решения задачи запросе пользователя.

    Структура элемента файла «Сведения об авиарейсах» (дисковое имя – ‘C:\TP\aeroflot.dat’):

    • номер рейса (целое число),
    • пункт назначения (строка),
    • время вылета (строка),
    • время прибытия (строка),
    • количество свободных мест (целое число).     

    Запрос  пользователя представляет собой:

    • пункт назначения (строка),
    • время вылета (строка).
    1. Результаты  решения

    Результатом решения задачи на ПК является таблица «Сведения о рейсах Аэрофлота» (рис. 1.1),  которая содержит:

    • номер рейса (целое число),
    • время вылета (строка),
    • время прибытия (строка),
    • количество свободных мест (целое число).
 
Номер рейса Время вылета Время прибытия Количесвто  свободных мест

    Рис 1.1. Таблица «Сведения о рейсах Аэрофлота» 

    Данные  в таблице располагаются в порядке возрастания по времени вылета.

 

    2. Описание проектных  решений

    2.1. Функциональная структура задачи, программы

 

    На  рис. 2.1 представлена схема иерархии процедур задачи «Получение сведений о наличии билетов на рейсы Аэрофлота», полученная в результате её декомпозиции.  

    

    Рис 2.1. Схема иерархии процедур 

    На  рис. 2.2 представлена функциональная структура  программы решения задачи, полученная на основе схемы иерархии ее процедур.

      

    Рис 2.2. Функциональная структура программы

    Помимо  основной программы с именем «P_AEROFLOT», программа должна содержать следующие подпрограммы:

  1. Подпрограмму Procedure InA (var city,time:string; var e:boolean), которая обеспечивает ввод двух элементов запроса – пункт назначения (строка), время вылета (строка);
  2. Подпрограмму Function UpcaseR (city:string):string, которая обеспечивает преобразование элемента запроса – пункт назначения – в заглавные буквы;
  3. Подпрограмму Function VerA2 (time:string):boolean, которая обеспечивает проверку элемента запроса - время вылета (строка);
  4. Подпрограмму Procedure GetR (city,time:string; var result:mas; var m:integer), которая обеспечивает обработку файла «AEROFLOT» с целью получения сведений об авиарейсах для заданного запроса;
  5. Подпрограмму SortR (var result:mas; m:integer), которая обеспечивает упорядочивание списка по возрастанию времени вылета (целое число);
  6. Подпрограмму OutR (city,time:string; result:mas; m:integer), которая обеспечивает вывод списка авиарейсов на экран монитора.

 

     2.2. Описание алгоритма задачи

 

    На  рис. 2.3 – 2.9  представлены схемы обобщенного  алгоритма задачи «Получение сведений о наличии билетов на рейсы Аэрофлота» и алгоритмов отдельных её процедур. Смысл используемых в них условных обозначений (имен, идентификаторов) приведен в табл. 2.1, тексты выводимых сообщений – в табл. 2.2. Обобщенный алгоритм (алгоритм задачи в целом) описывается в основной программе. Алгоритмы отдельных процедур – в соответствующих подпрограммах (см. 2.1.).

       

    Рис 2.3. Схема алгоритма основной задачи

    

 
 

    Рис 2.4. Схема алгоритма процедуры InA

 

    

 
 

    Рис 2.5. Схема алгоритма функции UpcaseR 
 
 
 
 
 
 
 
 

    

 
 

    Рис 2.6. Схема алгоритма функции VerA2

 

    

 
 

    Рис 2.7. Схема алгоритма процедуры GetR

  
 

 

 

 

 

 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Таблица 2.1. Условные обозначения (имена, идентификаторы), используемые в процедурах и функциях программы. 

Название 

процедуры

или функции

Имена, идентификаторы Назначение
InA city:string

time:string

e:boolean

Пункт назначения

Время вылета

Признак правильности запроса

e=true – запрос верный

e=false – запрос неверный

UpcaseR i:byte Счетчик символов исходной строки
VerA2 c:boolean Признак правильности запроса

с=true – запрос верный

с=false – запрос неверный

GetR city:string

time:string

result:mas

m:integer

a:zap

a.pn

a.vv

a.mesta

Элемент запроса - пункт назначения

Элемент запроса - время вылета

Массив записей  об авиарейсах

Количество записей  в массиве result

Запись из файла

Элемент записи – пункт назначения

Элемент записи – время вылета

Элемент записи – кол-во свободных мест

Таблица 2.2. Тексты выводимых сообщений
Сообщение 1 Ошибка при  вводе запроса
Сообщение 2 Нет сведений по запросу
Сообщение 3 Введите пункт  назначения:
Сообщение 4 Введите время  вылета (чч.мм):
Сообщение 5 Вы не ввели  пункт назначения!

 

    3. Описание программы

    3.1. Структура программы

 

    При написании программы решения  задачи «Получение сведений о наличии билетов на рейсы Аэрофлота» использовался язык программирования Турбо-Паскаль (Turbo Pascal Version 7).

    Функциональная  структура программы (состав и взаимосвязь программных единиц исходного текста её – основной программы и подпрограмм) определена в 2.1.

    Программа является описанием алгоритма задачи, приведенного в 2.2.

    Модульная структура программы (состав и взаимосвязь  модулей исходного текста) приведена на рис. 3.1. Ниже указано содержание модулей программы. 

      

    Рис 3.1 Модульная структура программы 

    Головной  модуль P_AEROFLOT содержит текст основной программы.

    Модуль  U1 содержит подпрограммы InA, UpcaseR, VerA2.

    Модуль  U2 содержит подпрограммы GetR, SortR.

    Модуль  U3 содержит подпрограммы OutR.

    Модуль  U4 содержит описания общих типов данных.

    3.2. Текст программы

 

    Исходный  текст программы решения задачи «Получение сведений о наличии билетов на рейсы Аэрофлота» (на языке Турбо-Паскаль, версия Turbo Pascal Version 7) – её модулей – приведен в приложении 1.

    3.3. Исполнение программы

 

    Для исполнения программы решения задачи «Получение сведений о наличии билетов на рейсы Аэрофлота» необходим ПК типа IBM с клавиатурой и монитором. Программа предварительно откомпилирована и собрана в исполняемый модуль с именем af.exe, который вызывается для исполнения стандартными средствами.

    До  начала исполнения программы на магнитном  диске должен быть сформирован файл с исходными данными, структура, содержание и имя которого описаны в 1.2. В начале исполнения программы необходимо ввести с клавиатуры запрос, конкретизирующий условия решения задачи (см. 1.2).

 

    4. Описание результатов  испытаний программы

 

    В ходе испытаний (тестирования и контрольных  примеров исполнения) программы решения  задачи «Получение сведений о наличии билетов на рейсы Аэрофлота» использовался тестовый файл, текст которого приведен в приложении 2 (программы создания и печати тестового файла приведен в приложении 3), а также запросы для разных вариантов решения задачи: 

  1. Пункт назначения: москва

     Время вылета: 01.00

  1. Пункт назначения: москва

     Время вылета: 23.59

  1. Пункт назначения: с.пЕТЕрБург

     Время вылета: 13.00

  1. Пункт назначения: _
  2. Пункт назначения: лондон

     Время вылета: 10.00

  1. Пункт назначения: москва

     Время вылета: time

  1. Пункт назначения: москва

     Время вылета: 30.00 

    После устранения ошибок в программе для  указанных исходных данных (контрольных  примеров) получены правильные результаты решения задачи (приложение 4), что свидетельствует о правильности разработанной программы.

 

ПРИЛОЖЕНИЯ

 

Приложение 1

     Исходный  текст программы решения задачи «Получение сведений о наличии билетов  на рейсы Аэрофлота» 

     Основная программа 

Program P_AEROFLOT;

uses U1,U2,U3,U4; 

var city,time:string; e:boolean; result:mas; m:integer; 

Begin

InA(city,time,e);

if e=false then writeln('Ошибка при вводе запроса') else begin

   GetR(city,time,result,m);

   if m=0 then writeln('Нет сведений по запросу') else begin

      if m>1 then SortR(result,m);

      OutR(city,time,result,m);

      end;

   end;

Readln;

End.

 

    Модуль  U1 

Unit U1;

Interface

         Function UpcaseR(city:string):string;

         Function VerA2(time:string):boolean;

         Procedure InA(var city,time:string; var e:boolean);

      

Implementation 

Function UpcaseR(city:string):string;

const AS='абвгдеёжзийклмнопрстуфхцчшщъыьэюя';

      AB='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';

var n,i:byte; a:string;

Begin

a:='';

for i:=1 to length(city) do begin

    n:=Pos(city[i],AS);

    if n>0 then a:=a+copy(AB,n,1) else a:=a+city[i];

    end;

UpcaseR:=a;

End; 

Function VerA2(time:string):boolean;

var v:string; dv,code:integer; c:boolean;

Begin

c:=false;

if length(time)=5 then

if (time[3]='.') then begin

   v:=copy(time,1,2); val(v,dv,code);

   if (code=0)and(dv>=00)and(dv<=23) then begin 

      v:=copy(time,4,2); val(v,dv,code);

      if (code=0)and(dv>=00)and(dv<=59) then c:=true;

      end;

   end;

VerA2:=c;

End; 

Procedure InA(var city,time:string; var e:boolean);

Begin

Write ('Введите пункт назначения: '); readln(city);

if city='' then begin

   writeln ('Вы не ввели пункт назначения!');

   e:=false

   end  else begin

   city:=UpcaseR(city);

   write ('Введите время вылета (чч.мм): '); readln(time);

   e:=VerA2(time);

   end;

End; 

End.

      Модуль U2 

Unit U2;

Interface

         uses u4;

         Procedure GetR(city,time:string; var result:mas; var m:integer);

         Procedure SortR(var result:mas; m:integer); 

Implementation 

Procedure GetR(city,time:string; var result:mas; var m:integer);

Var  F:file of zap; a:zap;

Begin

Assign(F,'AEROFLOT.dat');

Reset(F);

m:=0;

While not eof (F) do begin

      Read (F, a);

      If (a.pn=city) and (a.vv>=time) and (a.mesta>0) then begin

            m:=m+1;

            result[m]:=a;

            end;

      end;

Close (F);

End; 

Procedure SortR(var result:mas; m:integer);

var i,j:integer; a:zap;

Begin

For i:=1 to (m-1) do

For j:=i+1 to m do

if result[i].vv>result[j].vv then begin

   a:=result[i]; result[i]:=result[j]; result[j]:=a;

   end;

End; 

End.

 

    Модуль  U3 

Unit U3;

Interface

         uses crt,U4;

         Procedure OutR(city,time:string; result:mas; m:integer); 

Implementation 

Procedure OutR(city,time:string; result:mas; m:integer);

          var i:integer;

          Begin

          clrscr;

          Writeln (' Сведения о рейсах Аэрофлота ');

          Writeln (' Пункт назначения: ',city);

          Writeln (' Время вылета после: ',time);

          Writeln ('┌───────┬──────────┬──────────┬────────────────┐');

          Writeln

('│ Номер │  Время    │ Время    │ Количество     │');

          Writeln

('│ рейса │  вылета   │ прибытия │ свободных  мест │');

          Writeln ('├───────┼──────────┼──────────┼────────────────┤');

          for i:=1 to m do

          Writeln

('│',result[i].nomer:5,'  │',result[i].vv:6,'    │',

result[i].vp:6,'    │',result[i].mesta:3,        │'); 

          Writeln ('└───────┴──────────┴──────────┴────────────────┘');

          End;

End.

 

    Модуль U4 

Unit U4;

Interface

Type zap=record

         nomer:integer;

        pn:string[25];

         vv:string[5];

         vp:string[5];

         mesta:integer

         end;

     mas=array [1..16] of zap; 

Implementation

End.

 

Приложение 2 

Текст тестового  файла на магнитном диске 

номер

рейса

пункт

назначения

время

вылета

время прибытия свободных мест
1010

1011

1012

1013

1014

1101

1102

1103

1500

1501

2010

2011

2100

2200

МОСКВА

МОСКВА

МОСКВА

МОСКВА

МОСКВА

С.ПЕТЕРБУРГ

С.ПЕТЕРБУРГ

С.ПЕТЕРБУРГ

БАКУ

БАКУ

ЯКУТСК

ЯКУТСК

САРАНСК

ВОЛОГДА

06.00

10.00

14.00

17.00

21.00

07.00

12.00

18.00

11.00

20.00

06.00

17.00

13.00

12.00

07.00

11.00

15.00

18.00

22.00

07.40

12.40

18.40

13.00

22.00

12.00

23.00

16.00

16.00

40

40

60

30

30

15

40

50

60

70

60

55

70

50

 

 

Приложение 3 

Текст программ создания и печати тестового файла 

Program CREATE; 

Uses CRT,U1,U4; 

Var AF:file of ZAP;

    x:zap;

    k,l:integer;

    name:string; 

Begin

clrscr;

k:=0;

assign(AF,'AEROFLOT.dat');

rewrite(AF);

writeln('Для ввода данных нажмите Enter');

writeln('Для окончания  работы нажмите *');

while not (readkey='*') do begin

     write('Номер рейса: ');

      readln(x.nomer);

      write('Пункт назначения: ');

      readln(x.pn);

      x.pn:=UPCASER(x.pn);

      write('Время вылета хх.хх: ');

      readln(x.vv);

      write('Время прибытия хх.хх: ');

      readln(x.vp);

      write('Количество свободных мест: ');

      readln(x.mesta);

      k:=k+1;

      write(AF,x);

      writeln;

      writeln('Для продолжения ввода данных  нажмите Enter');

      writeln('Для окончания работы нажмите  *');

      writeln;

      end;

clrscr;

writeln('В файле ',k:3,' записей');

reset(AF);

writeln('┌────────┬───────────────────────┬──────────┬──────────┬───────────┐');

writeln('│ номер   │         пункт         │  время   │  время   │ свободных │');

writeln('│ рейса   │       назначения      │  вылета  │ прибытия │    мест   │');

writeln('├────────┼───────────────────────┼──────────┼──────────┼───────────┤');

while not eof(AF) do begin

      read(AF,x);

      with x do

      writeln('│',nomer:7,' │',pn:22,' │',vv:9,' │',vp:9,' │',mesta:10,' │');

      end;

writeln('└────────┴───────────────────────┴──────────┴──────────┴───────────┘');

Получение сведений о наличии билетов аэрофлот