Пример 1.Создание файла с использованием прямого доступа
Иногда встречаются случаи, когда запись в файле может определяться своим порядковым номером. Например, табельный номер служащего или телефонный номер может равняться порядковому номеру записи в файле. В таком случае использование прямого доступа является совершенно естественным.
Как правило, такой файл рекомендуется предварительно заполнить начальной информацией (нулями, пустыми строками). Затем в него записывается основная информация по номерам записей: по порядку или в разнобой, как это требуется в задаче.
Условие.Составить программу, формирующую телефонный справочник для учрежденческой АТС, имеющей двухзначные номера. Структура записей файла следующая:
№ телефона, Фамилия, Адрес (улица, номер дома и квартиры)
Справочник имеет номера от 00 до 99.
Алгоритм создания такого файла может быть таким
1. Открыть файл для записи.
2. Сформировать "пустую запись".
3. Для номера (k) от 0 до 99 выполнить
переписать "пустую" запись в файл справочника
4. Повторять
4.1. Ввести номер,
4.2. Установить указатель файла на номер
4.3. Ввести Фамилию и Адрес,
4.4. Переписать в файл
Пока не надоест.
5. Закончить.
Уточняем алгоритм.
1. Открыть файл для записи
2. Сформировать "пустую запись":
2.1. Номер (N) = 0
2.2. Фамилия = ’’ { Пустая строка }
2.3. Адрес = ’’ { Пустая строка }
3. Для номера (k) от 0 до 99 выполнить
3.1. Установить указатель на номер k
3.2. Переписать запись в файл.
4. Повторять
4.1. Ввести номер,
4.2. Установить указатель файла на номер
4.3. Если не конец файла, то
а) Ввести Фамилию и Адрес,
б) Переписать запись в файл
Иначе
Вывести сообщение "Неправильный номер"
Пока не надоест.
5. Закончить.
Программа для этого алгоритма будет иметь следующий вид.
Program Sprav;
Const
N = 99;
Type
Tel=Record {запись справочника}
Nom : Integer;
Fam : String[15];
Adr : String[15]
End;
Var
fTel : file of Tel; {Телефонный справочник}
Rtl : Tel; {Одна запись файла}
K : integer;
S : char;
Begin
Assign(ftel,’tsprav’);
Rewrite (ftel); {п. 1.}
With Rtl do {п. 2. Создание "пустой" записи}
Begin
Nom := 0;
Fam := ’’;
Adr := ’’;
End;
{п. 3. Заполнение НД пустыми записями}
For k:=0 to n do
Begin
Seek(ftel,k);
Write(ftel,Rtl);
end;
{п. 4. Заполнение Набора Данных информацией}
Repeat
Writeln (’Введите номер’) { п. 4.1. };
ReadLn (k);
Seek(ftel,k); { п. 4.2. }
If Not Eof(ftel) then { п. 4.3. }
Begin
With Rtl do
Begin
Writeln(’Фамилия’);
ReadLn (fam);
Writeln (’Адрес’);
ReadLn(Adr);
Nom := k;
end;
Write(ftel,Rtl);
end
Else
Writeln(’Неправильный номер’);
Writeln(’Продолжаем?-Да/Нет’);
Readln(S);
until (S=’H’) Or (S=’н’) Or(S=’n’) Or(S=’N’);
Writeln (’Конец работы. Нажмите клавишу ENTER’); {п. 5}
Readln;
end.
Пример 2.Работа с файлом: поиск и коррекция записей
Задача 1. Выполнить поиск номера телефона и его владельца по справочнику, сформированному в предыдущем примере. При работе программы должен вводиться номер телефона, и если он есть в справочнике, то на экран должны выдаваться фамилия и адрес его владельца. Если набран неправильный номер, которого в справочнике нет, то необходимо вывести сообщение об этом. Программа будет иметь вид
Program PskTel;
Type
Tel=Record
Nom : Integer;
Fam,Adr : String[15];
End;
Var
Ftel : File Of Tel;
Rtel : Tel;
Num : Integer;
S : Char;
Begin
Assign (Ftel,’tsprav’);
Reset (Ftel); { Открытие файла для чтения}
Repeat {Поиск фамилии и адреса абонента по номеру}
Write(’Введите номер телефона: ’);
ReadLn(Num);
Seek(Ftel,Num);
If Not Eof (Ftel) Then
Begin
Read (ftel,Rtel);
With Rtel do
Writeln(’Фамилия: ’,fam:15, ’ Адрес: ’, Adr:15, ’ Номер телефона: ’,nom);
End
else
Writeln(’Неправильный номер’);
Writeln (’Продолжаем?-Д/Н, Y/N’);
Readln (S);
Until (S=’H’) Or (S=’н’) Or (S=’n’) Or (S=’N’);
Writeln (’Конец работы. Нажмите клавишу ENTER’);
Readln;
End.
Задача 2.Коррекция телефонного справочника ("Tsprav"), например изменение фамилии абонента. Обычно при коррекции сначала просматривают содержимое записи, а потом, если необходимо, изменяют его. Поскольку после выполнения пары операторов: