Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ АЛГОРИТМИЗАЦИИ.doc
Скачиваний:
188
Добавлен:
16.03.2015
Размер:
1.82 Mб
Скачать

8.3. Подпрограммы-функции (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

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

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

PROGRAMTASK;

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 в теле основной программы осуществляется три раза внутри операторов вывода. При этом каждый раз передаются различные фактические параметры: первый параметр – размерность массива, второй параметр – имя массива, элементы которого проверяются на чётность и суммируются.