Подпрограммы типа FUNCTION, их описание
Подпрограммы - функции (Function) имеют следующие отличительные особенности (по сравнению с процедурами):
1. Функция имеет только один результат выполнения. Этот результат обозначается именем функции и передается в вызвавщую эту функцию программную единицу.
2. Для функции обязательно указывается ее тип. Тип может быть простым (скалярным) или строковым.
Описание функции в Паскале имеет вид:
Function Имя функции (формальные параметры):Тип результата;
|
Раздел описаний |
Begin
|
End;
Вызов функции производится по ее имени с указанием фактических параметров. Аналогично процедурам, фактические и формальные параметры в функции могут отсутствовать.
Правила использования фактических и формальных параметров, а также локальных и глобальных переменных, совпадают с использованием их в процедурах.
Если функция кроме выдачи своего значения меняет значения каких-либо глобальных переменных, то говорят, что она имеет побочный эффект.
Рассмотрим пример создания программ с использованием функций. Пусть необходимо произвести следующие вычисления:
,
где a, b, n, m - целые переменные;
{xi}, {yj} - массивы, содержащие n и m вещественных чисел, соответственно.
В Паскале нет стандартных функций сумммирования элементов массива и возведения чисел в степень больше 2. Разработаем свои функции для решения этих задач и будем использовать их для решения поставленной задачи.
Текст программы
Uses crt;
Type
Tmas=array[1..100] of real;
Var a,b,n,m,i,j:byte;
X,Y:Tmas;
S:Real;
Function Summa(Dlmas:byte; Mas:Tmas):Real;
Var Sum:real; i:byte;
Begin
Sum:=0.0;
For i:=1 to Dlmas do
Sum:=Sum+Mas[i];
Summa:=Sum;
End;
Function step(Pok:byte;Osn:byte):real;
Var i:byte; St:real;
Begin
St:=Osn;
For i:=2 to Pok do
St:=St*Osn;
step:=St;
End;
{ Главная программа}
BEGIN
Write(' Введите длину первого массива - N ');
Readln(N);
Write(' Введите длину второго массива - M ');
Readln(M);
Writeln(' Введите элементы массива X');
For i:=1 to N do Read(X[i]); readln;
Writeln(' Введите элементы массива Y');
For j:=1 to M do Read(Y[j]); readln;
Write(' Введите a и b '); Readln(a,b);
S:=(Summa(N,X)+Summs(M,Y))/(step(N,a)+step(M,b));
Writeln(' Полученный результат S = ',S);readkey;
END.
Рекурсии
Рекурсия - это такой способ организации вычислительного процесса, при котором подпрограмма обращается сама к себе. Такая рекурсия называется прямой. Рекурсии позволяют писать более короткие программы, но при выполнении они работают медленнее и могут вызвать переполнение стека, так как при каждом входе в подпрограмму ее локальные переменные размещаются в программном стеке, размер которого ограничен.
Типичным примером прямой рекурсии является вычисление n!.
Текст программы с использованием прямой рекурсии для вычисления n!.
Var n:integer;
{Рекурсивная функция}
Function Fact(n:integer):real;
Begin
If n=0 then Fact:=1
Else Fact:=n*Fact(n-1);
End;
{ Главная программа}
Begin
Repeat
Writeln(' Введите положительное n<=33');
Readln(n);
Writeln(Fact(n));
Until Eof;
End.
Примечание: для выхода из этой программы можно задать значение n>33 или нажать Ctrl/z и Enter. При n>33 возникает переполнение при умножение чисел с плавающей запятой.
Рекурсивный вызов может быть также косвенным. В этом случае подпрограмма обращается к себе опосредованно, путем вызова другой подпрограммы, в которой, в свою очередь, содержится обращение к первой. Такой вызов иногда называют закольцованным.
Для реализации такой возможности в ТР используется опережающее описание процедур и функций и директива Forward.
Для этого в самом начале программы вставляют только заголовки процедуры или функции в виде:
Дата добавления: 2015-09-28; просмотров: 1282;