Міністерство освіти і науки України
Національний технічний університет України
“Київський політехнічний інститут”
Кафедра ОТ
ЗВІТ
про виконання лабораторної роботи № 9
з дисципліни
“Основи програмування та алгоритмічні мови”
Тема: Типізовані файли
Київ 2010
Постановка задачі
Створити файл записів з полями: напрямок руху, номер авіарейса, тип літака, кількість вільних місць, вартість квитка, дні виконання рейсу. Визначити сумарну кількість вільних місць на літаки, що відлітають у заданому напрямку у заданий день тижня.
Текст програми з коментарями
uses crt;
const n=3;
type days=1..7;
dayz=set of days;
Nedelya=record
Mest:byte;
Stoimost:word;
end;
Reys=record
Napravlenie:string[50];
Nomer:word;
Tip:string[30];
Dni:dayz;
Week:array[days] of nedelya;
end;
var f:file of reys;
function vibor(v:days):string;
var s:string;
begin
case v of
1:s:='Ponedelnik ';
2:s:='Vtornik ';
3:s:='Sreda ';
4:s:='Chetverg ';
5:s:='Pyatnica ';
6:s:='Subbota ';
7:s:='Voskresenie ';
end;
vibor:=s;
end;
function proverka(mnog_vo:dayz):boolean;
var j,i:byte;
b:boolean;
begin
j:=0;
for i:=1 to 7 do
if i in mnog_vo then
inc(j);
if j=7 then b:=true
else b:=false;
proverka:=b;
end;
procedure ochistka(var s:reys);
var i:byte;
j:days;
begin
with s do
begin
napravlenie:='';
tip:='';
nomer:=0;
dni:=[];
for j:=1 to 7 do
with week[j] do
begin
mest:=0;
stoimost:=0;
end;
end;
end;
procedure vvod;
var i,DenNed:integer;
c:char;
zapis:reys;
begin
rewrite(f);
i:=0;
repeat
ochistka(zapis);
with zapis do
begin
inc(i);
clrscr; textcolor(0);
write('Vvedite dannie o '); textcolor(3); write(i); textcolor(0); writeln(' samolete/rejse:'); textcolor(1); write(' vvedite Nomer samoleta: '); textcolor(4);
readln(Nomer); textcolor(1);
write(' vvedite Napravlenie dvigeniya samoleta: '); textcolor(4);
readln(Napravlenie); textcolor(1);
write(' vvedite Tip samoleta: '); textcolor(4);
readln(Tip); textcolor(1);
writeln(' vvedite Dni ispolneya reysa: ');
writeln('1=Ponedelnik | 2=Vtornik | 3=Sreda | 4=Chetverg | 5=Pyatnica | 6=Subbota | 7=Voskresenie: ');
c:=readkey;
repeat
DenNed:=ord(c)-48;
if (DenNed>7)or(DenNed<1) then
begin
writeln('Dni nedeli-eto chisla v promegutke [1..7] ');
c:=readkey;
continue;
end;
if DenNed in dni
then writeln('vi uge vvodili etot den')
else
begin textcolor(4);
writeln(vibor(DenNed),':');
dni:=dni+[DenNed];
with week[DenNed] do
begin textcolor(1);
write(' vvedite kolichestvo svobodnix Mest na etot den nedeli: '); textcolor(4);
readln(Mest); textcolor(1);
write(' vvedite Cenu na bileti: '); textcolor(4);
readln(Stoimost); textcolor(1);
end;
end; textcolor(12);
if proverka(dni)
then
writeln('vi uge vveli vse 7 dney. Nagmite lybuy knopky.')
else writeln('Esli xotite vvesti ewe 1 den-nagmite na cifry. Esli Net - to nagmite Enter ');
c:=readkey; textcolor(0);
until (c=#13)or proverka(dni);
end;
write(f,zapis);
writeln('vvesti ewe 1 samolet v bazu dannix ?');
write('Esli da - to nagmite '); textcolor(4); writeln('"Enter"');
until readkey<>#13;
close(f);
end;
procedure raspisanie;
var i,j:integer;
s:string;
zapis:reys;
begin
writeln; write('===================================================================');
writeln(' # | Napravlenie: | Dni nedeli: | Tip: | Mest: | Cena: ');
write('===================================================================');
for j:=1 to 7 do
begin
reset(f);
s:=vibor(j);
while not(eof(f)) do
begin
read(f,zapis);
with zapis do
if j in dni then
begin textcolor(0);
writeln(' ',Nomer:3,' |',Napravlenie:23,' | ',s,'|':15-length(s),Tip:15,' |',week[j].Mest:6,' |',week[j].Stoimost:6); s:='----------';
end;
end;
close(f);
end;
write('=================================================================');
end;
function UP(s:string):string;
var i:integer;
begin
for i:=1 to length(s) do
s[i]:=UpCase(s[i]);
UP:=s;
end;
procedure kolmest;
var kol:word;
day:days;
s:string;
duraction:string;
i:byte;
code:integer;
zapis:reys;
begin
reset(f);
write('vvedite napravlenie, na kotoroe vi xotite uznatb raspisanie... '); textcolor(12);
readln(duraction); textcolor(0);
writeln('vvedite na kakoy denb nedeli');
write('1=Ponedelnik | 2=Vtornik | 3=Sreda | 4=Chetverg | 5=Pyatnica | 6=Subbota | 7=Voskresenie: '); textcolor(12);
repeat
val(readkey,day,code);
if ((code=0) and (day>=1) and (day<=7)) then writeln(vibor(day))
else writeln('vvedite denb nedeli [1..7]');
until (day>0)and(day<8);
kol:=0;
while not(eof(f)) do
begin
read(f,zapis);
with zapis do
if (UP(napravlenie)=UP(duraction)) and (day in dni) then
inc(kol,week[day].mest);
end;
s:=vibor(day);
textcolor(0);
write('Na '); textcolor(1);
write(duraction); textcolor(0);
write('v bligaiwiy '); textcolor(1);
write(s); textcolor(0);
if kol<>0
then
begin
write(' estb '); textcolor(1);
write(kol); textcolor(0);
end
else
write(' net');
writeln(' svobodnix mest ');
close(f);
end;
BEGIN
textbackground(7);
textcolor(0);
clrscr;
assign(f,'Samolet');
vvod;
repeat
clrscr; textcolor(0);
WriteLn('Result of laboratory work 7');
WriteLn('variant 4');
WriteLn('Executed student of group IP-02 Bondur Vladislav'); textcolor(1);
raspisanie;
kolmest;
write('Nagmite '); textcolor(4);
write('`Enter`'); textcolor(0);
write(' chtobi naytu drugie reysi ili nagmite druguy knopku chtobi viytu');
until ord(readkey)<>13;
END.
Блок-схема алгоритму
Результат виконання програми у вигляді відеокопії екрана
/
/
Висновки
Програма дозволяє вводити користувачу нескінчену кількість даних про рейси літаків, а саме: номер рейсу, напрям, тип літака, дні виконання, а також кількість вільних місць у ці дні та ціни на квитки, при цьому ведеться підрахунок кількості введених літаків. Введення дня тижня виконується натиском на клавішу цифри від 1 до 7(кожна цифра відповідає дню тижня). У випадку введення дня тижня програма забороняє повторне введення даних про літак на цей день. У разі введення усіх 7 днів тижня програма видасть відповідне повідомлення та запропонує ввести дані про ще один літак(Див. мал. 1).
Після введення даних у файл, програма формує список з усіх введених літаків, та сортирує його за днями виконання, отже можна легко знайти літак на шуканий напрям у будь-який день тижня(Див мал. 2). Також надається можливість ввести напрям і день тижня, а програма видасть вам кількість вільних місць з усіх літаків по введеним даним (пошук циклічний, тобто його можна повторити за іншими даними до виходу з програми). Також хочеться зазначити, що програма виконана в кольоровій гамі: легко відрізнити ті символи які були введені вами, та ті підказки, які виводилися протягом роботи програми.
Отже перевіримо чи правильно працює програма:
Список рейсів отсортований за днями виконання, а подальше сортування відбувається за порядком введення в файл даних. При введенні слова «kiev», та цифри 5(програма сама замінює цифру на день тижня, де це потрібно), було виведено, що у п’ятницю на kiev є 78 вільних місць. Дійсно, згідно таблиці в п'ятницю є:
14 місць на 100 рейсі
7 місць на 600 рейсі
57 місць на 800 рейсі
Усього 78 місць. Отже програма працює вірно.