Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Uchebnoe_posobie_Programirovanie.docx
Скачиваний:
5
Добавлен:
08.12.2018
Размер:
217.65 Кб
Скачать

6.4. Функции

Описание функции в основном аналогично описанию процедуры. Однако, имеются два отличия.

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

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

Общий вид:

Function <имя> [(список фактических параметров)] :<тип>;

< тип> тип возвращаемого функцией результата.

Пример. Функция принимает любое число и возвращает его квадрат. Если значение квалрата больше 100, то оно считается равным 100. При этом устанавливается глобальный «флаг».

Var

glflag:boolen: {глобальный флаг}

Function getsqr (x:real):real;

Const

sqrmax=100; {локальная const}

begin

X:=x*x; {вычисление квадрата}

Glflag := (x>sqrmax); {результат сравнения в глобальный флаг]

If glflag then x:= sqrmax {ограничение x}

Getsqr :=x {возвращает значение}

end;

Begin {основной вызывающий блок}

Writeln (getsqr (6):7:2, ‘флаг:’, glflag)

End.

При объявлении формальных параметров в <списке формальных параметров>, тип любого параметра может быть только стандартным или ранее объявленным, потому, что нельзя объявить:

Procedure S(a:array[1…10] of real);

Проблема решается так:

Type

Atype = array [1..10] of real

Procedure S (a:atype)

В блок передается весь массив.

6.5. Процедура exit

GOTO нельзя использовать для досрочного выхода из подпрограммы. В Т-П для этой цели используется процедура EXIT.

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

Type

Arr_=array [1..100] of real;

Var

Ar:arr_

Function minus (var mas:arr_; N:integer):real;

Var

I:integer;

Begin

Minus :=0;

For i:=1 to n do

If mas[i]<0 then

Begin

Minus:=mas[i];

Exit

End;

End;

Begin

Writeln (‘Первое отрицательное число в массиве=’, minus(ar,50):7:2);

End.

6.6. Рекурсия

Использование рекурсии – преимущество Т-П. Под рекурсией понимается вызов функции (процедуры) из тела самой функции (процедуры)

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

В ряде случаев рекурсивное оформление более компактно и эффективно.

Пример. Вариант функции вычисляющей факториал числа N.

Function fact (n:integer):longint;

Begin

If n in[0..1] then fact:=1

else

fact :=n*fact (n-1)

End;

Если в функцию передается n>0, то происходит следующее:

  • запоминаются известные значения членов выражения;

  • для вычисления неизвестных вызываются те же функции, но с «предшествующими» аргументами.

Так происходит до тех пор, пока выражение не станет полностью определенным (ветвь then). После чего алгоритм начинает «раскручиваться» в другую сторону, изымая из памяти «отложенные значения. При этом на каждом очередном шаге все члены выражения будут известны через n обратных шагов, получили результат.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]