Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛК№4.doc
Скачиваний:
7
Добавлен:
04.12.2018
Размер:
88.06 Кб
Скачать

3. Локальные и глобальные переменные

Существуют понятия локальных и глобальных меток, констант, типов и переменных. Поясним эти понятия на примере переменных.

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

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

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

Формальные параметры подпрограммы также относятся к его локальным переменным.

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

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

4. Виды параметров

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

Для каждого параметра обычно задается его имя, тип и способ передачи.

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

Важно запомнить, что в заголовке подпрограммы нельзя вводить описание нового типа, там должны использоваться либо имена стандартных типов, либо имена типов, описанных программистом ранее в разделе type.

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

  • значения;

  • переменные;

  • константы;

  • нетипизированные параметры.

Кроме того, по другим критериям можно выделить особые виды параметров:

  • открытые массивы и строки;

  • процедурные и функциональные параметры;

  • объекты.

Параметры-значения

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

имя : тип;

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

procedure P(x : integer);

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

Механизм передачи следующий: из ячейки памяти, в которой хранится переменная, передаваемая в подпрограмму, берется ее значение и копируется в область сегмента стека, называемую областью параметров. Подпрограмма работает с этой копией, следовательно, доступа к ячейке, где хранится сама переменная, не имеет. По завершении работы подпрограммы стек освобождается. Такой способ называется передачей по значению.

При вызове подпрограммы на месте параметра, передаваемого по значению, может находиться выражение. Тип выражения должен быть совместим по присваиванию с типом параметра.

Например, если в вызывающей программе описаны переменные

var x : integer;

c : byte;

y : longint;

то следующие вызовы подпрограммы Р, заголовок которой описан выше, будут синтаксически правильными:

P(x); P(c); P(y); P(200); P(x div 4 + 1);

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

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

Параметры-переменные

Признаком параметра-переменной является ключевое слово var перед описанием параметра:

var имя : тип;

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

procedure P(var x : integer);

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

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

Пример.

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]