Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Паскалю.doc
Скачиваний:
14
Добавлен:
04.11.2018
Размер:
7.76 Mб
Скачать

Var temp : Integer;

Begin

If (k=n)

Then Max_element := a[n]

Else

Begin

temp := Max_element(a, k+1, n);

If (a[k] > temp)

Then Max_element := a[k]

Else Max_element := temp

End;

End;

Особенности рекурсии:

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

  • недостатки рекурсии состоят в следующем:

1. если глубина рекурсии велика, то программа будет требовать во время исполнения много памяти, что может привести к переполнению стека,

  1. рекурсивные алгоритмы, как правило, выполняются более медленно,

  • при рекурсивном программировании велика вероятность ошибок, вынуждающих программиста к перезагрузке компьютера.

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

В целях повышения безопасности работы рекомендуется:

  • для включения проверки переполнения стека необходимо использовать директиву компилятора {S+},

  • для включения проверки диапазона необходимо использовать директиву компилятора {R+},

  • в начале каждой рекурсивной процедуры или функции поместить строку If KeyPressed Then Halt. Она позволяет при зависании программы выйти из нее без перезагрузки компьютера, просто нажав любую клавишу.

Процедуры

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

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

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

Заголовок записывается как первая строка процедуры и начинается словом Procedure, за которым следует ее имя. После имени процедуры в скобках перечисляются имена и типы формальных параметров (аргументов процедуры). Заголовок заканчивается точкой с запятой:

Procedure Proc(n,m: Integer; a: Real; Var k: Integer; Var s, d: Real);

Описан заголовок процедуры Proc, зависящей от двух аргументов (входных параметров) целого типа n, m и аргумента a вещественного типа. Выходные (вычисляемые) параметры: переменная k целого типа и переменные s и d вещественного типа.

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

Procedure Zagolovok;

Begin

WriteLn(‘Группа ИС-09’);

WriteLn(‘Студент Иванов Иван’);

End;

В отличие от функций, использующих в качестве аргументов только параметры-значения, не изменяющиеся после выхода из функции, процедуры в качестве выходных (вычисляемых) параметров используют параметры-переменные. Любые операции над формальными параметрами-переменными внутри процедуры выполняются и над соответствующими фактическими параметрами-переменными. Поэтому формальному параметру-переменной должна соответствовать фактическая переменная, а не константа или выражение. В заголовке процедуры выходные параметры-переменные перечисляются в скобках после слова Var с указанием своего типа, причем для каждого нового типа это слово должно повторяться.

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

  • описания меток Label

  • определения констант Const

  • определения типов Type

  • описания переменных Var

  • описания процедур и функций Function, Procedure

  • операторов процедуры Begin … End;

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

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

Procedure Swap(x, y: Integer); x и y – входные параметры-значения

Var temp: Integer; temp – локальная переменная

Begin

temp := x; реализация алгоритма

x := y; циклического обмена

y := temp;

End;

Эта процедура ничего не делает: в списке формальных параметров указаны параметры-значения. Правильное описание с использованием параметров-переменных:

Procedure Swap(Var x, y: Integer); x и yвходные параметры-

Var temp: Integer; переменные

Begin

temp := x;

x := y;

y := temp;

End;

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

Program Primer;

Uses CRT;

Var a, b: Integer; a и b – переменные основной программы (глобальные)

Procedure Swap(Var x, y: Integer); x и yвходные параметры-

Var temp: Integer; переменные

Begin

temp := x;

x := y;

y := temp;

End;

Begin

ClrScr;

a := 3;

b := 5;

Swap(a, b); обращение к процедуре

WriteLn(‘a=’,a);

WriteLn(‘b=’,b);

ReadLn;

End.

На экран будет выведено:

a=5

b=3

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

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

Открытые массивы – это вектора, состоящие из элементов любого типа, кроме файлового. На место открытого массива в качестве фактического параметра можно передавать вектор любого размера, состоящий из элементов того же типа, что и элементы открытого массива:

Procedure Summ(a: Array Of Integer; Var summa: Integer);