Файл: Вспомогательные алгоритмы.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.05.2024

Просмотров: 72

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Имя процедуры - идентификатор. Список формальных параметров - это перечень идентификаторов, обозначающих исходные данные (параметры-значения) и результаты (параметры-переменные) с указанием их типов.

Пример: Записать процедуру, вычисляющую функцию: y=xn, n € Z

Procedure Stepen (x:real; n:integer; var y:real);

Var i:integer;

Begin

y:=1;

for i:=1 to n do

y:=y*x;

end;

Параметры х, y, n являются формальными, причем x, n – параметры-значения (исходные данные), y – параметр-переменная (результат), поэтому у в списке параметров описывается по-особому с использованием слова var, то есть: var y:real

Кроме того, в этой процедуре используется переменная i. Она описана вне заголовка, в описательном разделе блока процедуры – разделе описания переменных процедуры var.

Переменная i является локальным параметром, который описан внутри данной процедуры и действует только внутри еелокально.


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

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

  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;


Особенность Оbject Pascal.

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

Рассмотрим, как выглядит описание функции summ с использованием Result:

Program Primer_Result;

Var p, x, y:real;

Function summ(z:real;r:integer):real;

Var i:integer;a:real;

Begin

result:=0;

a:=1;

for i:=1 to r do

begin a:=a*z;

result:=result+a;

end;

end;

begin

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

readln(x, y);

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

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

readln;

end.

Использование массивов в процедурах.

Имя массива может использоваться в списке формальных параметров процедуры. Типом любого параметра в списке формальных параметров процедуры может быть только стандартный или ранее объявленный тип. Поэтому нельзя, например, описать следующую процедуру в таком виде:

Procedure Sum(a: array[1..10] of integer; var f: array[1..20] of integer);-так нельзя!

Для передачи массива необходимо сначала описать его тип в разделе Type, а затем применить его в заголовке процедуры.

Type Mass = array[1..10] of integer;

Func = array[1..20] of integer;

Procedure sum (a: Mass; var f: Func);

Пример 1. Даны массивы вещественных чисел x1,...., x10

y1,...., y20

z1,...., z30

Определить среднее арифметическое их max элементов. Поиск max элемента в каждом массиве оформить как процедуру.

Program Srednee;

Const n=10; m=20; r=30;

Type Vect=array[1.. r ] of integer; { r – самый большой размер}

Var x, y, z: Vect;

s1, s2, s3: integer; s : real;

Procedure Vvod(var z:Vect; k:integer); {описание процедуры Vvod}

{ z –это массив, являющийся параметром-переменной. Будем вводить формальный массив z длины k. Отметим, что массив z – результат ввода, т.е. пишется со словом var.}

var i:integer;

begin

for i:=1 to k do

readln (z[i]);

end;

Procedure max(z:Vect; k:integer; var mx:integer); {описание процедуры max }

var i:integer;

begin mx:=z[1];