Подпрограммы типа 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; просмотров: 1277;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.