Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию.docx
Скачиваний:
11
Добавлен:
01.05.2025
Размер:
683 Кб
Скачать
☆

Экзаменационный вопрос № 28. Программирование с использованием подпрограмм

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

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

Синтаксис заголовка процедуры:

PROCEDURE < имя процедуры > [( <список формальных параметров)];

П р и м е р

PROCEDURE IME (А,В,С : INTEGER; VAR S: REAL);

Здесь IME — имя процедуры, A, B, C, S — имена переменных, являющихся параметрами.

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

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

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

Таким образом, для приведенного заголовка процедуры можно написать такой оператор вызова: IME (A,B,C,S);

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

Синтаксис заголовка функции:

FUNCTION < имя функции >[(<список формальных параметров>)]:

<тип результата>

П р и м е р

FUNCTION IME (A,B,C: INTEGER): REAL;

Отличие описания функции от процедуры:

— результатом обращения к функции может быть одно значение;

— идентификатор результата не указывается в списке формальных параметров;

— в выполняемой части функции хотя бы один раз ее имени должно быть присвоено значение результата (чаще всего перед выходом из функции);

— после списка формальных параметров задается тип результата;

— после обращения к функции управление передается на выполнение следующей операции данного выражения (в соответствии с приоритетом).

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

П р и м е р

S:= IME (А,В,С);

Writeln(IME (A,B,Q);

If IME (A,B,C)>20 then K=K+1;

При описании процедуры (функции) в ее заголовке могут быть указаны формальные и фактические параметры. Причем:

— число формальных и фактических параметров должно быть одинаково;

— порядок следования и тип фактических и формальных параметров должны совпадать;

— идентификаторы формальных и фактических параметров могут совпадать;

— в паскале формальные параметры в заголовке находятся вместе с описаниями и объявлять их в разделе описаний процедуры (функции) не требуется;

— формальные параметры должны иметь простые или ранее определенные типы.

Параметры бывают четырех типов:

  1. значения;

  2. переменные;

  3. функциональные;

  4. процедурные.

Отличие параметров-значений от параметров-переменных рассмотри на следующем примере.

Program p1;

var a,b: integer;

procedure proc1(x: integer; var y: integer);

begin

x:=x+1;

y:=y+1;

end;

begin

a:=10;

b:=10;

proc1(a,b);

writeln(‘a=’, a, ‘ b=’, b);

end.

В результате получим: а =10, b = 11. Так как переменная а передается по значению, то при выполении процедуры создается локальная переменная x, недоступная за пределами этой процедуры. Любые изменения переменной x не затрагивают значения переменной а. Параметр b передается по имени, поэтому любое обращение к переменной y равносильно обращению к переменной b. Основное назначение процедурных и функциональных типов — дать возможность передать функции и процедуры другим подпрограммам. При трансляции программы создается список глобальных, т. е. явно описанных в основной программе, переменных. Когда транслируется подпрограмма, то формируется список локальных переменных, которые явно описаны в данной подпрограмме. Когда в программе встречается имя переменной, она сначала определяется в списке локальных переменных. Если это имя не найдено, то поиск происходит в списке глобальных переменных.

Program primer1;

var a: integer;{глобальная переменная}

……………………..

procedure P1;

var a: integer; {локальная переменная}

begin

……

a:=a+1; {локальная переменная}

end;

begin

a:=a+1; {глобальная переменная}

end.

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

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