Цель лабораторной работы:
- изучение структурной организации, способов доступа к элементам и других особенностей типизированных файлов;
- изучение стандартных подпрограмм библиотеки Турбо Паскаля для работы с типизированными файлами;
- приобретение навыков работы с типизированными файлами;
- совершенствование навыков процедурного программирования при решении задач обработки типизированных файлов.
Задание на программирование: используя технологию процедурного программирования разработать программу обработки типизированных файлов с числом записей не менее 5, структуру которых определяет индивидуальное задание. Вспомогательные файлы и массивы не использовать.
Порядок выполнения работы:
1) Получить у преподавателя индивидуальное задание.
2) Построить дерево подзадач и на его основе структурную диаграмму программы для решения индивидуальной задачи.
3) Сформулировать условие поиска данных в файле и организовать поиск по условию с сохранением найденных записей в новом файле.
4) Описать и использовать подпрограммы: проверки существования, создания, просмотра, сортировки файла записей, поиска данных в файле.
5) Предусмотреть в программе возможность выбора варианта выполнения программы с помощью меню в окне диалога с пользователем.
6) Использовать оконный интерфейс предыдущих лабораторных работ.
7) При демонстрации выполнения программы обеспечить одновременный показ в окнах на экране исходного и результирующего файла.
8) Оформить отчет о лабораторной работе в составе: постановка задачи, дерево подзадач, спецификация подпрограмм, текст программы, контрольные примеры.
Варианты индивидуальных заданий
Самолеты
Наименование
Фамилия
Год
Количество
Грузоподъемность
типа
конструктора
выпуска
кресел
в Т
Расчет движения
Наименование
Тип
Количество
Налет
Пассажирооборот
воздушной линии
самолета
рейсов
в тыс.км
в чел. км
Перевозки
Тип
Номер
Количество
Налет
Налет
самолета
борта
рейсов
в часах
в тыс.км
Расписание
Номер
Наименование
Тип
Стоимость
Протяженность
Рейса
рейса
самолета
билета
линии
Сооружения аэропорта
Наименование
Площадь
Этажность
Год
Стоимость
сооружения
в млн. руб.
Ремонт аэродромных сооружений
Наименование
Шифр
Вид
Стоимость
Наименование
ремонта
ремонта
подрядчика
Кассы авиабилетов
Номер
ФИО
Количество
Суммарная
Дата
кассы
кассира
проданных
выручка
продажи
билетов
Характеристики ПК
Тип
Тактовая
Емкость
Емкость
Тип
процессора
частота
ОП в Мбайт
ЖМД в Мбайт
монитора
Города
Наименование
Количество
Площадь
Год
Количество
жителей
в кв.км
основания
школ
Мосты
Наименование
Высота
Ширина
Количество опор
Протяженность
Программные продукты
Наименование
Фирма
Стоимость
Объем
Количество
Музеи
Наименование
Назначение
Адрес
Время работы
Стоимость билета
Экскурсии
Наименование
Страна
Стоимость
Продолжительность
Транспорт
Квартиры
Адрес
Площадь
Сторона
Стоимость
Этаж
Колич.
в кв.м
света
1 кв.м
комнат
Кинотеатры
Наименование
Стоимость
Время
Адрес
Количество
билета
сеансов
мест
мест
Магазин
Наименование
товара
Фирма
изготовитель
Сорт
Цена
Размер партии
Театр
Наименование
спектакля
Дата
Время
Место
Цена билета
Железная дорога
Пункт назначения
Поезд
Вагон
Место
Стоимость проезда
Библиотека
Название книги
Автор
Издание
Год издания
Количество экземпляров
Автоинспекция
Марка машины
Цвет
Номер
Год выпуска
Владелец
Метрополитен
Номер линии
Название линии
Число станций
Время стоянки
Время разворота
Пример программы
{Разработать программу, создающую файл записей, содержащий
информацию о проживающих в гостиничном комплексе (фамилия,
занимаемый номер, дата приезда, дата отъезда). Реализовать
процедуры добавления новых записей, поиска по фамилии, вывода
информации начиная с конкретной даты, удаление записей,
сортировки файла по возрастанию номеров апартаментов.}
Program TipFile;
Uses Crt;
Const
FLOOR=5; {число этажей в гостинице}
APPART=20; {число номеров на этаже}
TEX_1='Ввод';
TEX_2='Сообщения';
TEX_3='| Фамилия |Занимаемый номер|Дата приезда|Дата отъезда';
Type
TData=Record
gg,mm,dd:Byte;
End;
TZap=Record
fam:String; {фамилия проживающего}
nomer:Word; {занимаемый номер}
data_pr,
data_ot:TData; {дата приезда, дата отъезда}
End;
TFZ= File Of TZap;
{Процедура рисования окна диалога}
Procedure Okno(xv,yv,xn,yn,colfona,colbukv:Byte;zag:String);
Var
i:Integer;
Begin
Window(xv,yv,xn,yn);
TextColor(colbukv);
TextBackGround(colfona);
ClrScr;
GoToXY((xn-xv) Div 2 - Length(zag) Div 2,1);
Write(zag);
Window(xv+2,yv+2,xn-2,yn-3);
End;
{Проверка наличия файла с указанным именем}
Function FileExist(fname:String):Boolean;
Var
f:TFZ;
Begin
Assign(f,fname);
{$i-}
Reset(f);
{$i+}
If IOResult <> 0
Then FileExist:=FALSE
Else Begin
FileExist:=TRUE;
Close(f);
End;
End;
{Создание нового файла}
Procedure SozdFZ(fname:String);
Var
z:TZap;
i:1..FLOOR;
j:1..APPART;
otv:CHAR;
fz:TFZ;
Begin
If FileExist(fname)
Then Begin
Okno(46,2,80,18,13,10,TEX_2);
WriteLn('Файл ',fname,' уже существует.');
WriteLn('Хотите создать новый с тем же');
Write('именем? д/н->');
ReadLn(otv);
If Not (otv In ['l','L','д','Д'])
Then Exit;
End;
Assign(fz,fname); ReWrite(fz);
Window(1,1,80,25);
TextBackGround(1);
ClrScr;
Repeat
Okno(2,2,45,18,14,10,TEX_1);
ClrScr;
WriteLn('Добавляется новая запись:');
WriteLn;
With z
Do Begin
Write(' ФИО проживающего..'); ReadLn(fam);
Write(' занимаемый номер..'); ReadLn(nomer);
i:=z.nomer Div 100;
j:=z.nomer-i*100;
If(i<1)Or(i>FLOOR)Or(j<1)Or(j>APPART)
Then Begin
WriteLn('Ошибка в указании номера');
WriteLn('Повторите ввод после нажатия ENTER');
ReadLn; Continue;
End;
Write('дата приезда: год.(гг)..');ReadLn(data_pr.gg);
Write(' месяц.(мм)..');ReadLn(data_pr.mm);
Write(' день.(дд)..');ReadLn(data_pr.dd);
Write('дата отъезда: год.(гг)..');ReadLn(data_ot.gg);
Write(' месяц.(мм)..');ReadLn(data_ot.mm);
Write(' день.(дд)..');ReadLn(data_ot.dd);
If (data_pr.gg>data_ot.gg)Or
((data_pr.gg=data_ot.gg)And(data_pr.mm>data_ot.mm))Or
((data_pr.gg=data_ot.gg)And(data_pr.mm=data_ot.mm)And
(data_pr.dd>data_ot.dd))
Then Begin
WriteLn('Ошибка в наборе дат.');
WriteLn('Повторите ввод после нажатия ENTER');
ReadLn; Continue;
End;
End;
Write(fz,z);
Write('Продолжать ввод?..д/н..'); ReadLn(otv);
Until Not (otv In ['l','L','д','Д']);
Close(fz);
End;
{Сортировка файла вторичному ключу (по занятым номерам апартаментов)}
Procedure Sort_Fz(fname:String);
Var
z1,z2:TZap;
fp:Boolean;
i,nom:Integer;
fz:TFZ;
Begin
If Not FileExist(fname)
Then Begin
Okno(46,2,80,18,13,10,TEX_2);
WriteLn('файл ',fname,' не существует, сортировка невозможна');
Exit;
End;
Assign(fz,fname); Reset(fz);
nom:=FileSize(fz)-1;
Repeat
fp:=FALSE;
For i:=0
To nom-1
Do Begin
Seek(fz,i);
Read(fz,z1,z2);
If z1.nomer>z2.nomer
Then Begin
Seek(fz,FilePos(fz)-2);
Write(fz,z2,z1);
fp:=true;
End;
End;
Until Not fp;
Close(fz);
End;
{Печать существующих записей, начиная с указанной даты}
Procedure ProsmFz(fname:String; den:TData);
Var
z:TZap;
i:Byte;
fz:TFZ;
Begin
If Not FileExist(fname)
Then Begin
Okno(46,2,80,18,13,10,TEX_2);
WriteLn('Файл ',fname,' не существует');
WriteLn('Просмотр невозможен');
WriteLn('Нажмите ENTER');
ReadLn; Exit;
End;
Okno(1,1,80,25,13,10,'');
ClrScr;
Write('С ');
If den.dd<10 Then Write('0');
Write(den.dd,'.');
If den.mm<10 Then Write('0');
Write(den.mm,'.');
If den.gg<10 Then Write('0');
WriteLn(den.gg,' в гостинице проживали:');
WriteLn;
WriteLn(' ',TEX_3);
Assign(fz,fname); Reset(fz);
i:=3;
WHILE Not EOF(fz)
Do Begin
Inc(i);
Read(fz,z);
With z Do
Begin
If(den.gg<data_ot.gg)Or
((den.gg=data_ot.gg)And(den.mm<data_ot.mm))Or
((den.gg=data_ot.gg)And(den.mm=data_ot.mm)And
(den.dd<=data_ot.dd))
Then Begin
Write(' | ');
GoToXY( 9,i); Write(fam);
GoToXY(25,i); Write('| ',nomer);
With data_pr Do
Begin
Write(' | ');
If dd<10 Then Write('0');
Write(dd,'.');
If mm<10 Then Write('0');
Write(mm,'.');
If gg<10 Then Write('0');
Write(gg);
End;
With data_ot Do
Begin
Write(' | ');
If dd<10 Then Write('0');
Write(dd,'.');
If mm<10 Then Write('0');
Write(mm,'.');
If gg<10 Then Write('0');
Write(gg);
End;
End;
End;
WriteLn;
If i=20
Then Begin
Write('Для продолжения нажмите ENTER');
ReadLn;
i:=0;
ClrScr; WriteLn;
End;
End;
WriteLn;
WriteLn('Для продолжения нажмите ENTER');
ReadLn;
Window(1,1,80,25);
TextBackGround(1);
ClrScr;
Close(fz);
End;
{Процедура добавления новых записей}
Procedure Dobavl(fname:String);
Var
z:TZap;
otv:CHAR;
i:1..FLOOR;
j:1..APPART;
fz:TFZ;
Begin
Assign(fz,fname);
If Not FileExist(fname)
Then ReWrite(fz)
Else Begin
Reset(fz);
Seek(fz,FileSize(fz));
End;
Repeat
Okno(2,2,45,18,14,10,TEX_1);
ClrScr;
WriteLn('Добавляется новая запись:'); WriteLn;
With z
Do Begin
Write('ФИО проживающего..'); ReadLn(fam);
Write('занимаемый номер..'); ReadLn(nomer);
i:=z.nomer Div 100;
j:=z.nomer-i*100;
If(i<1)Or(i>FLOOR)Or(j<1)Or(j>APPART)
Then Begin
WriteLn('Ошибка в указании номера');
WriteLn('Повторите ввод после нажатия ENTER');
ReadLn; Continue;
End;
Write('дата приезда: год.(гг)..');ReadLn(DATA_pr.gg);
Write(' месяц.(мм)..');ReadLn(DATA_pr.mm);
Write(' день.(дд)..');ReadLn(DATA_pr.dd);
Write('дата отъезда: год.(гг)..');ReadLn(DATA_ot.gg);
Write(' месяц.(мм)..');ReadLn(DATA_ot.mm);
Write(' день.(дд)..');ReadLn(DATA_ot.dd);
If(data_pr.gg>data_ot.gg)Or
((data_pr.gg=data_ot.gg)And(data_pr.mm>data_ot.mm))Or
((data_pr.gg=data_ot.gg)And(data_pr.mm=data_ot.mm)And
(data_pr.dd>data_ot.dd))
Then Begin
WriteLn('Ошибка в наборе дат.');
WriteLn('Повторите ввод после нажатия ENTER');
ReadLn; Continue;
End;
End;
Write(fz,z);
Write('Продолжать ввод?..д/н..'); ReadLn(otv);
Until Not (otv In ['l','L','д','Д']);
Close(fz);
End;
{Поиск проживающего по фамилии}
Procedure Poisk_Fam(fname:String; famil:String);
Var
z:TZap;
otv:CHAR;
i:Word;
fz:TFZ;
Begin
If Not FileExist(fname)
Then Begin
Okno(46,2,80,18,13,10,TEX_2);
WriteLn('Файл ',fname,' не существует.');
WriteLn('Поиск записей невозможен.');
WriteLn('Нажмите ENTER.');
ReadLn; Exit;
End;
Okno(1,1,80,25,13,10,'');
ClrScr;
WriteLn('С фамилией ',famil,' в гостинице проживали:');
WriteLn;
WriteLn(' ',TEX_3);
Assign(fz,fname); Reset(fz);
i:=3;
While Not EOF(fz)
Do Begin
Read(fz,z);
If z.fam=famil
Then Begin
Inc(i);
With z Do
Begin
Write(' | ');
GoToXY( 9,i); Write(fam);
GoToXY(25,i); Write('| ',nomer);
With data_pr Do
Begin
Write(' | ');
If dd<10 Then Write('0');
Write(dd,'.');
If mm<10 Then Write('0');
Write(mm,'.');
If gg<10 Then Write('0');
Write(gg);
End;
With data_ot Do
Begin
Write(' | ');
If dd<10 Then Write('0');
Write(dd,'.');
If mm<10 Then Write('0');
Write(mm,'.');
If gg<10 Then Write('0');
Write(gg);
End;
End;
WriteLn;
End;
If i=20
Then Begin
Write('Для продолжения нажмите ENTER');
ReadLn;
i:=0;
ClrScr;
End;
End;
WriteLn;
WriteLn('Для продолжения нажмите ENTER');
ReadLn;
Window(1,1,80,25);
TextBackGround(1);
ClrScr;
Close(fz);
End;
{Удаление записей}
Procedure Udal_Zap(fname:String);
Var
z:TZap;
otv:CHAR;
nomer:Word;
i:1..FLOOR;
j:1..APPART;
fz,fpr:TFZ;
pr:Boolean;
Begin
If Not FileExist(fname)
Then Begin
Okno(46,2,80,18,13,10,TEX_2);
WriteLn('Файл ',fname,' не существует.');
WriteLn('Удаление записей невозможно.');
WriteLn('Нажмите ENTER');
ReadLn; Exit;
End;
Okno(2,2,45,18,14,10,TEX_1);
ClrScr;
Repeat
Assign(fz,fname); Reset(fz);
WriteLn('Введите номер апартаментов для поиска:');
ReadLn(nomer);
i:=nomer Div 100;
j:=nomer-i*100;
If(i<1)Or(i>FLOOR)Or(j<1)Or(j>APPART)
Then Begin
WriteLn('Ошибка в указании номера');
WriteLn('Повторите ввод после нажатия ENTER');
ReadLn; Continue;
End;
Assign(fpr,'C:\pr.txt'); Rewrite(fpr);
pr:=TRUE;
Repeat
Read(fz,z);
If z.nomer=nomer
Then Begin
pr:=FALSE;
ClrScr;
Okno(46,2,80,18,13,10,TEX_2);
WriteLn('Производится удаление');
WriteLn('записи для апартаментов ',nomer);
Write('Подтвердите удаление д/н ->');
ReadLn(otv);
If (otv In['l','L','д','Д'])
Then Continue;
End;
Write(fpr,z);
Until EOF(fz);
Erase(fz);
Close(fpr);
Rename(fpr,fname);
Okno(46,2,80,18,13,10,TEX_2);
WriteLn('Корректировка закончена.');
If pr Then WriteLn('Запись не обнаружена.');
Write('Продолжать корректировку?.д/н.'); ReadLn(otv);
Until Not (otv In ['l','L','д','Д']);
Close(fz);
End;
{основная программа}
Var
fname:String;
z:TZap;
txt:String;
otv:Byte;
den:TData;
ch:Char;
familiya:String;
Begin
TextBackGround(1);
ClrScr;
Okno(2,2,45,18,14,10,TEX_1);
WriteLn('Выбор операции:1-создание файла');
WriteLn(' 2-поиск записей');
WriteLn(' 3-добавление записи');
WriteLn(' 4-удаление записи');
WriteLn(' 5-просмотр записей');
WriteLn(' 6-завершение работы');
ReadLn(otv);
Repeat
Case otv Of
1:Begin
ClrScr;
WriteLn('Введите имя создаваемого файла:');
ReadLn(fname);
SozdFZ(fname);
End;
2:Begin
ClrScr;
Write('Введите фамилию для поиска..');
ReadLn(familiya);
WriteLn('Введите имя существующего файла..');
ReadLn(fname);
Poisk_fam(fname,familiya);
End;
3:Begin
ClrScr;
WriteLn('Добавляем новые записи.');
WriteLn('Введите имя существующего файла..');
ReadLn(fname);
Dobavl(fname);
End;
4:Begin
ClrScr;
WriteLn('Удаление записи.');
WriteLn('Введите имя существующего файла..');
ReadLn(fname);
Udal_Zap(fname);
End;
5:Begin
ClrScr;
WriteLn('Введите имя существующего файла..');
ReadLn(fname);
WriteLn('Введите дату начала просмотра');
Write(' год.(гг)..'); ReadLn(den.gg);
Write('месяц.(мм)..'); ReadLn(den.mm);
Write(' день.(дд)..'); ReadLn(den.dd);
WriteLn('Нужна ли предварительная сортировка');
Write('записей по номерам апартаментов? д/н..');
ReadLn(ch);
If ch In['l','L','д','Д']
Then Sort_Fz(fname);
ProsmFz(fname,den);
End;
6:Begin
Okno(2,2,45,18,14,10,TEX_1);
WriteLn('Работа действительно заканчивается?');
Write('д/н..');
ReadLn(ch);
If ch In['l','L','д','Д']
Then Exit;
End;
End;
Window(1,1,80,25);
TextBackGround(1);
ClrScr;
Okno(2,2,45,18,14,10,TEX_1);
ClrScr;
WriteLn('Выбор операции:1-создание файла');
WriteLn(' 2-поиск записей');
WriteLn(' 3-добавление записи');
WriteLn(' 4-удаление записи');
WriteLn(' 5-просмотр записей');
WriteLn(' 6-завершение работы');
ReadLn(otv);
Until otv=6;
End.