ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 08.05.2024
Просмотров: 68
Скачиваний: 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 является локальным параметром, который описан внутри данной процедуры и действует только внутри ее – локально.
Описание подпрограммы функции.
Функция – это подпрограмма, результатом выполнения которой является одно значение, причем это значение присваивается имени функции. Таким образом, функция есть частный случай процедуры и принципиально отличается от процедуры тем, что:
результатом функции является одно значение;
в теле функции (в описании) хотя бы один раз имени этой функции должно быть присвоено значение;
результат выполнения функции в основной программе используется как значение имени функции.
Описание функции также состоит из заголовка и блока функции.
Заголовок имеет вид:
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
Пример 2. Вычислить функцию p=( ∑ xi )*( ∑ yi ) с использованием подпрограммы.
Используем для вычисления сумм подпрограмму-функцию.
Вопрос: сколько формальных параметров будет у функции?
Какие фактические переменные и константы различаются в суммах?
Это – 20, 25 и x, y.
Обозначим их формальными r u z
Функция имеет 2 формальных параметра: z, r.
И
r
i:=1
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];