В Паскале существует два способа передачи параметра:
1. по значению (без Var). Фактический параметр может быть константой, вычисленной переменной или выражением. Здесь происходит копирование данных в другую область памяти.
2. По адресу (с Var). Фактический параметр здесь – это не вычисленная переменная. В этом случае подпрограмме передается адрес этой переменной и можно считать, что выполнения подпрограммы фактический параметр – переменная просто замещает формальный параметр. Это используется для передачи результата из подпрограммы.
Следует заметить, что передача по значению происходит медленнее и требует большего объема памяти, чем передача по адресу. Особенно это заметно при передаче массивов. Но, если же необходимо защитить переменные от изменений их значений, то нужно передавать их по значению.
Параметры – массивы и параметры – строки
Типом любого параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип. Поэтому нельзя в списке формальных параметров объявлять массив так, как это делается в разделе объявления переменных, т.к. в списке формальных параметров фактически объявляется тип – диапазон, указывающий границы индексов массива.
|
|
Если передается какой – то элемент массива, то указывается его стандартный или ранее описанный тип, если же в подпрограмму передается весь массив, то следует сначала описать его тип.
Например,
Type
atype = array [1..10] of real;
Procedure s (a:atype);
...
Точно так же следует поступать и со строками, т.к. строка фактически является своеобразным массивом символов.
Например,
Type
intype = string[15];
outype = string[30];
Function st (s:intype;):outype;
Пример 1. Демонстрация использования процедуры без параметров.
PROGRAM Primer_1;
var a,b: Integer;
{ ------------------- }
PROCEDURE Stars;
var i: Integer;
BEGIN
For i:=1 to 40 do Write ('*');
WriteLn
END;
{ --- }
BEGIN
WriteLn; Stars;
Write ('Введите значение a... '); ReadLn (a);
Write ('Введите значение b... '); ReadLn (b);
Stars; WriteLn ('a+b=',a+b,'; a*b=',a*b,'; a-b=',a-b); Stars
END.
Пример 2. Демонстрация использования процедуры с параметрами.
PROGRAM Primer_2;
var a,b,c: Real;
{ --------------------------------------- }
PROCEDURE Print (x: Real; m,n: Integer);
{ Вывод на экран значения переменной x с n цифрами после запятой }
{ x,n - параметры, передаваемые по значению }
var i: Integer;
BEGIN
For i:=1 to 20 do Write ('*');
WriteLn; WriteLn (x:m:n)
END;
{ --- }
BEGIN
Write ('Введите значение a... '); ReadLn (a);
Write ('Введите значение b... '); ReadLn (b);
c:= a*b; Print (c,7,2); c:= a/b; Print (c,7,5)
END.
Пример 3. Процедурное программирование (обратите внимание на основную программу, которая содержит только вызовы процедур).
PROGRAM Primer_3;
var x,y: Real;
{ ----------------------------------- }
PROCEDURE I_N_P_U_T (var a,b: Real);
BEGIN
Write ('Введите значения дух переменных типа Real... '); ReadLn (a,b)
END;
{ --------------------------------- }
PROCEDURE S_W_A_P (var a,b: Real);
var t: Real;
BEGIN
t:= a; a:= b; b:= t
END;
{ --------------------------------- }
PROCEDURE O_U_T_P_U_T (a,b: Real);
BEGIN
WriteLn ('Результат: ',a:7:3,' ',b:7:3)
END;
{ --- }
BEGIN
I_N_P_U_T (x,y); S_W_A_P (x,y); O_U_T_P_U_T (x,y)
END.