Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вспомогательные алгоритмы.doc
Скачиваний:
70
Добавлен:
13.04.2015
Размер:
218.62 Кб
Скачать

Описание подпрограммы функции.

Функция – это подпрограмма, результатом выполнения которой является одно значение, причем это значение присваивается имени функции. Таким образом, функция есть частный случай процедуры и принципиально отличается от процедуры тем, что:

  1. результатом функции является одно значение;

  2. в теле функции (в описании) хотя бы один раз имени этой функции должно быть присвоено значение;

  3. результат выполнения функции в основной программе используется как значение имени функции.

Описание функции также состоит из заголовка и блока функции.

Заголовок имеет вид:

Function<имя функции> (<список формальных парам.>):<тип ф-ции>;

<тип функции> – это тип значений, которые принимает имя функции в результате выполнения.

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

Пример: Вычислить максимум двух переменных z и p: M=max(z,p).

Имя функции max(z,p), результат присваивается имени max; z, p – формальные параметры.

Function max(z, p:real):real;

Begin

If z>p then max:=z

else max:=p;

End;

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

В отличие от функции процедура вычисления max запишется так:

Procedure Max(z, p:real; var M:real);

Begin

If z>p then M:=z

else M:=p;

End;

Обращение к подпрограмме-процедуре

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

Оператор обращения к процедуре имеет вид:

<имя процедуры>(<список фактических параметров>);

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

Пример: Вычислить функцию:

max(a,b) + x, x<0

y= max(a+b,a-b)

max(a2,b2)

Программа с использованием процедуры:

Program Proc; {с использованием процедуры}

Var a, b, x, c, d, y: real;

Procedure Мax(z,p:real; var M:real); {описание процедуры}

Begin

If z>p then M:=z

else M:=p;

End;

Begin {исполняемая часть программы(тело программы)}

Writeln(‘ввод a, b, x ’);

Readln(a, b, x); {1 2 3}

If x>=0 then

вegin

Max(a+b, a-b, c);

Max(sqr(a), sqr(b), d);

y:=c/d+x;

end

else

begin

Max(a, b, c);

y:=c+x;

end;

writeln(‘y=’,y:15:4); {15-количество знаков, 4-количество знаков после запятой}

readln;

end.

Обращение к подпрограмме – функции.

Обращение к функции не является отдельным оператором, как обращение к процедуре, но входит в состав выражений. Например, может быть в составе выражения правой части оператора присваивания или может находиться в операторе вывода на печать.

Пример1. Запишем решение той же задачи с использованием подпрограммы-функции для вычисления max.

Program Func; {с использованием функции}

Var a, b, c, d, y, x:real;

Function max(z, p:real):real; {описание функции}

Begin

If z>p then max:=z

else max:=p;

End;

Begin {исполняемая часть программы}

Writeln(‘ввод a, b, x’);

Readln(a, b, x);

If x>=0 then

Begin

c:=max(a+b, a-b);

d:=max(sqr(a), sqr(b)); {или y:=max(a+b, a-b)/max(sqr(a), sqr(b))+x; }

y:=c/d+x;

end

else

begin

c:=max(a, b); {или y:=max(a, b)+x }

y:=c+x;

end;

writeln(‘y=’, y:15:4);

readln;

e

20

i:=1

25

i:=1

nd
.

Пример 2. Вычислить функцию p=( ∑ xi )*( ∑ yi ) с использованием подпрограммы.

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

Вопрос: сколько формальных параметров будет у функции?

Какие фактические переменные и константы различаются в суммах?

Это – 20, 25 и x, y.

Обозначим их формальными r u z

Функция имеет 2 формальных параметра: z, r.

И

r

i:=1

мя функции – summ

z, r→summ(z, r)= ∑ zi

Program Primer;

var p, x, y:real;

Function summ(z:real;r:integer):real; {описание подпрограммы

функции}

Var i:integer;

s, a:real;

begin

s:=0; {должны накапливаться и сумма s, и произведение а}

a:=1;

for i:=1 to r do

begin

a:=a*z;

s:=s+a;

end;

summ:=s;

end;

begin {основная часть программы}

writeln(‘ввод x, y’);

readln(x, y);

p:=summ(x, 20)*summ(y, 25);

writeln(‘p=’,p:10:3);

readln;

end.

В описании функции summ используются 3 локальные переменные: s, a, i. Переменная s необходима, поскольку при подсчете суммы в цикле нельзя писать summ:=summ+a, т.к. происходит обращение к имени функции, которое находится внутри ее описания, поэтому нужно писать s:=s+a;

а затем, в итоге, перед завершением описания функции присвоить имени summ:=s;