Символьные строки. Стандартные процедуры ввода-вывода. Пример «Ханойские башни»

Страницы работы

Фрагмент текста работы

Однако на практике рационально объеденить продвижение по файлу с обращением к буферной переменной. Поэтому Н.Виртом были введены еще две процедуры 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

Похожие материалы

Информация о работе