Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль.doc
Скачиваний:
58
Добавлен:
07.06.2015
Размер:
1.21 Mб
Скачать

21.2.2. Использование прямого доступа к записям типизированного файла

Прямой (произвольный) доступ – это способ обработки файла, при котором можно в любой момент выполнять обращение к любой записи файла. Как уже отмечалось, такой способ возможен для файлов всех типов, кроме текстового (т.е. для типизированных и нетипизированных). Напомним также, что в таких файлах каждой записи ставится в соответствие ее порядковый номер. Номера имеют значения 0, 1, 2, …

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

Для установки указателя на нужную запись используется специальная процедура Seek, которая в общем виде записывается так:

Seek (Файл, Номер_записи);

Пример. Seek(Filank,10); – поиск 10–той записи

Seek(f,i); – поиск i–той записи.

Обычно применяют пары:

Seek Seek

Read или Write

Пример 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"), например изменение фамилии абонента. Обычно при коррекции сначала просматривают содержимое записи, а потом, если необходимо, изменяют его. Поскольку после выполнения пары операторов:

Seek(Файл, Номер);

Read(Файл, Запись);

или

Seek (Файл, Номер);

Write(Файл, Запись);)

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

При работе программы должен вводиться номер телефона, и если он есть в справочнике, то на экран должны выдаваться фамилия и адрес его владельца. После этого задается вопрос о необходимости коррекции фамилии и в случае утвердительного ответа вводится новая фамилия. Если набран номер, которого в справочнике нет, то необходимо вывести сообщение об этом.

Программа будет иметь вид.

Program Updtel;

Type

Tel=Record

Nom : Integer;

Fam,Adr : String[15];

End;

Var

Ftel : File Of Tel;

Rtel : Tel;

K,Num : Integer;

S : Char;

Begin

Assign(Ftel,’Tsprav’);

Reset(Ftel); { Открытие файла }

Repeat {Поиск фамилии и адреса абонента по номеру телефона}

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

ReadLn(k);

Seek(Ftel,k);

If Not Eof(Ftel) then

Begin

Read(Ftel,Rtel);

With Rtel do

Write (’Фамилия: ’,fam,’ Адрес: ’,Adr);

Writeln(’Будем менять фамилию?-Д/Н Y/N’);

Readln(S);

If (S=’Д’) (S=’д’) Or (S=’Y’) Or (S=’y’) then

Begin

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

Read (Rtel.fam);

Seek (Ftel,k);

Write(Ftel,Rtel);

end;

End

else

Writeln (’Неправильный номер’);

Writeln (’Продолжаем?-Д/Н Y/N’);

Readln(S);

Until (S=’H’) Or (S=’н’) Or (S=’n’) Or (S=’N’);

Writeln (’Конец работы, нажмите клавишу Enter’);

Readln;

end.