Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
50
Добавлен:
27.10.2018
Размер:
568.83 Кб
Скачать
  1. Сравнительный анализ возможностей процедуры и функции. Возможности преобразования процедуры в функцию и наоборот

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

Синтаксис заголовка процедуры: PROCEDURE < имя процедуры > [( <список формальных параметров >)];

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

Синтаксис заголовка функции: FUNCTION < имя функции >[(<список формальных параметров>)]: <тип результата>;

Размещение:

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

Отличие описания функции от процедуры:

  • результатом обращения к функции может быть одно единственное значение;

  • идентификатор результата не указывается в списке формальных параметров;

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

  • после списка формальных параметров задается тип результата;

  • после обращения к функции управление передается на выполнение следующей операции данного выражения (в соответствии с приоритетом).

Преобразование процедуры в функцию:

Только если на выходе процедуры 1 результат

PROCEDURE P1 (A,B,C : Integer; VAR Sum : Integer)

Begin

Sum:=A+B+C;

End;

Преобразование функции в процедуру:

ВОЗМОЖНО ВСЕГДА

  1. Понятие рекурсии. Рекурсивные процедуры и функции, их применение, достоинства и недостатки

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

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

Рассмотрим пример. Вычислить значение F=M! Рекурсивное

определение значение факториала можно записать следующим образом:

при М=1 F=1

при М> 1 F= M!= M*(M-1)!, т.е. М! определяется через (М-1)!

a) Рекурсивная функция

PROGRAM MAIN;

VAR M: INTEGER;

F:REAL;

FUNCTION FACT (N:INTEGER): REAL;

BEGIN

IF N=1 THEN

FACT:=1

ELSE

FACT:= N* FACT(N-1);

END;

BEGIN

READLN(M);

F:= FACT ( M );

WRITELN (' M!=', F);

END.

b) Рекурсивная процедура

PROGRAM MAIN;

VAR M: INTEGER;

F:REAL;

PROCEDURE FACT(N:INTEGER; VAR F: REAL);

VAR Q : REAL;

BEGIN

IF N=1 THEN Q:=1

ELSE FACT(N-1,Q);

F:=N*Q;

END;

BEGIN

READLN(M);

FACT ( M, F );

WRITELN (' M!=', F);

END.

B варианте а) при м=4 выполняются следующие действия:

FACT:=4*FACT(3); FACT:=3*FACT(2); FACT:=2*FACT(1); FACT(1):=1.

При входе в функцию в первый раз отводится память под локальную переменную, соответствующую параметру-значению; ей присваивается значение фактического параметра (М). При каждом новом обращении строятся новые локальные переменные. Так как FACT(1)=1, то выполнение функции заканчивается. После этого выполняются действия:

FACT(1):=1; FACT:=2*FACT(1);

FACT(2):=2; FACT:=3*FACT(2);

FACT(3):=3*2=6; FACT:=4*FACT(3); т.е. FACT=24.

  1. Область действия (видимости) имен. Глобальные и локальные переменные. Достоинства и недостатки использования глобальных переменных и параметров при обмене информацией между программами. Рекомендации по применению

Любая подпрограмма представляет собой блок со своей областью описаний. Она может содержать внутри этого блока описания других процедур и функций, а также обращения к ним. Объекты, описанные внутри какого-либо блока, являются по отношению к нему локальными и не доступны внешним блокам. На них можно ссылаться только внутри блока, в котором они описаны. Под объектами понимаются имена констант, типов, переменных, процедур, функций. Объекты, описанные во внешних блоках и не описанные во внутренних, являются глобальными по отношению к внутренним и доступны как во внешних блоках, так и во внутренних. При совпадении имен глобальных и локальных переменных, локальные переменные отменяют действия глобальных в пределах области своего действия.

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

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

Достоинства и недостатки глобальных переменных:

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

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

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