Однако на практике рационально объеденить продвижение по файлу с обращением к буферной переменной. Поэтому Н.Виртом были введены еще две процедуры Read, Write (и соответственно Readln, Writeln для работы с текстовыми файлами).
Действие процедуры Read(A,X) эквивалентно действию следующих операторов X:=A^ ; Get(A). Действие процедуры Write(A,X) екви-валентно аналогично A^:=X; Put(X). Поэтому на практике применение процедур Get и Put ограничено.
Действие процедур Read, Readln, Write, Writeln было рассмотрено ранее в разделе 4.4 применительно к текстовым файлам. Процедуры Read, Writeработают с файлами любых типов, отличных от текстового типа.
При этом стандартом предусмотрено, что при передаче данных происходит их неявное преобразование. Если первый параметр этих процедур — переменная файлового типа (например, А), то чтение или запись данных связаны именно с этой переменной А.
Пример. На внешнем носителе находится файл, содержащий последовательность целых чисел. В программе ввести числа, найти их сумму и распечатать ее значение.
program Sum (Output, Int); type
Int = file of integer; var
С: int;
X, S, integer; begin S:=0; Reset (C) ; While not Eof(C) do begin
Read (С, X); S:=S+X end; Writeln (S) end.
6.5. Рекурсия
Использование имени процедуры или функции в тексте этой же процедуры (функции) предполагает ее рекурсивное выполнение.
Задачи, которые естественным образом формулируются как рекурсивные, часто приводят и к рекурсивным решениям.
Решение задачи рекурсивно, если оно выражается в терминах решения более простой версии той же задачи и кроме этого в нем предусмотрено решение самого простого варианта задачи.
Необходимо отметить, что при каждом вызове процедуры (функции) создается новый набор формальных параметров и локальных переменных.
В Паскале все процедуры и функции рекурсивны. При рекурсивном вызове процедур или функций используется стековая организация хранения параметров и адресов возврата. В момент ухода в блок в стеке запоминается адрес возврата, слово состояния программы PSW, значение фактических параметров. Локальные переменные тоже помещаются в стек. Такой механизм хранения информации очень удобен для вызова процедурами (функциями) самих себя.
Пример Написать программу вычисления значения функции Хп, где n — целое положительное число, большее или равное нулю.
function Power (X: real; N : integer): real; begin
if N=0 then
Power := 1 else
Power := X*Power (X, N-1) end;
Вызов этой функции имеет вид: Y := Power (4, 2) ;
6c6. Пример «Ханойские башни»
В конце XIX века в Европе распространилась игра под названием «Ханойские башни». Ханой — древняя столица Вьетнама. Легенды говорят о том, что в эту игру играли брахманы — служители храма.
Для игры использовалась медная платформа, на которой били укреплены три алмазные иглы. На иглы насаживались золотые диски-кольца. Цель игры — перенести башнюслевой иглы на правую, причем за один раз можно переносить только одно кольцо и при этом можно насаживать только кольцо с меньшим диаметром на кольцо с большим диаметром.
Итак, для обращения к процедуре переноса башни с именем MoveTower следует записать:
MoveTower(3,Left, Rigtn, Middle);
что означает, что нужно перенести башню из трех дисков с левой иглы на правую. В качестве рабочей использовать среднюю иглу. Рассмотрим алгоритм переноса башни из трех дисков.
Программа «Ханойские башни» имеет вид:
program Towers (Input, Output); type
Position = (Left, Centre, Right); var
N: integer;
procedure MoveDisk (From, Tol: Position); procedure WritePos (P: position); begin { writepos } case P of
Left: Write ('1'); Right: Write ('3'); Centre: Write ('2') ; end { case} end {WritePos } begin { MoveDisk } WritePos (From); Write ('-'); WritePos (Tol) WriteIn end { MoveDisk
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.