Здавалка
Главная | Обратная связь

Пример программы работы с типизированным файлом



Пусть требуется составить программу, которая создает на диске файл данных “Телефонного справочника”, обеспечивает ввод и изменение данных, поиск номера телефона по фамилии абонента.

Program BookPhone; {Телефонный справочник}

Uses Crt;

Type

StFio=string[20];

StPhone=string[10];

RecBook=record {Запись сведений об абоненте}

FIO:StFio;

Phone:StPhone;

End;

Var

BookFile:file of RecBook; {Переменная для файла с записями RecBook}

Work:RecBook; {Переменная для доступа к записям}

 

Vid:byte;

End_Menu:boolean;

Name:String[12];

Procedure Name_File; {Ввод имени файла данных}

Begin

Write(‘Введите имя файла данных телефонного справочника’);

Readln(Name);

End;

Procedure AddRec; {Добавление записи в файл}

Begin

Writeln(‘Ввод записи № ’, FilePos(BookFile)+1); {+ 1 - указывает номер физической записи (к номеру логической записи добавляется 1) }

With Work do

Begin

Writeln(‘Введите фамилию ’);

Readln(FIO);

Write(‘Введите номер телефона ’);

Readln(Phone);

Write(BookFile,Work); {Записать в файл значение переменной Work: фамилию и номер телефона}

End;

End;

Procedure Create_Book_Phone; {Создание нового файла данных}

Var

Ind,Count:integer;

Begin

Name_File;

Assign(BookFile, Name); {Открыть новый файл для записи}

Rewrite(BookFile);

Writeln(‘Создание записей файла ’, Name);

Write(‘Введите число записей в справочнике’);

Readln(Count);

For Ind:=1 to Count do

AddRec;

Writeln(‘Создание фала завершено’);

Writeln(‘Файл данных имеет , FileSize(BookFile), записи’);

Close(BookFile);

End;

Procedure OutputRec; {Вывод текущей записи на экран}

Begin

Read(BookFile,Work);

With Work do

Begin

Write(‘Запись № ’,FilePos(BookFile),’:’);

Writeln(‘ФИО: ’, Fio, ‘телефон: ’,Phone);

End;

End;

 

Procedure OutputAllRec; {Вывод всех записей файла на экран}

Begin

Name_File;

Assign(BookFile,Name);

{$I-}

Reset(BookFile);

{$I+}

if IOResult=0 then

begin

Seek(BookFile,0); {Установка на первую запись}

Writeln(‘Вывод телефонного справочника из файла’, Name);

While (not EOF(BookFile)) do

OutPutRec;

End

Else

Writeln(‘Файла с именем ’ +Name+’ на диске нет’);

End;

Procedure UpdateRec;

Var

NumRec: LongInt;

Begin

Name_File;

Assign(BookFile,Name); {Открыть новый файл для записи}

{$I-}

Reset(BookFile);

{$I+}

if IOResult=0 then

begin

Write(‘Укажите номер изменяемой записи’);

Readln(NumRec);

Seek(BookFile,NumRec-1); {Установка файловой позиции по указанному номеру записи}

Writeln(‘–Старое значение записи:’);

OutputRec; {Вывод записи и переход на следующую}

Seek(BookFile,NumRec-1); {Возврат на прежнюю позицию}

Writeln(‘Задаем новое значение ’, NumRec, ‘записи’);

AddRec;

Close(BookFile);

End

Else

Writeln(‘Файла с именем ’+Name+’ на диске нет’);

End;

Procedure AddRecToEnd; {добавление записи в конец файла}

Begin

Name_File;

Assign(BookFile,Name);

{$I-}

Reset(BookFile);

{$I+}

if IOResult=0 then

begin

Seek(BookFile,FileSize(BookFile)); {Установка текущей позиции в конец файла}

AddRec;

Writeln(‘Измененный файл данных имеет’, FileSize(BookFile),’записи’);

Close (BookFile);

End

Else

Writeln(‘Файла с именем ’+Name+’ на диске нет);

End;

Procedure FindFio; {Поиск номера телефона по фамилии абонента}

Var

BookFile:file of RecBook;

Work:RecBook;

Maska:StFio;

Rez_Find:boolean;

CountRec:integer;

Begin

Name_File;

Assign(BookFile,Name);

{$I-}

Reset(BookFile);

{$I+}

if IOResult=0 then

begin

Write(‘Введите фамилию для поиска’);

Readln(Maska);

RezFind:=False;

CountRec:=0;

While(not Eof(BookFile)) do {Просмотреть все записи до конца файла}

Begin

Read(BookFile,Work);

With Work do

If Pos(Maska,Fio)<>0 then{Найдена запись абонента с указанной фамилией}

Begin

Rez_Find:=True;

Inc(CountRec);

Writeln(‘Фамилия ’, Fio,’телефон ’,Phone);

End;

End;

If Rez_Find then

Writeln(‘Число записей для ’, Maska,’=’,CountRec)

Else

Writeln(‘В справочнике нет абонентов с фамилией ’, Maska);

Close(BookFile);

End

Else

Writeln(‘Файла с именем ’+Name+’ на диске нет’);

End;

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

Begin

ClrScr;

End_Menu:=False;

Repeat {Повторять показ меню, пока End_Menu=False}

Writeln(‘Телефонный справочник ’);

Writeln(‘Выберите вид работы ’);

Writeln(‘1-создание нового файла ’);

Writeln(‘2-просмотр списка справочника ’);

Writeln(‘3-изменение записи’);

Writeln(‘4-дополнение справочника’);

Writeln(‘5-поиск абонента ’);

Writeln(‘0-завершение работы ’);

Write(‘Ваш выбор ’);

Readln(Vid);

Case Vid of {Вызов разных процедур в зависимости от вида работы}

1: Create_Book_Phone;

2:OutPutAllRec;

3:UpdateRec;

4:AddRecToEnd;

5:FindFio;

0:End_Menu:=True;

end;

Writeln(‘Нажмите клавишу Enter’);

Readln;

ClrScr;

Until End_Menu; {Больше не выводить меню)

End.

В начале программы очищается экран, переменной End_Menu присваивается значение False, и затем на него с помощью оператора повтора repeat выводится текст меню из шести пунктов. В заключение списка вариантов меню выводится запрос и считывается значение переменной Vid, задаваемое пользователем в соответствии с избранным видом работы со справочником.

В зависимости от значения селектора Vid оператор выбора case осуществляет выбор, т. е. выбирают соответствующую значению константы выбора процедуру (например, если Vid=2, то вызывается процедура OutputAllRec для вывода всего содержимого справочника). После выполнения процедуры управление программой передается в конец оператора case, и, так как значение переменной End_Menu не равно True, оператор повтора repeat выполняется вновь, очищая экран и выводя список меню, и так до тех пор, пока пользователь выберет завершение работы. В результате этого переменной Vid будет присвоено значение 0, из-за чего в операторе case переменной End_Menu будет присвоено значение True, и цикл repeat завершится.

В начале процедуры создания нового файла данных справочника записан вызов процедуры задания имени файла данных Name_File. Процедура Name_File записана выше по тексту программы. Создание нового файла данных производится с использованием стандартной процедуры Rewrite. Ввод записей об абонентах описывается с использованием оператора повтора for, параметр Ind которого, изменяясь от 1 до числа записей Count, будет указывать порядковый номер записи с данными абонента в файле. Добавление одной записи в файл данных сделанов виде процедуры AddRec, которая также записана выше в тексте программы.

В окончании процедуры организуется вывод сообщения о результатах создания файла. Для измерения размера файла в записях используется функция FileSize.

Для сокращения записи при обращении к полям Fio и Phone переменной типа запись Work используется предложение with Work do.

Для вывода на экран всех записей файла сначала, используется функция IOresult, выполняется проверку, есть ли данный файл на диске. Если функция IOresult возвращает значение, отличное от 0, то на экран выводится сообщение о том, что данного файла на диске нет, иначе позиционируется указатель на первую запись Seek(BookFile, 0), а затем, используя оператор повтора while, записывается вызов процедуры вывода на экран одной записи OutputRec. Условием окончания цикла while будет выражение Eof(BookFile). Как только оно выполнится, цикл завершится. Данные всех записей файла выведены на экран.

В процедуре поиска номера телефона описаны локальные переменные: Maska типа StFio, которая будет принимать значение фамилии искомого абонента; Rez_Find типа boolean, которая будет принимать значения True или False в зависимости от результатов поиска; CountRec типа integer, значение которой будет равно числу записей с такой фамилией.

После записи запроса имени файла данных справочника и проверки есть ли он на диске, в случае если файл есть, записывается запрос о фамилии искомого абонента. Перед поиском присвоено значения Rez_Find:=False и CountRec:=0. Просмотр всех записей файла данных при поиске записан, используя оператор повтора while. Условие завершения поиска- Eof(BookFile) - достижение конца файла. Если значение поля Fio очередной записи совпадает со значением переменной Maska, то переменной Rez_Find присваивается значение True (абонент найден), значение переменной CountRec увеличивается на 1 и печатается сообщение о фамилии и номере телефона найденного абонента.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.