Передача параметров подпрограммы

В Паскале существует два способа передачи параметра:

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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: