Пример

Параметры-константы

Пример.

var a, b, c, d, e: word; procedure X(a, b, c: word; var d: word); var e: word;begin c:= a + b; d:= c; e:= c; writeln ('Подпрограмма:'); writeln ('c = ', c, ' d = ', d, ' e = ', e);end; begin a:= 3; b:= 5; x(a, b, c, d); writeln ('Главная программа:'); writeln ('c = ', c, ' d = ', d, ' e = ', e);end. Результаты работы этой программы приведены ниже:

Подпрограмма:

c = 8 d = 8 e = 8 Главная программа:c = 0 d = 8 e = 0

Значение переменной с в главной программе не изменилось, поскольку переменная передавалась по значению, а значение переменной е не изменилось потому, что в подпрограмме была описана локальная переменная с тем же именем.

Параметр-константу можно узнать по ключевому слову const перед описанием параметра:

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

Например, передача в процедуру Р параметра-константы целого типа записывается так:

procedure P(const x: integer);

Итоги

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

Параметры составных типов (массивы, записи, строки) предпочтительнее передавать как константы, потому что при этом не расходуется время на копирование и место в стеке.

Результаты работы процедуры следует передавать через параметры-переменные, результат функции - через ее имя.

Рекомендуется аргументы процедуры описывать как параметры-значения, а результаты – как параметры-переменные.

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

В процедуре-параметре можно использовать глобальные переменные, то есть переменные внешней процедуры, но можно имя переменной переопределить, в таком случае глобальная переменная с таким же именем в данной процедуре недоступна (если только она не передается как параметр). Рекомендуется имена, которые вне процедуры не используются, описывать локально в процедуре.

program lok;

var x: integer; {описание глобальной переменной}

procedure b;

var x: integer; {описание локальной переменной}

begin x:=1 end;

begin

x:=0;

b;

writeln(‘x=‘, x)

{печатает x=0, если убрать х из описания в процедуре, печатает x=1}

end.

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

Любой процедуре доступны только те объекты верхнего уровня, которые описаны до описания данной процедуры. Эти объекты и называются глобальными по отношению к подпрограмме.

Задача 2. Расположить в порядке неубывания три целых числа.

program pr;
var s1,s2,s3: integer;
procedure swap(var a,b: integer);{Процедура swap с параметрами-переменными}
var c: integer; {c - независимая локальная переменная}
begin
c:=a; a:=b; b:=c {Меняем местами содержимое a и b}
end;
begin

writeln('Введите три числа');
readln(s1,s2,s3);
if s1>s2 then swap(s1,s2);
if s2>s3 then swap(s2,s3);
if s1>s2 then swap(s1,s2);
writeln('Числа в порядке неубывания:',s1,s2,s3)

end.


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



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