Параметры, перед которыми отсутствует зарезервированное слово var и за которыми следует тип, называются параметрами-значениями. Например, в описании
procedure korrect (s, к : real; x : integer);
s, k, x – параметры-значения. Фактический параметр, соответствующий параметру-значению, может быть выражением соответствующего типа, например:
korrect (2.5, (х + 2)/5, 1);
Изменение формальных параметров-значений не влияет на значения соответствующих фактических параметров.
Параметры, перед которыми следует ключевое слово var и за которым следует тип, называются параметрами-переменными. Например, в описании
procedure obr(var s, k: real; var x : integer);
s, k, x – параметры-переменные. Фактический параметр, соответствующий параметру-переменной, может быть только переменной, например:
obr(a, b, k);
где а, b – переменные вещественного типа, а k – целого типа.
Любые изменения в значении формального параметра-переменной отражаются на фактическом параметре.
Параметр-переменная используется в том случае, если значение должно быть передано из процедуры в вызывающий блок.
Пример. Решить два квадратных уравнения и ,
считая, что его дискриминант неотрицателен.
program primer1;
uses crt;
var y1, y2, zl, z2 : real;
{текст процедуры для нахождения корней квадратного уравнения }
procedure sq( a, b, с : real; var xl, x2 : real);
var d : real;
begin
d:=b*b – 4*a*c;
x1:=(–b + sqrt(d))/(2*a);
х2:=(–b – sqrt(d))/(2*a);
end;
{операторы основной программы}
begin clrscr;
sq(5.7, –1.2, –8.3, y1, y2);
sq(2.4, 3.4, –8.4, zl, z2);
writeln(¢корни y1, y2 =¢, yl : 6 : 2, y2 : 6 : 2);
writeln(¢корни zl, z2 =¢, zl : 6 : 2, z2 : 6 : 2);
readkey
end.
Если в процедуру необходимо передать массив, то в этом случае фактическим параметром является имя массива. Обратим внимание на то, что в заголовке процедуры для указания типов формальных параметров могут использоваться только имена типов.
Нельзя (!) записать так:
procedure sum(a : array[l ..5] of real; var s : real);
Как же написать одну процедуру для обработки двух массивов одного типа, имеющих разное число элементов?
Пример. Вычислить z = (s + к)*(s1 + k1), где s, k – сумма и количество отрицательных элементов a(10), s1, k1 – сумма и количество отрицательных элементов массива b(8).
program primer2;
uses crt;
type vect = array [1..10] of real;
{Значение верхней границы индекса равно максимальному числу элементов двух массивов а, b}
var а, b : vect; i, k, k1 : integer; s, s1 : real;
{Процедура для фиктивного массива х с числом элементов п, где п <= 10 вычисляет сумму (sum) и количество (col) отрицательных элементов}
procedure sumcol (x:vect; n:integer; var sum:real;
var col:integer);
var i:integer;
begin sum := 0; col := 0;
for i:=1 to n do
if x[i]< 0 then
begin sum := sum + x[i];
соl:=соl + 1;
end
end;
begin clrscr;
writeln(¢ввeдитe массив а(10)¢);
for i := 1to 10 do read(a[i]);
writeln(¢введите массив b(8)¢);
for i := 1 to 8 do read(b[i]);
{в процедуру передается массив а длиной 10}
sumcol(a, 10, s, к);
{в процедуру передается массив b длиной 8}
sumcol(b, 8, sl, k1);
z := (s + k)*(sl + kl);
writeln(¢z=¢, z : 6 : 2);
readkey
end.
Такой подход можно применить и для двумерных массивов.