Формальные и фактические параметры
Можно выделить два основных класса формальных параметров:
-
Параметры-значения;
-
Параметры-переменные.
Параметры-значения используются только для передачи исходных данных из основной программы в подпрограмму (процедуру или функцию), в списке формальных параметров они перечисляются через запятую с обязательным указанием их типов. Например:
procedure S1(M:real);
function S2(c: real; x:integer): real;
При вызове подпрограммы фактические параметры вычисляются и используются как начальные значения формальных параметров, т.е. осуществляется подстановка значений. При изменении формального параметра значения фактических параметров не меняется.
Пример:
program primer8;
var A,B:real;
procedure Sum(x,y:real);
begin
x:=x*x;
y:=y*y;
writeln('Сумма квадратов=',x+y);
end;
begin
A:=1.5;
B:=3.4;
Sum(A,B);
end.
Параметры-переменные используются для определения результатов выполнения процедуры и в списке формальных параметров перечисляются после зарезервированного слова var с обязательным указанием типа. Каждому формальному параметру, объявленному как параметр-переменная, должен соответствовать фактический параметр в виде переменной соответствующего типа, например:
procedure S1(var M,N: integer; var Y: real);
Если формальный параметр определен как параметр-переменная, то при вызове процедуры ей передается сама переменная, а не ее копия, и изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе. Следовательно, исходные данные в процедуру из программы могут передаваться как через параметры-значения, так и через параметры-переменные, а результаты работы процедуры возвращаются в вызывающую программу только через параметры-переменные.
Пример:
program primer9;
var A,B:real;
SumAB,SubAB:real;
procedure Sum_Sub(x,y:real; var Sum,Sub:real);
begin
Sum:=x*x+y*y;
Sub:=x*x-y*y;
end;
begin
A:=1.5;
B:=3.4;
Sum_Sub(A,B,SumAB,SubAB);
writeln('Сумма квадратов =',SumAB);
writeln('Разность квадратов =',SubAB);
end.
Пример. Найдите суммы элементов массивов A(5) и B(7).
program primer1;
type mas=array [1..100] of integer;
var sumA,sumB,y:integer;
a,b:mas;
procedure VVOD(n:byte; var x:mas);
var i:integer;
begin
writeln('Введите ',n,' чисел);
for i:=1 to n do read(x[i]);
end;
procedure Summa(n:byte; x:mas; var sum: integer);
var i,S:integer;
begin
S:=0;
for i:=1 to n do S:=S+x[i];
Sum:=S;
end;
begin
VVOD(5,a);
VVOD(7,b);
Summa(5,a,sumA);
Summa(7,b,sumB);
writeln('Sa= ',sumA);
writeln('Sb= ',sumB);
end.
Пример. Вычислить суммы всех элементов матриц А(n,n), B(m,m).
program primer2;
uses crt;
var T: array [1..10,1..10] of integer;
n,m: byte;
s: integer;
procedure VV(l: byte);
var i,j: byte;
begin
writeln('Vvedite massiv ',l,'x',l);
for i:=1 to l do
for j:=1 to l do read(T[i,j]);
end;
procedure Summa(l: byte; var s: integer);
var i,j: byte;
begin
S:=0;
for i:=1 to l do
for j:=1 to l do S:=S+T[i,j];
writeln('S= ',S);
end;
begin
clrscr;
writeln(Введите n,m');
readln(n,m);
VV(n);
VV(m);
Summa(n,s);
Summa(m,s);
end.