Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию..pdf
Скачиваний:
10
Добавлен:
15.11.2022
Размер:
12.2 Mб
Скачать

Поэтому переменные М и ЛГ, используемые в процедуре, получают свои значения через оператор присваивания в основном блоке про­ граммы. Результат получается в глобальной переменной Jf, значение которой выводится на экран.

Использование механизма передачи через параметры делает про­ цедуру более универсальной, независимой от основной программы. Однако в некоторых случаях оказывается удобнее использовать пере­ дачу через глобальные переменные. Чаще такое бывает с процедурами, работающими с большими объемами информации. В этой ситуации глобальное взаимодействие экономит память ЭВМ.

7.2. Подпрограммы-функции

Теперь выясним, что такое подпрограмма-функция. Обычно фун­ кция используется в том случае, если результатом подпрограммы дол­ жна быть скалярная (простая) величина. Тип результата называется типом функции. В Турбо-Паскале допускаются функции строкового типа.

Структура описания функции:

< описание функции>

<блок>— ►

------------ *-------------------------

<оаголовок> — K i ) —

< заголовок>

function — >• <имя функции>

<ти п > -

 

< список формальных параметров>

Как и у процедуры, у функции в списке формальных параметров могут присутствовать параметры-переменные и параметры-значения. Все это — аргументы функции. Параметры вообще >*огут отсутство­ вать (если аргументы передаются глобально).

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

Program

N0D3;

 

 

 

Var А,

В,

Rez

Integer;

 

Function

Evklid(M, N

Integer)

Integer;

Begin

 

 

 

 

 

While M <> N Do

I f M > N

Then M := M - N

 

Else N := N - М;

 

Evklid

М

 

End;

 

 

 

Begin

 

 

 

W rite(, a=

') ;

 

ReadLn(A);

 

 

W rite('b=

’ ) ;

 

ReadLn(B);

 

 

Rez :=

Evklid(Evklid(A

+ B, Abs(A - В)), A * B) ;

Writ eLnO NOD равен *,

Rez)

End.

 

 

 

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

с тем же именем, что и функция.

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

<имя функции>(<список фактических гхараметров>)

Правила соответствия между формальными и фактическими параме­ трами все те же.

Сравнивая приведенные выше программы, можно сделать вывод, что программа N0D3 имеет определенные преимущества перед дру­ гими. Функция позволяет получить ^гоуяьтат путем выполнения одного оператора присваивания. Здесь иллюстрируется возможность того, что фактическим аргументом при обращении к функции может быть эта же функция.

По правилам стандарта Паскаля возврат в вызывающую программу из подпрограммы происходит, когда выполнение^подпрограммы дохо­ дит до ее конца (последний end). Однако в ТУрбо-Паскале есть сред­ ство, позволяющее выйти из подпрограммы в любом ее месте. Это оператор-процедура Exit. Например, функцию определения наиболь­ шего из двух данных вещественных чисел можно описать так:

Function

Мах(Х,

Y

Real)

Real;

Begin

 

 

 

 

 

Max

:=

X;

 

 

 

I f X

> Y Then

Exit

Else Max

:= Y

End;

 

 

 

 

 

Из подпрограммы В1 можно обратиться к А, поскольку ее описание является глобальным по отношению к В1, но нельзя обратиться к А1, поскольку область действия описания А1 не распространяется на блок подпрограммы В.

Из подпрограммы В22 можно обратиться только к В21, В1, А. Объ­ ясните сами, почему?

Все понятно? Если нет, то прочитайте еще раз этот раздел. Очень важно в нем разобраться.

Если одно и то же имя описано во внешнем блоке (глобально) и во внутреннем блоке (локально), то последнее описание (локальное) пере­ крывает первое в пределах внутреннего блока. Рассмотрим следующий пример:

Program

Examplel;

Program

Example2;

 

Var X

Integer;

Var X

Integer;

 

Procedure P;

Procedure P;

 

Var X

Integer;

Begin

WriteLn(*x«

X)

Begin WriteLnOx * } , X)

End;

 

 

End;

 

Begin X

:■ 1;

 

Begin X

:* 1;

P

 

P

 

End.

 

 

End.

 

 

 

 

Что выведется на экран в результате работы программы Examplel и Ехатр1е2? Первая программа выдаст результат:

х =

На месте многоточия будет какое-то произвольное значение, соответ­ ствующее неопределенной величине х. Вторая программа в результате даст

X = 1

Впервом случае переменная с именем х описана как глобально, так

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

Во втором примере переменная х одна на всю программу. Она опи­

сала глобально. Поэтому значение 1, присвоенное ей в основной про­ грамме, передается и в подпрограмму.

Теперь составим программу, по которой машина рассчитает алго­ ритм работы монахов и выведет его для любого значения п (количества дисков). Пусть на площадке А находится п дисков. Алгоритм решения задачи будет следующим:

1. Если п = 0, то ничего не делать.

2. Если п > 0, то переместить п - 1 диск на С через В; переместить диск с А на В (А=*В); переместить п - 1 диск с С на В через А.

При выполнении пункта 2 последовательно будем иметь три состо­ яния:

А

В

С

Рис. 7.3

Описание алгоритма имеет явно рекурсивный характер. Переме­ щение п дисков описывается через перемещение п - 1 диска. А где же выход из этой последовательности рекурсивных ссылок алгоритма самого на себя? Он в пункте 1, как бы не показалось странным его тривиальное содержание.

А теперь построим программу на Паскале. В ней имеется рекурси­ вная процедура Налоу, выполнение которой заканчивается только при п = 0. При обращении к процедуре используются фактические имена площадок, заданные их номерами: 1, 2, 3. Поэтому на выходе цепочка