Глава 8. подпрограммы и модули
§ Процедуры и функции
§ Область видимости переменных
§ Формальные и фактические параметры
§ Параметры-значения и параметры-переменные
§ Особенности функций
§ Параметры структурированных типов
§ Рекурсия
§ Процедурный тип
§ Параметры-функции и параметры-процедуры
§ Стандартные математические функции и процедуры
§ Модуль, структура модуля
§ Стандартные модули
Билет 30. Подпрограммы. Структура процедуры и функции.
ПРОЦЕДУРЫ И ФУНКЦИИ
Подпрограммы(процедуры или функции) представляют собой относительно самостоятельные фрагменты программы, оформленные особым способом и снабженные именем. Упоминание этого имени в тексте программы называется вызовомпроцедуры (функции).
Подпрограммы представляют собой инструмент, с помощью которого любая программа может быть разбита на ряд относительно независимых частей, что имеет смысл по двум причинам.
Во-первых, это средство экономии памяти и других ресурсов: каждая подпрограмма существует в программе в единственном экземпляре, в то время как обращаться к ней можно многократно из разных точек программы. Во-вторых, при таком разбиении максимально реализуется принцип нисходящего проектирования. В этом случае алгоритм представляется в виде последовательности относительно крупных подпрограмм, реализующих более или менее самостоятельные смысловые части алгоритма.
Program Calculator;
Begin
Initialize; DrawScreen;
Calculation;
RestScreen; End.
СТРУКТУРА ПОДПРОГРАММЫ, ЗАГОЛОВКИ ПРОЦЕДУРЫ И ФУНКЦИИ
раздел раздел
заголовок ;
Описаний операторов
procedure |
список |
параметров |
; |
function |
список |
параметров |
иденти |
- |
фикатор |
; |
тип |
результата |
: |
ВЫЗОВ ПОДПРОГРАММ
Конец программы |
Конец RestScreen |
Начало RestScreen |
Начало Calculation |
Конец |
Calculation |
Конец |
DrawScreen |
Начало DrawScreen |
Конец Initialize |
Начало Initialize |
Вызов RestScreen |
Вызов |
Calculation |
Вызов |
DrawScreen |
Вызов Initialize |
Начало программы |
Младшие адреса |
Старшие адреса |
Естественный порядок выполнения команд нарушается при обращении к подпрограммам.
СТЕК В ПАМЯТИ
Адрес точки возврата (адрес машинной команды в момент вызова подпрограммы) хранится в ячейках специальной области ОЗУ, которая называется стеком. Кроме того, стек в памяти используется для хранения значений локальных переменных подпрограммы во время выполнения операторов, входящих в ее тело. Принцип его работы совпадает с организацией динамической структуры данных, имеющей такое же имя – стек. Стек – это LIFOустройство (Last In First Out). Стек в памяти заполняется сверху вниз.
После выполнения всех операторов подпрограммы стек освобождается для хранения данных следующей вызванной подпрограммы. В последнюю очередь считывается адрес команды, которая стоит после вызова выполненной подпрограммы в основном блоке (адрес точки возврата).
Билет 31. Подпрограммы. Область видимости переменных.
ОБЛАСТЬ ВИДИМОСТИ ПЕРЕМЕННЫХ
Глобальныеконстанты, типы, переменные – это те, которые объявлены в программе вне процедур или функций. Они доступны из любого места программы.
Локальные– это константы, типы, переменные, существующие только внутри процедур или функций, и объявленные либо в соответствующих разделах Const, Type, Var внутри данной процедуры или функции, либо в списке формальных параметров (как параметры-значения).
Глобальные переменные хранятся в области данных, локальные – в стеке.
Область видимостипеременной (константы, типа) – это ряд операторов, в которых переменная "видна". Все имена, описанные внутри подпрограммы (локальные данные), локализуются в ней, т.е. они как бы "невидимы" снаружи подпрограммы. При наличии вложенных подпрограмм переменные данного уровня являются "видимыми", т.е. доступными для всех нижних уровней описания процедур. Подпрограммы, наряду со своими локальными данными, могут использовать и модифицировать и глобальные. Для этого лишь нужно, чтобы описание процедуры (функции) стояло в тексте программы ниже, чем описание соответствующих глобальных типов, констант и переменных.
Время жизни переменной– это время, в течение которого переменная связана с определенной ячейкой памяти.
ГЛОБАЛЬНЫЕ И ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ
Program Main;
Var
Xmain, Ymain : Real; {глобальные переменные}
Procedure P1; {описание процедуры}
Var
Res : Real; {локальная переменная} begin
Res := 0.5;
Ymain := Res + Xmain*Ymain;
Xmain := Xmain + 1 end; ...
Var {глобальные переменные, недоступные в Р1)
Zmain : Extended; ...
Begin ...
P1; {вызов процедуры}
...
End.
Билет 32.Параметры процедуры и функции.
Параметрыобеспечивают обмен значениями между вызывающей частью программы и вызываемой подпрограммой. Могут быть параметры-значения, параметры-переменные или параметры-константы.
формальными:
Procedure P1 (A : Integer; Var B : Real);
Описываемые в заголовке подпрограммы параметры называются |
( |
идентификатор |
) |
: |
тип |
параметра |
const |
var |
; |
, |
а те, которые подставляются на их место при вызове – фактическими, т. к. они при выполнении программы замещают все вхождения в подпрограмму своих формальных "двойников":
Р1(A_fact,B_fact) ;
Если параметр описан как параметр-значение, то в подпрограмму передается копия значения этого фактического параметра, и никакие изменения этой копии не возвращаются в вызывающий блок. Параметр-значение – это локальнаяпеременная подпрограммы, стартовое значение которых задается при вызове подпрограммы из внешних блоков.
Если параметр описан как параметр-переменная(служебное слово Var в заголовке) или как параметр-константа(слово Const), то в подпрограмму передаются адреса фактических параметров. Все изменения параметрапеременной в подпрограмме происходят с переменной, переданной в качестве фактического параметра. Параметр-константа не может изменяться в подпрограмме.
На место фактического параметра-значения можно подставлять литерал, выражение, идентификатор (переменную или константу), а на место параметрапеременной и параметра-константы – только идентификатор.
{$J+}
Сonst
A : Integer = 5; {типизированные константы} B : Integer = 7;
Адрес переменной А из сегмента данных |
Значение В |
Адрес точки возврата |
Свободные ячейки |
СТЕК |
C := C + C; B := B + B;
Writeln(C,B) end;
Begin
Writeln(A,B);
Plus(A,B);
Writeln( A,B )End.
Билет 33. Подпрограммы. Функции. Рекурсии .
ФУНКЦИИ
Кроме обмена значениями через параметры функция возвращает в вызываемый блок свое значение в виде скаляра, строки или указателя. Для присвоения функции значения ее имя должно появиться хотя бы однажды в левой части оператора присваивания в теле самой функции (альтернатива – Result). Функция имеет побочный эффект, если она производит другие действия, не связанные с вычислениями своего значения.
Var {функция вычисления XY}
X,Y : Real;
Function Power (Arg, P : Real) : Real; begin if Arg <> 0 then
Power := exp(P * ln(abs(Arg))) { Result :=...} else if P = 0 then
Power := 1 | { Result :=...} |
else Power := 0 | {Result :=...} |
end;
Begin