Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С_испр_обработка_массивов_new.doc
Скачиваний:
25
Добавлен:
14.08.2019
Размер:
2.49 Mб
Скачать

Структура программы, использующей подпрограммы

Напомним общую структуру Pascal-программы:

Заголовок (необязательный раздел)

Program <имя_программы>;

Раздел описаний

(необязательный раздел)

Uses <имя_библиотеки>;

Const <список констант>;

Type <список определяемых типов>;

Var <список переменных>;

Procedure ;

[Раздел описаний процедуры]

<Раздел исполняемых операторов процедуры>

. . .

Function : ;

[Раздел описаний функции]

<Раздел исполняемых операторов функции>

. . .

Раздел исполняемых операторов (обязательный раздел)

BEGIN

. . .

[Вызовы процедур и функций]

. . .

END.

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

Заголовок процедуры или функции (обязательный раздел)

Procedure ;

Function : ;

Раздел описаний подпрограммы (необязательный раздел)

Const <список констант>;

Type <список определяемых типов>;

Var <список переменных>;

Procedure ;

[Раздел описаний вложенной процедуры]

<Раздел исполняемых операторов вложенной процедуры>

. . .

Function : ;

[Раздел описаний вложенной функции]

<Раздел исполняемых операторов вложенной функции>

. . .

Раздел операторов подпрограммы (обязательный раздел)

Begin

. . .

[Вызовы вложенных процедур и функций]

. . .

End;

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

Program A{заголовок глобального модуля}

Procedure B;

{раздел операторов процедуры В}

Begin

Writeln(’В’)

End; {B}

Procedure C;

{раздел описаний процедуры C}

Procedure C1; {вложена в процедуру C}

Begin

Writeln(’C1’)

End;

{раздел операторов процедуры C}

Begin

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

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

End; {C}

{раздел операторов основной программы А}

Begin

В;

C

End. {A}

Локальные и глобальные идентификаторы

Использование подпрограмм в языке Turbo Pascal связано с некоторыми особенностями работы с идентификаторами программы (именами констант, типов и переменных).

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

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

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

Основные правила работы с глобальными и локальными именами можно сформулировать так:

  • Локальные имена доступны (считаются известными, "видимыми") внутри того модуля, в котором они описаны, и вложенных в него модулей. Этот модуль, и все другие, вложенные в него, называют областью видимости для этих локальных имен. Например, для программы, представленной в виде структурной схемы на рис.2, глобальные имена x и y известны в основной программе Global и во всех вложенных в нее подпрограммах Loc1, Loc2 и Loc11; локальные имена, описанные внутри модуля Loc1, будут известны в самом модуле Loc1, а также в модуле Loc11, имена x2 и y2 – только в модуле Loc2.

Модуль Global (x и y – объявленные в модуле имена переменных)

Модуль Loc1 (x1 и y1 – объявленные в модуле имена переменных)

Модуль Loc11 (x11 и y11 – объявленные в модуле имена переменных)

Модуль Loc2 (x2 и y2 – объявленные в модуле имена переменных)

Рис. 2

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

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