Параметры

Параметры, перед которыми отсутствует зарезервированное слово 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.

 

Такой подход можно применить и для двумерных массивов.