Смекни!
smekni.com

НН Трушин Информатика (стр. 24 из 37)

В языке Turbo Pascal можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а согласование формальных и фактических параметров возлагается на программиста.

6.9.4. Рекурсивные подпрограммы

Язык Turbo Pascal допускает, чтобы подпрограмма вызывала саму себя. Такой прием программирования получил название рекурсивное обращение. Для некоторых алгоритмов рекурсивное оформление подпрограммы может быть более компактным и эффективным, но следует помнить, что количество рекурсивных вызовов ограничено. Классическим примером рекурсивной подпрограммы служит функция вычисления факториала числа.

Пример. Рекурсивное вычисление факториала числа N.

Function Factorial(N: Byte): LongInt;

Begin

IF N in [0,1] Then Factorial:=1

Else Factorial:=N*Factorial(N-1) End;

6.10. Организация ввода-вывода данных

В языке Turbo Pascal ввод-вывод данных осуществляется через файловые переменные. Процесс ввода-вывода в программе состоит из следующих основных действий:

1) связать файловую переменную с конкретным внешним файлом или устройством (используется процедура Assign);

2) открыть файл (используются процедуры Reset, Rewrite, Append);

3) осуществить передачу информации (используются процедуры Read, Write, ReadLn, WriteLn);

4) закрыть файл (используется процедура Close).

В языке Turbo Pascal предусмотрены три категории файлов: текстовые (тип Text), типизированные (file of <тип>), файлы без типа (file). Работа с этими категориями файлов несколько отличается друг от друга.

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

Требование закрытия файла должно обязательно соблюдаться для файла, в который производилась запись.

Во время трансляции в программу обычно автоматически включаются средства проверок операций ввода-вывода. При возникновении ошибки программа автоматически завершается. Проверку ошибок можно отключить с помощью директивы транслятора {$I-}. В этом случае при возникновении ошибок ввода-вывода программа прерываться не будет, а результат операции ввода-вывода можно проверить с помощью функции IOResult.

6.10.1. Стандартные процедуры и функции для всех типов файлов

Во всех описываемых ниже стандартных процедурах и функциях идентификатор F принадлежит файловой переменной.

Assign(F,Name) – процедура, связывающая файловую переменную F с файлом или устройством, имеющим имя Name. Name – константа или переменная строкового типа.

Close(F) – процедура закрытия файла.

Erase(F) – процедура уничтожения файла.

Remane(F,NewName) – процедура переименования файла. Параметр NewName – константа или переменная строкового типа.

Reset(F) – процедура открытия существующего файла.

Rewrite(F) – процедура открытия нового файла.

Для работы с каталогами на магнитных дисках имеются специальные процедуры ChDir, GetDir, MkDir, RmDir.

Eof(F) – логическая функция, которая принимает значение "истина", если в результате последней операции ввода-вывода обнаружен конец файла. В противном случае функция имеет значение "ложь".

IOResult – функция, возвращающая результат последней операции ввода-вывода. Возвращает число 0, если операция завершилась успешно, или другое число – в противном случае.

Периферийные устройства ПЭВМ, с которыми осуществляется обмен информацией, могут быть описаны как файлы со следующими стандартными именами:

CON – консоль, с которой по умолчанию связаны стандартные файловые переменные Input (клавиатура) и Output (дисплей);

PRN или LPT1 – печатающее устройство;

NUL – фиктивное устройство, которое поглощает выводимую информацию. При вводе с такого устройства возникает ситуация "конец файла". Используется главным образом для отладки программ.

6.10.2. Стандартные процедуры и функции для текстовых файлов

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

В языке Turbo Pascal предусмотрены две стандартные файловые переменные для текстового файла: Input и Output. Переменная Input по умолчанию связана с клавиатурой, а переменная Output – с дисплеем. Эти устройства автоматически открываются при запуске программы и автоматически закрываются после работы программы.

Для работы с тестовыми файлами в языке Turbo Pascal предназначены следующие процедуры и функции:

Append(F) – процедура открытия существующего файла для

добавления в его конец информации;

Read(F,<список ввода>) – процедура чтения информации из файла;

ReadLn(F,<список ввода>) – процедура чтение строки из файла;

Write(F,<список вывода>) – процедура записи информации в

файл;

WriteLn(F,<список вывода>) – процедура записи строки в файл;

Eoln(F) – логическая функция, которая принимает значение "истина", если в результате последней операции ввода-вывода обнаружен признак конца строки или признак конца файла. В противном случае функция имеет значение "ложь".

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

Список ввода в процедурах Read и ReadLn представляет собой переменные, разделенные запятыми, которым присваиваются вводимые значения. Переменные могут быть целого, вещественного, символьного и строкового типов. Их количество может быть любым. Процедура ReadLn, так же как и процедура Read, читает значения переменных, но непрочитанная часть строки, включая признак конца строки, пропускается. Если список ввода отсутствует, процедура Read не выполняет никаких действий, а процедура ReadLn будет ждать нажатия клавиши ENTER. Так как в текстовом файле информация хранится в виде символов, то при вводе числовых значений автоматически производится их преобразование в двоичный формат.

Список вывода в процедурах Write и WriteLn – это перечисленные через запятую выражения, значения которых выводятся в текстовый файл. Выражения могут быть целого, вещественного, символьного, строкового и логического типов. Число элементов списка может быть любым. Если список вывода отсутствует, процедура Write не выполняет никаких действий, а процедура WriteLn выводит пустую строку. При выводе числовых значений происходит их автоматическое преобразование в символьную форму. Логические значения выводятся в виде слов TRUE или FALSE.

При выводе информации в текстовый файл по умолчанию отводится количество позиций, равное размеру этой информации. Например, при выводе символа отводится одна позиция, при выводе строки – число позиций, равное длине строки, при выводе целого числа – число позиций, равное числу значащих цифр плюс одна позиция для знака отрицательного числа. Это необходимо учитывать при выводе последовательных элементов информации (например, нескольких чисел) и предусматривать меры, чтобы отдельные элементы информации не сливались друг с другом: вывод разделяющих пробелов, разнесение информации по разным строкам и т.д. Исключение составляют вещественные числа – под них выделяется 17 позиций, и при выводе они выравниваются по правому краю выделенного поля.

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

WriteLn(<выражение>:M); {Первый формат}

Write(<выражение>:M:N); {Второй формат}

Форматы M и N представляют собой выражения целого типа. Первый формат можно использовать при выводе значений любого типа, и он определяет размер поля, в которое выводится значение. Выводимая информация выравнивается по правому краю поля. Если для вывода информации выделенного поля недостаточно, оно автоматически увеличивается до нужного размера. Для вывода вещественного числа всегда отводится не менее восьми позиций, даже если значение M меньше 8.

Второй формат используется только для вывода вещественных чисел. Значение N определяет число знаков, выводимых после десятичной точки. Если используется второй формат, то вещественное число представляется в форме с фиксированной точкой, иначе – с плавающей точкой.

Если значение M отрицательное, то выравнивание информации будет производиться по левому краю поля.

Пример. Вывести на дисплей таблицу умножения целых чисел от 1 до 9.

Program EXAMPLE;

Var i,j: Byte;

BEGIN

WriteLn('ТАБЛИЦА УМНОЖЕНИЯ':45);

Write(' ':10);

For j:=1 to 9 do Write(j:6);

WriteLn;

For i:=1 to 9 do

Begin

Write(i:6,' ':4);

For j:=1 to 9 do Write((i*j):6); WriteLn

End END.

6.10.3. Стандартные процедуры и функции для типизированных файлов

При работе с типизированными файлами используются следующие процедуры и функции:

Read(F,<список ввода>) – процедура чтения информации из файла;

Write(F,<список вывода>) – процедура записи информации в

файл;

Seek(F,Num) – процедура позиционирования на заданную компоненту файла. Нумерация компонент начинается с 0. Num – выражение целого типа;

Truncate(F) – процедура удаления хвостовой части файла начиная с текущей позиции;

FilePos(F) – функция, вычисляющая номера текущей компоненты

файла (целого типа);

FileSize(F) – функция, вычисляющая текущий размер файла в компонентах (целого типа).

Пример. Из текстового файла прочитать попарно вещественные числа, считая в каждой паре первое число действительной, а второе – мнимой составляющей, и записать их в файл комплексных чисел.

Program EXAMPLE;

Type

Complex=record