Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу.docx
Скачиваний:
108
Добавлен:
24.02.2016
Размер:
2.8 Mб
Скачать

9.3. Передача данных между подпрограммой и вызывающей ее про­граммой

Имеется два способа передачи данных между подпрограммой и той программой, из которой производится ее вызов - через глобальные парамет­ры и через формальные параметры.

Передача данных через глобальные параметры

Параметры, которые введены и описаны внутри подпрограмм, называ­ются локальными, т.к. они локализированы внутри той подпрограммы, в ко­торой они описаны, и как бы "невидимы" снаружи (из других подпрограмм). В то же время, параметры, которые введены и описаны в программе до опи­сания подпрограммы, называются глобальными по отношению к этой под­программе, т.к. они "видимы" как внутри неё, так и в программе её вызы­вающей. Это позволяет использовать глобальные параметры для передачи данных.

Для примера передачи данных через глобальные параметры рассмотрим следующую программу - обработчик события нажатия кнопки:

Procedure TForm1.Button1Click(Sender:Tobject); Var z,a,b:integer; Procedure Pw;

Var z:integer; begin

z:=a*b;

writeln('zPw=',z); end^/конец Pw begin

z:=1; a:=2; b:=4; Pw; //вызов процедуры Writeln('zb=',z); end;

Переменные а и b являются локальными в процедуре TForm1.Button1 Click но они же глобальные по отношению к процедуре Pw, т.к. описаны вы­ше её описания. Процедура Pw "видит" переменные а и b, поэтому она напе­чатает zPw=8.

Переменная z здесь описана как внутри Pw так и снаружи. В этом слу­чае под переменную z будет отведено две разных ячейки памяти, одна - под z, которая снаружи Pw, другая - под z внутри Pw. В результате внешняя z как бы становится «невидимой», т.е. внутри Pw она не изменится и второй опера­тор печати выведет zb=1.

Передача данных через формальные параметры Формальные параметры могут быть трех разновидностей: Параметры-значения, параметры - переменные, параметры - кон­станты.

Параметры-значения описываются следующим образом: имя^ДхТшй; ^^Тшй; ...)

Для каждого формального параметра - значения транслятор внутри подпрограммы резервирует дополнительные ячейки памяти в соответствии с типом параметра. При вызове подпрограммы, происходит пересылка факти­ческого параметра в эти ячейки памяти, после чего выполняется подпрограм­ма. При этом значение ячейки, где находился сам фактический параметр, не изменяется. Этот механизм обеспечивает, как, защищенность фактического параметра, так и его универсальность, т.е. то, что фактическим параметром может быть константа, переменная или арифметическое выражение.

Например:

Var x,u,z real;

Function sqxy(x,y:real):real; begin

if x<0 then x:=0; if y<0 then y:=0; Result:=sqrt(x)+sqrt(y);

end;

begin

x:=-0.5;

u:=4;

z:=sqxy(x,u);//вызов функции write(' x=',x,' u=',u,' z=',z); z:=sqxy(sin(u)+x,1.86);

end;

Здесь внутри функции (х, у) - формальные параметры, а в программе (х, и) и (sin(u)+x, 1.86) фактические.

При работе данной программы будет напечатано

x= -0.5 u=4 z=2 хотя внутри подпрограммы будет вычислено х=0.

Недостатком формального параметра-значения является необходимость дублирования ячеек памяти в вызывающей и в вызываемой программах, что в случае, например, параметра-массива приводит к неоправданным затратам памяти.

Параметры - константы описываются следующим образом: имя(Ол^ a,b:Tmi1; Const c,d,e:Tmi2; ...)

В этом случае фактическим параметром может быть переменная или константа. Для такого формального параметра новой ячейки не отводится, а при вызове подпрограммы в неё передается адрес ячейки фактического пара­метра, но внутри запрещены все его изменения.

Параметры - переменные описываются следующим образом:

Имя(Var a,b:Tип1; Var c,d,e:Tип2; ...)

В этом случае фактическим параметром может быть только имя пере­менной. При вызове подпрограмм передается адрес ячейки переменной, в ко­торой находится фактический параметр, и все действия производятся над этой ячейкой. Поэтому после работы подпрограммы в ячейке фактического параметра при необходимости будет находиться результат.

Например:

type vek = array[1..10] of integer;

procedure sab(n:byte; cоnst a,b:vek; var s:integer);

Var i:byte;

begin

s:=0;

for i:=1 to n do

s:=s+a[i]*b[i];

end;

Var x,y:vek;

sk:integer;

begin

Read(x,y);//ввод массивов

sab(5,x,y,sk);

Write(sk);

end;

В процедуре sab массивы a, b описаны как константы, а переменная s описана как параметр-переменная. Это позволило для массивов x, y сэконо­мить память, а через параметр-переменную s вывести результат. Ячейку, вы­деляемую под параметр n, экономнее переслать саму, чем через её адрес, по­этому для нее используется параметр-значение.