- •Вспомогательные алгоритмы. Процедуры и функции.
- •Алгоритмы-процедуры и алгоритмы-функции.
- •Алгоритм-процедура
- •Алгоритм-функция.
- •Программирование с использованием процедур и функций. Описание подпрограммы-процедуры.
- •Описание подпрограммы функции.
- •Обращение к подпрограмме-процедуре
- •Обращение к подпрограмме – функции.
- •Особенность Оbject Pascal.
- •Использование массивов в процедурах.
- •Локальные и глобальные параметры (переменные).
- •Рекурсивные подпрограммы.
- •Косвенная рекурсия.
- •Процедурные типы.
Особенность О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];
for i:=2 to k do
if mx<z[i] then mx:=z[i];
end;
Begin {исполняемая часть программы}
writeln(‘ввод массива х из 10 элементов’);
Vvod(x,n);
writeln(‘ввод массива y из 20 элементов’);
Vvod(y,m);
writeln(‘ввод массива z из 30 элементов’);
Vvod(z,r);
max(x, n, s1);
max(y, m, s2);
max(z, r, s3);
s:=(s1+s2+s3)/3;
writeln(‘среднее=’, s:10:3);
readln;
end.
Пример 2. Дан двумерный массив (матрица) размера m*n. Упорядочить элементы каждой строки этого массива в порядке возрастания, применить для этого алгоритм сортировки выбором в виде процедуры.
Program Poriadok;
const m=5; n=10; {5 строк , 10 столбцов }
type matrica=array[1..m,1..n] of integer;
mas=array[1..n] of integer;
var a:matrica;
b:mas; { b – строка матрицы – массив длины n }
i, j: integer;
procedure Vvod(var x:matrica); {описание процедуры матричного ввода}
var i, j: integer;
begin
for i:=1 to m do
begin for j:=1 to n do
read(x[i,j]);
readln;
end;
end;
procedure Select(var y:mas); {описание процедуры сортировки}
var i, j, c, k: integer; {y – формальный параметр, строка}
begin
for j:=1 to n-1 do
begin c:=y[j];
k:=j;
for i:=j+1 to n do
if c>y[i] then k:=i;
c:=y[i];
y[j]:=y[k];
y[k]:=c;
end;
end;
Begin {раздел операторов}
writeln(‘ввод матрицы’);
Vvod(a);
for i:=1 to m do {блок обработки матрицы}
begin
for j:=1 to n do
b[j]:=a[i,j]; {берем строку b из матрицы}
Select(b);
for j:=1 to n do
a[i,j]:=b[j]; {возвращаем отсортированную строку в матрицу а}
end;
writeln(‘получена матрица’); {матричный вывод матрицы а}
for i:=1 to m do
begin
for j:=1 to n do write(a[i,j],’_’ );
writeln;
end;
readln;
End.