Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгор_ТХТК_пособие.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.6 Mб
Скачать

Var X, y: Integer; begin

First(X, Y);

end;

Procedure First; {Снова краткий вызов первой процедуры}

Var z: Real; begin

Second(Z); end;

Директиву Forward можно использовать не только в рекурсивных подпрограммах, но и для более удобного размещения подпрограмм: сначала описать все заголовки, а затем - сами подпрограммы. Эту директиву не следует использовать в модулях для подпрограмм, объявленных в интерфейсе модуля.

Помимо непосредственной, возможна косвенная рекурсия, при которой подпрограмма а вызывает подпрограмму b, а подпрограмма b, в свою очередь, — подпрограмму а. Но как описать две подпрограммы, вызывающие одна другую? Ведь в описании любой из них, которое расположено первым в разделе опи­саний основной программы, будет вызов подпрограммы, описываемой дальше (т.е. в момент вызова еще неизвестной). Выход из этого затруднения предоставляет так называемое опережающее описание.

В Turbo Pascal допускается применение опережающего описания используемой подпрограммы, которое состоит только из ее заголовка, за которым следует ди­ректива FORWARD. В этом случае полный текст подпрограммы может быть расположен дальше в любом месте раздела описаний процедур и функций.

Как это будет выглядеть на примере подпрограмм а и b, о которых шла речь вы­ше? Схема исходного текста программы, в которой описаны указанные подпрограм­мы, может выглядеть так.

program к;

Var I:integer; j:real;

procedure a (x:integer);

forward; {Опережающее описание}

procedure b (y:real);

begin

a(i) {Вызов еще не определенной процедуры}

end;

procedure a;

begin

b(j) end;

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

Глава 8 Файлы

Данные, обрабатываемые программой, могут находиться не только в оперативной памяти компьютера, но и располагается на устройствах внешней памяти в файлах. Под файлом понимается либо именованная область внешней памяти ПК (жесткий диск, дискета, CD и т.д.), либо логическое устройство – потенциальный источник или приемник информации. Все что является файлом в MS DOS, является физическим файлом в Паскале.

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

В зависимости от способа объявления в Паскале можно выделить три вида файлов:

  • типизированные, может состоять из записей любого типа;

  • текстовые, состоит из строк символов. Конец записи определяется концом строки. Чтение и запись в файл осуществляется посимвольно;

  • нетипизированные, фактически представляют собой каналы ввода/вывода нижнего уровня, используемые в основном для прямого доступа к любому файлу на диске, независимо от его типа и структуры.

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

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

Когда программа завершает обработку файла, его нужно закрыть. Только после этого связанный с ним внешний набор данных будет обновлен. Затем файловая переменная может быть связана с другим набором данных, или обновленный набор данных может быть связан с другой файловой переменной.

Основными операциями над файлами являются:

1. Связь файла с набором данных осуществляется с помощью специальной процедуры Assign, которая в общем виде записывается так:

Assign(имя_файла, имя_НД);

Эта процедура присваивает имя внешнего набора данных имя_НД переменной файлового типа имя_файла.

Например. Assign(dan,’Isx.txt’); связь с файлом текущего каталога

Assign(datain,’а:\хх.dat’); связь с файлом на диске а:

Assign(datain,’LPT1’); связь с принтером

Assign(datain,’’); связь со стандартным файлом, как правило, файлом ‘CON’.

В операционной системе внешняя аппаратура, такая как клавиатура, принтер, дисплей, рассматриваются как устройства. С точки зрения программиста устройство можно представлять себе как набор данных и с ним можно работать, используя те же процедуры и функции, которые применяются для работы с файлом.

2. Процедура Rewrite (имя_файла) создает и открывает новый файл.

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

Если открывается текстовый файл, то он становится доступным только для записи.

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

Если открывается текстовый файл, то он становится доступным только для чтения.

4. Чтение из файла осуществляется с помощью известного оператора Read, который в общем виде записывается так:

Read(имя_файла, список); или

Readln(имя_файла, список); только для текстового файла!

Например. Read (dan,str);

Readln (datain,a,b,c);

5. Запись в файл осуществляется с помощью известного оператора Write, который в общем виде записывается так:

Write(имя_файла, список);

Writeln(имя_файла, список); - только для текстового файла

Например. Write (fl,x,y);

6. Закрытие выполняется процедурой Сlose(имя_файла) для открытого файла.

Параметр имя_файла может соответствовать файлу любого типа, который был предварительно открыт с помощью процедур Reset, ReWrite или Append. В момент закрытия осуществляется полное обновление внешнего набора данных, связанного с файловой переменной имя_файла, после чего связь с набором данных разрывается. Потом файл можно открыть снова.

Например. Close(fl);

7. Усечение файла выполняется процедурой Truncate(имя_файла). Параметр имя_файла может соответствовать файлу любого типа. Все записи после текущей позиции в файле имя_файла удаляются и текущая позиция становится концом файла (т.е. функция EoF(имя_файла) принимает значение True).