- •7.1. Необходимость структуризации в программировании
- •7.2. Подпрограммы в языке паскаль
- •7.2.1. Стандартные библиотечные модули
- •7.2.2. Встроенные функции и процедуры
- •7.3. Процедуры и функции пользователя
- •7.3.1. Процедуры
- •7.3,2. Функции
- •7.3.3. Механизм передачи параметров
- •7.3.4. Область действия параметров
- •7.3.5. Рекурсии
- •7.3.6. Нетрадиционное использование подпрограмм
7.3.4. Область действия параметров
При создании программ, использующих процедуры, следует учитывать, что все гоъекты (метки, константы, типы, переменные, процедуры и функции), которые ?писываются после заголовка процедуры, называются локальными объектами и юступны только в пределах этой процедуры, но недоступны вызывающей программе. Все эти объекты создаются при входе в процедуру и уничтожаются при выходе из нее. Если одно и то же имя определено в нескольких процедурах, вызываемых одной и той же программой, то в каждой процедуре этому имени соответствует свой локальный объект.
Все объекты, описанные в вызывающей программе, называются глобальными и являются доступными внутри процедур, вызываемых этой программой. Поэтому обмен данными между программой и вызываемой ею процедурой может производиться и через глобальные переменные. Если одно и то же имя определено и в программе, и в вызываемой ею процедуре, то ему соответствует глобальный объект, но внутри процедуры глобальный объект недоступен, он как бы экранируется i маскируется) локальным объектом с таким же именем.
В Турбо Паскале допускается любой уровень вложенности процедур и функций. Процедура, описанная в основной программе, в свою очередь, может иметь описания внутренних процедур и функций и т. д. При этом объекты, описанные в вызывающей процедуре, являются глобальными по отношению к вызываемой процедуре.
Можно схематически изобразить структуру блоков некоторой Паскаль-программы, как показано на рис. 7.2.
Рис.7.2. Структура блоков некоторой Паскаль-программы
Для доступа к объектам, описанным в различных блоках, требуется соблюдать следующие правила:
-
Имена объектов, описанных в некотором блоке, считаются известными в пределах данного блока, включая и все вложенные блоки.
-
Имена объектов, описанных в блоке, должны быть уникальны в пределах данного блока и могут совпадать с именами объектов из других блоков.
-
Если в некотором блоке описан объект, имя которого совпадает с именем объекта, описанного в объемлющем блоке, то это последнее имя становится недос тупным в данном блоке (оно как бы экранируется одноименным объектом данного блока).
Если применить эти правила к предыдущей схеме, можно сказать, что объекты, описанные в блоке В, известны (видимы) кроме самого блока В еще и блоках С и D, но невидимы в блоке А. Объекты, описанные в блоке F, известны только в пределах этого блока. Например:
Иногда при вызове подпрограмм-функций возникают побочные эффекты, выражающиеся в том, что вносятся нежелательные изменения в значения глобальных переменных. Поэтому будьте внимательны при описании параметров-переменных, при выборе имен учитывайте наличие глобальных объектов с такими именами.
В качестве примера с вложенными подпрограммами рассмотрим пример программы, определяющей количество сверхпростых чисел в натуральном ряду чисел, не превышающих 1000. Сверхпростым называется число, если оно простое, и число, полученное из исходного числа, при записи цифр исходного числа в обратном порядке (перевертыш) тоже будет простым. Например, 13 и 31 — сверхпростые числа.
Упражнение 6. Проанализируйте текст программы, обратив особое внимание на применение функций определения простого числа, функцию получения перевертыша и вложенный вызов функции Prost(Povorot(X)), при котором переменные D, I, Flag, локальные для функции Prost, являются глобальными для функции Povorot.
Запустите интегрированную среду программирования. Введите текст программы Sverx_Prost и запишите файл на диск под соответствующим именем, а затем откомпилируйте его. После того как компиляция выполнится успешно, задайте для просмотра в окне отладчика переменные X, К, I, D, S, Flag. Установите видимыми одновременно окна редактора с текстом программы и окно просмотра. Исполните программу в пошаговом режиме с заходом в функцию и пронаблюдайте за изменениями значений переменных в основной программе и в функциях, обратите внимание на передачу значений при вызове функции от фактических параметров основной программы формальным параметрам функции, на возвращение вычисленных функциями значений в точку вызова главной программы, а также на характер изменения значений параметров локальных переменных I, D и глобальных переменных X, К.