Мои Конспекты
Главная | Обратная связь

...

Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

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





Помощь в ✍️ написании работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

Каждая программная единица, будь то главная программа или подпрограмма, оперирует с различными объектами: константами, типами, переменными, имеющими свои имена.

Желание придать подпрограмме относительную независимость в использовании имён привело к разделению их на глобальные (общие) и локальные (местные).

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

1. Имена объектов, описанных в разделах const, type и var главной программы, являются глобальными, т.е. доступными для использования как в ней самой, так и во всех вложенных в неё программных единицах.

2. Имена, описанные в любой вложенной единице, для единицы, объемлющей ее, считаются локальными, а для вложенных в нее - глобальными. Они доступны как в пределах этой единицы, так и для всех вложенных в эту единицу, но недоступны для объемлющей программной единицы.

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

Обратимся вновь к иерархической структуре программы (рис 9.1.). Имена объектов, описанных в программной единице А (главная программа), являются глобальными для всей программы и доступны не только для самой единицы А, но и для единиц В, С и D. Имена объектов единицы В для объемлющей единицы А являются локальными и для этой единицы не доступны, но доступны в пределах единиц С и D, для которых они являются глобальными. Сами же единицы С и D имеют каждая свои локальные имена, недоступные для единиц В и А.

Например:

Program Exampl;

Procedure P;

Procedure A;

Var j : integer; {локальная переменная j, является глобальной по отношению к процедуре В}

Procedure B;

Var j : integer; { локальная переменная j, экранирует глобальную переменную j, описанную в вызывающей процедуре А}

Begin

Writeln (j);

End;

Begin

J:=1;

B; {вызов процедуры В}

End;

Begin

A; {вызов процедуры А}

End.

 

Процедуры.

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

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

Фактические параметры - это те исходные данные, которые передаются в процедуру с целью их обработки.

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

Оператор вызова процедуры состоит только из обращения к процедуре (аналог - обращение к стандартной функции) и имеет вид:

имя процедуры (список фактических параметров)

Допустим, что у нас имеется процедура treug, которая вычисляет площадь треугольника по трём его сторонам a, b и c. Тогда вызывающий оператор может выглядеть так

treug (a, b, c);

или

treug(1.2, 2.3, 1.5);

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

Формальные параметры в процедуре являются как бы «двойниками» фактических параметров и выполняют две функции:

1. на этапе разработки процедуры с их помощью показывают как процедура обрабатывает исходные данные, т.е. они наряду с другими переменными процедуры используются для описания её алгоритма;

2. во время обращения к процедуре каждый её формальный параметр «принимает» значение фактического; именно поэтому списки формальных и фактических параметров должны быть согласованы по количеству элементов, порядку их следования и типу.

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

Формальными параметрами могут быть только имена переменных. Они располагаются в заголовке процедуры, вид которого:

procedure имя_процедуры (список формальных параметров);

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

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

Формальными параметрами могут быть только имена переменных. Они располагаются в заголовке процедуры, вид которого

procedure имя_процедуры (список формальных параметров);

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

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

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

имя1, имя2, ... : t1; имя3, имя4, ... : t2; ...

где имя1, имя2, имя3, имя4, ... - имена параметров; t1, t2 - типы параметров.

Для каждого формального параметра-значения резервируется память ЭВМ, в которую при вызове процедуры копируется значение соответствующего фактического параметра, после чего всякая связь между фактическими и формальными параметрами обрывается. Если фактическим параметром является выражение, то оно предварительно вычисляется.

Далее эти копии обрабатываются процедурой, причем фактические параметры будут существовать только в течение времени ее выполнения.

Пример. Используя процедуру, вычислить площадь треугольника со сторонами a, b и c. Для решения задачи воспользоваться формулой Герона s = (p*(p-a)*(p-b)*(p-c))1/2, где p - полупериметр треугольника.

 
 

 

Рис. 13. Алгоритм главной программы.

 

 

 

Рис. 14. Алгоритм подпрограммы.

 

program example;

var

a, b, c : real ;

procedure tr (ab, bc, ca : real );

var p, s : real;

begin

p := (ab + bc + ca) / 2;

s := sqrt (p * (p - ab) * (p - bc) * (p - ca));

writeln ('s= ', s:6:2)

end;

begin

readln (a, b, c);

tr (a, b, c); { оператор вызова процедуры }

end.

Глобальные переменные a, b и c, описанные в главной программе, используются в операторе вызова процедуры в качестве входных фактических параметров.

Они согласуются с формальными параметрами ab, bc и ca процедуры по числу, типу и взаиморасположению в своих списках.

Следовательно, при вызове процедуры её формальный параметр ab примет значение фактического параметра a, параметр bc значение параметра b, а параметр ca значение параметра c.

Как формальные параметры-значения, так и переменные p и s, описанные в разделе var процедуры, являются локальными переменными и главной программе недоступны. Поэтому вывод результата счёта-переменной s предусмотрен не в главной программе, а в процедуре.

Значения глобальных переменных a, b и c после выполнения процедуры останутся неизменными.

Для того, чтобы процедура могла не только изменить значения передаваемых ей параметров, но и возвратить их новые значения в главную программу, в заголовке процедуры нужно объявить соответствующие им формальные параметры переменными, поставив перед ними ключевое слово var:

var имя1, имя2, ... : t;

где имя1, имя2, ... - имена параметров; t - тип параметров.

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

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

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

Используя процедуру tr, вычислить поверхность треугольной пирамиды, если известны длины ее ребер a, b, c, d, e и f.

program example;

var

a, b, c, d, e, f, s1, s2, s3, s4 : real ;

procedure tr (ab, bc, cd : real ; var s : real );

var

p : real ;

begin

p:=(ab + bc + cd ) / 2;

s:=sqrt (p * (p - ab) * (p - bc) * (p - cd))

end;

begin

readln (a, b, c, d, e, f);

tr (a, b, c, s1); tr (a, d, e, s2);

tr (b, e, f, s3); tr (c, f, d, s4);

write ('поверхность равна ', s1 + s2 + s3 + s4)

end.

В главной программе предусмотрены четыре обращения к процедуре tr (по числу граней пирамиды). Список её формальных параметров состоит из трёх локальных переменных (параметры-значения ab, bc, cd) и одной глобальной (параметр-переменная s).

При первом обращении к процедуре в ячейку s будет записан адрес переменной s1, а в ячейки ab, bc и cd значения переменных a, b и c. Результат выполнения процедуры (площадь треугольника со сторонами a, b и c) будет записан в ячейку s1, адрес которой процедура найдёт в ячейке s.

Таким образом, главная программа получит доступ к результату, вычисленному в процедуре, и использует его в вычислении площади поверхности пирамиды. После выполнения процедуры значения переменных ab, bc и cd будут «забыты».

Остальные обращения к процедуре tr будут выполнены аналогично.

 

Функции.

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

Для возврата в главную программу вычисленного функцией значения в теле функции необходимо предусмотреть хотя бы один оператор присваивания, в котором слева от символа ’:=’ ставится имя функции, а справа - выражение, вычисляющее её значение. Таких операторов в теле функции может быть и несколько, но при каждом обращении к ней должен выполняться только один.

Тип значения, вычисляемого функцией, задаётся в её заголовке, имеющем вид:

function имя_функции (список формальных параметров):t;

где t - тип вычисляемого значения.

Вычисление площади треугольника оформить в виде функции.

function tr1(ab, bc, ca : real ) : real ;

var

p : real ;

begin

p:=(ab + bc + ca) / 2;

tr1:=sqrt(p * (p - ab) * (p - bc) * (p - ca))

end;

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

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

program example;

var

a, b, c, d, e, f, s : real;

function tr1(ab, bc, ca : real ):real;

var

p : real;

begin

p:=(ab + bc + ca) / 2;

tr1:=sqrt (p * (p - ab) * (p - bc) * (p - ca))

end;

begin

readln (a, b, c, d, e, f);

s:=tr1 (a, b, c) + tr1 (a, d, e) + tr1(b, e, f) + tr1(c, f, d);

writeln ('s= ', s:10:2)

end.

Оператором вызова служит оператор присваивания. Операндами его арифметического выражения являются четыре обращения к функции.

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

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

 

Доверь свою работу ✍️ кандидату наук!
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



Поиск по сайту:







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.