Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_МЕТ№2.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
247.81 Кб
Скачать

3.1. Создание файла с прямым доступом

Вначале выполняется предварительное заполнение файла начальной информацией (нулями, пустыми строками). А затем в него записывается основная информация по номерам записей: по порядку или в разнобой, как это требуется в задаче.

Пример.

Составить программу, формирующую телефонный справочник для одной АТС по четырёхзначным номерам. Структура записей файла следующая:

N телефона Фамилия Адрес (улица, номер дома и квартиры)

Справочник имеет номера от 0000 до 9999. Тогда алгоритм будет иметь вид.

1. Открыть файл для записи

2. Сформировать "пустую запись"

3. Для номера (k) от 0 до 9999

переписать "пустую" запись в файл справочника

4. Повторять

ввести номер,

установить указатель файла на номер

ввести Фамилию и адрес,

переписать в файл

Пока не конец ввода

5. Закончить.

Уточняем алгоритм.

1. Открыть файл для записи

2. Сформировать "пустую запись"

2.1. Номер (N) = 0

Фам = ``

Адрес =``

3. Для номера (k) от 0 до 9999

3.1. Установить указатель на k

3.2. Переписать запись в файл.

4. Повторять

4.1. ввести номер,

4.2. установить указатель файла на номер

4.3. ввести Фамилию и адрес,

4.4. переписать запись в файл

Пока не конец ввода

5. Закончить.

Программа для этого алгоритма будет иметь следующий вид.

Program spav;

Const

n=9999;

type

tel=record {запись справочника}

nom:integer;

fam:string[15];

Adr:string[15]

end;

Var

ftel:file of tel; {Телефонный справочник}

Rtl:tel; {Одна запись файла}

k:integer;

S:char;

Begin

{Начальное заполнение НД, n.1}

Assing(ftel,`tsprav`);

Rewrite (ftel);

{n.2.1}

{ "Пустая" запись}

With Rtl do

begin

nom:=0;

fam:=’’;

Adr:=’’;

end;

{заполнение НД, n.3}

For k:=0 to n do

Begin

Seek(ftel,k);

Write(ftel,Rtl);

end;

{Заполнение НД информацией, n.4}

Repeat

{п. 4.1}

Writeln (`Введите номер`);

Read (k);

{п.4.2}

Seek(ftel,k);

if not Eof(ftel) then

begin

nom := k;

With Rtl do

Begin

{п.4.3}

Writeln(`Фамилия`);

Read (fam);

Writeln (`Адрес`);

Read(Adr);

end;

{п.4.4}

Write(ftel,Rtl);

end

else

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

Writeln(`Продолжаем?-Да/Нет`);

Readln(S);

until S=`H` ;

{п.5}

Writeln (`конец`);

end.

3.2. Работа с файлом: поиск и коррекция записей

Пример2.

Поиск номера телефона и его владельца по справочнику, сформированному в п. 3.1.

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

Program Psktel;

Type

tel=record

nom:integer;

fam,Adz:string[15];

end;

Var

ftel:file of tel;

Rtel:tel;

num:integer;

S:char;

Begin

{ Открытие файла для чтения}

Assign (ftel,`tsprav`);

Reset (ftel);

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

Repeat

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

Read(num);

Seek(ftel,num);

If not eof (ftel) then

Begin

Read (ftel,Rtel);

With Rtel do

Writeln(‘Фамилия:’,fam, ‘Адрес:’, Adr,’Номер тел.:’,nom);

End

else

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

Writeln (‘Продолжаем?–Да/Нет’);

Readln (S);

Until S=’H’;

end.

Пример 3.

Коррекция телефонного справочника ("tsprav"), например, - изменение адреса.

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

Seek (файл,номер);

Read (файл,поле);

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

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

Program updtel;

Type

tel=record

nom:integer;

fam,Adz:string[15];

end;

Var

ftel:file of tel;

Rtel:tel;

k,num:integer;

S:char;

Begin

{ Открытие файла для чтения}

Assign(ftel,`tsprav`);

Reset(ftel);

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

Repeat

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

Read(k);

Seek(ftel,k);

If not eof (ftel) then

Begin

Read(ftel,Rtel);

With Rtel do

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

Writeln(`Будем менять адрес?-Да/Нет`);

Readln(S);

If S=`Д`then

Begin

Writeln(`Введите адрес`);

Read (Rtel.Adr);

Seek (ftel,k);

Write(ftel,Rtel);

end;

End

else

writeln (`неправильный номер`);

Writeln (`Продолжаем?-Да/Нет`);

Readln(S);

Until S=`H`;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]