Процедура без параметров:
Var a,b: integer;
procedure P;
begin
b:=a+b;
writeln(b);
end;
Begin
a:=1; b:=2;
P;
a:=5; b:=9;
P;
readln;
End.
Для активации этой процедуры в нужном месте программы, достаточно там записать имя процедуры.
В данном случае фрагмент текста программы, объявленный процедурой, весьма невелик, существенного выигрыша мы не получили. Но,
Если бы этот фрагмент был большим, выигрыш был бы очевиден.
Процедура с параметрами:
Введенная нами в употребление процедура не очень удобна, т.к. ее назначение зафиксировано слишком жестко. Исходными значениями могут служить только a и b, а выходным – b. Но нашу программу можно записать так:
var a,b,x,y: integer;
procedure P(d: integer, c: integer;);
begin
c:=d+c;
writeln(c);
end;
Begin
a:=1; b:=2;
P(a,b);
x:=5;y:=9;
P(x,y);
readln;
End.
Идентификаторы d , c являются формальными параметрами процедуры, x , y - фактическими. Формальные параметры указываются в заголовке процедуры, при этом для каждого формального параметра должно быть указано имя типа. При обращении к процедуре в программе вслед за именем процедуры надо в круглых скобках задать список фактических параметров. Соответствие между фактическими и формальными параметрами устанавливается путем их сопоставления в обоих списках: первый по порядку фактический параметр соответствует первому формальному параметру, второй – второму и т. д.
Формальные параметры процедуры могут быть параметрами – значениями и параметрами – переменными . В первом случае фактические параметры используются только при входе в процедуру, с целью передачи значений внутренним переменным процедуры. После этого фактические параметры недоступны из процедуры. Чтобы отличить параметр–переменную от параметра-значения, перед ним в списке формальных параметров записывается служебное слово var.
В отличие от формального параметра-значения, фактическим параметром для которого может быть. любое выражение соответствующего типа (не x, y, a, b, а 2*x, x*y и т.д.), для параметра–переменной фактическим параметром может быть только переменная.
Передача массива в процедуру (массив является параметром)
Пример 2
Написать процедуру определения максимального элемента массива.
Const n=30;
Type Massiv = array [1..n] of real;
Var a: Massiv;
amax: real;
procedure MaxZn ( var x: Massiv, var xmax: real);
Var k,I : integer;
begin
for i:=1 to n do readln (x[i]);
xmax := x[1];
for i:=2 to n do
if xmax < x[i] then xmax := x[i];
end;
Begin
MaxZn (a,amax);
Writeln ( ‘максимальное значение = ‘, amax :7:2 );
readln;
End.
Пример 3.
Использовать процедуру-функцию для вычисления максимальных значений нескольких одномерных массивов.
Program Prg 30;
Const n=10;
Type massiv=array[1..n] of real;
{Программа определения максимума в разных массивах}
Var a:massiv;
L, kolmas: integer;
amax: real;
Procedure MaxZn(Var x:massiv; Var xmax: real);
Var
k, i: integer;
begin
writeln(‘ввести количество элементов в массиве’); readln(k);
writeln(‘введите массив, аосле каждого числа нажать Enter’);
for i:=1 to k do readln(x[i]);
xmax:=x[1];
for i:=2 to k do
if xmax<x[i] then xmax:=x[i];
end;
Begin
Writeln(‘скилько массивов обрабатываем?’);
Readln(kolmas);
For L:=1 to kolmas do begin
MaxZn(a, amax);
Writeln(‘максимальное значение=’, amax:7:2);
end;
End.
Пояснения к программе. В главной программе описан тип massiv, в заголовке процедуры MaxZn этот тип используется при описании параметра-массива. В подпрограмме-процедуре количество элементов в каждом массиве конкретизируется перед его введением и анализом.
При обращении к процедуре в главной программе указывается имя процедуры MaxZn, а в скобках – фактические параметры a и amax , которые отвечают формальным параметрам x и xmax.
Результат анализа возвращается в главную программу через параметр-переменную xmax/ amax. Параметр х явояется также параметром-переменной с целью экономии памяти и времени (на создание копии массива).
Процедура вызывается в цикле несколько раз в зависимости от количества массивов, которые обрабатываются.
Пример 4.
Заданы масивы x[10], y[30], z[18] целых чисел, необходимо эти масивы ввести и в каждом из них найти его минимальный элемент и его индекс.
Program MASSIV;
Uses Crt;
Var x: array [0..9] of integer;
y: array [0..29] of integer;
z: array [0..17] of integer;
i: byte;
xmin, ixmin, ymin, iymin, zmin,
izmin: integer;
Procedure Pmin(m: array of integer; Var min: integer; Var imin: byte);
Begin
min:=m[1]; imin:=1;
for i:=0 to High(m) do if m[i]<min then
begin
min:=m[i]; imin:=i;
end;
end;
Begin
Writeln(’Ввод масива x’);
for i:=0 to 9 do read (x[i]); readln
Pmin(x, xmin, ixmin);
Writeln(’xmin=’,xmin:6,’ixmin= ’,ixmin);
Writeln(’Ввод масива y’);
for i:=0 to 29 do read(y[i]); readln;
Pmin(y, ymin, iymin);
Writeln(’ymin= ’,ymin:6,’iymin= ’,iymin);
Writeln(’Ввод масива z’);
for i:=0 to 17 do read(z[i]); readln;
Pmin(z, zmin, izmin);
Writeln(’zmin= ’,zmin:6,’izmin= ’,izmin);
End.
Пояснения к программе. В главной программе после описания и ввода фактических массивов x, y, z трижды обращаемся к процедуре. Результаты обработки каждого массива возвращаются в главную программу через фактические параметры xmin, ixmin, ymin, iymin, zmin, izmin; i – глобальная переменная.
Процедуры можно использовать также для обработки записей. В этом случае также в главной программе описывается тип-запись, а в заголовке подпрограммы присутствует ссылка на этот тип.
В самой процедуре выполняются необходимые операции над полями записи.
Пример 5.
Ввести информацию о результатах сдачи экзаменов 30 студентов (ф.и., оценки (5 предметов)). Проанализировать информацию о каждом студенте и вывести на экран средний бал каждого студента.
Uses crt;
Const N=30;
Type stud=record
fio:string[20];
ocenki:array[1..5] of integer;
End;
Var st: stud;
i,k:integer;
sredbal:real;
Procedure AnUsp(Var Formstud: stud; Var sredbal:real);
Var j:integer;
Begin
sredbal:=0;
With Formstud do begin
For j:=1 to 5 do sredbal:= sredbal+ ocenki[j];
sredbal:= sredbal/5;
End;
End;
Begin
For i:=1 to N do begin
With st do begin
Writeln(‘введите информацию о следующем студенте’);
Readln(fio);
For k:=1 to 5 do read(ocenki[k]); readln;
AnUps (st, sredbal);
Writeln(‘sredbal =’ sredbal:5:2);
End;
End;
End.
Пояснения к программе. Здесь обеспечивается ввод данных о результатах экзаменов N студентов, информация о каждом студенте анализируется в процедуре AnUps. Такая процедура принимает запись St/Formstud и возвращает средний бал.
Подпрограмма функции используется в тех случаях, когда результатом вычислительного процесса, который она реализует, является одно значение. Это значение передается в программу, которая вызывает функцию, в виде имени функции. Обращение к подпрограмме-функции выполняется из какого-нибудь арифметического выражения так, как и к стандартным функциям типа Sin(x), Cos(x).
Структура подпрограммы функции имеет вид:
Function <имя > (список формальных параметров): <тип имени>;
(раздел локальных данных)
Begin {раздел исполняемых операторов}
……..
имя:=………..;
еnd;
Пример 6.
Использовать подпрограмму-функцию для вычисления выражения:
Y=n!/(m!(n-m)!)
Program Prg35;
{использование функции для вычисления факториала}
Var
n,m,y: byte;
Function F(p:byte):integer;
