double arrow
Подпрограммы-функции (FUNCTION)

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

Формат объявления подпрограммы-функции:

FUNCTION <имя_функции> (<список_формальных_параметров>): <тип_возвращаемого_результата>; {раздел описания подпрограммы}

BEGIN{раздел операторов подпрограммы}

END;

Например (см. Задача 1), Function Power (x, y : real) : real;

Вызов подпрограммы-функции:

<имя_функции> (<список_фактических_параметров>) : <тип_возвращаемого_результата>;

Здесь, фактические («настоящие») параметры – параметры вызывающей программы.

Например (см. Задача 1), C:= Power (a, b);

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

Например (см. Задача 1), Power := exp(y*ln(x));

В качестве типа формального параметра может быть любой тип. Функция может использоваться без формальных параметров. Например, c:= Readkey;

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


Задача 8.4. Составить подпрограмму возведения вещественного числа в вещественную степень.

Примечание. Для простоты обращения подпрограмма Power на представленной блок-схеме обозначена сокращённо буквой P.





Блок-схема алгоритма подпрограммы Power


 
 

Блок-схема алгоритма основной программы

Листинг основной программы

PROGRAM TASK;

USES CRT;

VAR

A, B, C : REAL;

{объявление подпрограммы-функции}

FUNCTION POWER (X, Y:REAL): REAL; {заголовок функции}

BEGIN {начало тела функции}

IF (X>0) AND (Y>0) THEN POWER := EXP(Y*LN(X))

ELES

IF (X>0) AND (Y<0) THEN POWER := 1/EXP(Y*LN(X))

ELSE

IF (X<0) AND (Y>0) THEN POWER := EXP(Y*LN(ABS(X)))

ELSE

IF (X<0) AND (Y<0) THEN POWER := 1/EXP(Y*LN(ABS(X)))

ELSE

IF X=0 THEN POWER := 0

ELSE

IF Y=0 THEN

POWER := 1; {присвоение выход-го результата имени функции}

END; {конец тела функции}

BEGIN {начало тела основной программы}

CLRSCR;

WRITELN (‘Введите два вещественных числа’);

READLN (A,B);

C := POWER(A,B); {вызов подпрограммы-функции}

WRITELN (C);

END. {конец тела подпрограммы}

Здесь,

A, B, C – глобальные переменные,

X, Y – формальные параметры, которые в свою очередь являются входными параметрами-значения.



Примечание.Уравнение с = 6.412.6+12.16-6.8-12.16-6.8; можно реализовать следующим образом: C:= POWER(6.4, 12.6)+POWER(12.16, -6.8)-POWER(12.16, -6.8);

 
 

Задача 8.5. Вычислить площадь треугольника по формуле Герона.

 
 

Блок-схема алгоритма подпрограммы SQUARE

Блок-схема алгоритма основной программы

Листинг основной программы

PROGRAM TASK;

USES CRT;

VAR

A, B, C, S: REAL;

FUNCTION SQUARE (L1, L2, L3 : REAL): REAL;

VAR P: REAL;

BEGIN

P:= (L1+L2+L3)/2;

SQUARE:= SQRT(P*(P-L1)*(P-L2)*(P-L3));

END;

BEGIN

CLRSCR;

WRITELN (‘Введите стороны’);

READLN (A, B, C);

S:= SQUARE(A, B, C);

WRITELN(S);

READLN; END.

 
 

Задача 8.6. Дан массив целых чисел, размерностью 15 элементов. Вычислить сумму элементов с 1-го по 12 и с 8-го по 15. Найти произведение этих сумм.

Блок-схема алгоритма подпрограммы


Блок-схема алгоритма основной программы

 
 

Листинг основной программы

PROGRAM TASK;

USES CRT;

CONST N=15;

TYPE VECTOR = ARRAY[1..N] OF INTEGER;

VAR

P, I : INTEGER;

A : VECTOR;

FUNCTION SUMMA (L1, L2 : INTEGER): INTEGER;

VAR

J, S : INTEGER;

BEGIN

S := 0;

FOR J:=L1 TO L2 DO S:= S+A[J];

SUMMA:= S;

END;

BEGIN

CLRSCR;

FOR I:=1 TO N DO READ (A[I]);

P:= SUMMA(1, 12)*SUMMA(8, 15);

WRITELN(P);

READLN;

END.

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

 
 

Задача 8.7. Вычислить сумму чётных элементов трёх одномерных массивов.

Блок-схема алгоритма подпрограммы Summa

Блок-схема алгоритма основной программы

 
 


Листинг основной программы

PROGRAM TASK;

USES CRT;

CONST N=25;

TYPE

VECTOR=ARRAY[1..N] OF INTEGER;

VAR

A, B, C:VECTOR;

I: INTEGER;

FUNCTION SUMMA(L: INTEGER; D: VECTOR): INTEGER;

VAR

S, J: INTEGER;

BEGIN

S:= 0;

FOR J:=1 TO L DO

IF D[J] MOD 2 = 0 THEN S:= S+D[J];

SUMMA:=S;

END;

BEGIN

CLRSCR;

RANDOMIZE;

FOR I:=1 TO N DO

BEGIN

A[I]:=RANDOM(11);

B[I]:=RANDOM(21);

C[I]:=RANDOM(31);

END;

WRITELN (‘Сформированный массив A’);

FOR I:=1 TO N DO WRITE(A[I]:2, ‘’:3);

WRITELN;

WRITELN (‘A’, SUMMA(N,A));

WRITELN (‘Сформированный массив B’);

FOR I:=1 TO N DO WRITE(B[I]:2, ‘’:3);

WRITELN;

WRITELN (‘B’, SUMMA(N,B));

WRITELN (‘Сформированный массив C’);

FOR I:=1 TO N DO WRITE(C[I]:2, ‘’:3);

WRITELN;

WRITELN (‘C’, SUMMA(N,C));

READLN;

END.

Примечание. Вызов подпрограммы Summa в теле основной программы осуществляется три раза внутри операторов вывода. При этом каждый раз передаются различные фактические параметры: первый параметр – размерность массива, второй параметр – имя массива, элементы которого проверяются на чётность и суммируются.


Вопросы для самопроверки

1. Дайте определение подпрограммы?

2. Какое основное назначение подпрограммы?

3. Каков формат описания функции?

4. Каким образом функция возвращает значения?

5. Где указывается список формальных параметров?

6. Как можно описать входные параметры?

7. В каких случаях используют параметры-значения?

8. Как можно осуществить вызов функции и передачу параметров?

9. Какие три правила необходимо учитывать при передаче параметров?

10. Какие основные отличия процедуры от функции?






Сейчас читают про: