Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИНФОРМАТИКА_Паскаль.doc
Скачиваний:
7
Добавлен:
08.05.2019
Размер:
1.77 Mб
Скачать

11. Процедуры и функции

11.1. Понятие подпрограммы

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

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

В языке TURBO PASCAL используются две разновидности подпрограмм: ПРОЦЕДУРЫ (PROCEDURE) и ФУНКЦИИ (FUNCTION). Процедура обеспечивает вычисление одного или нескольких значений, а функция - одного значения. Поэтому обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами. Они имеют разный механизм обращения и форму объявления. Вызов подпрограммы осуществляется простым упоминанием имени процедуры в операторе вызова процедуры или имени функции в выражении.

Все подпрограммы языка Pascal делятся на две группы:

- стандартные (встроенные). В основной программе они не описываются, а вызываются на выполнение по имени.  Примервстроенныхпроцедур: WRITE(X), WRITELN(X), READ(S), READLN(S). Встроенные функции: SIN(X), LN(X) и др.

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

Применение подпрограмм позволяет:

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

- уменьшить объем программы;

- обеспечить универсализацию модулей и возможность применения их для других задач и других исходных данных;

- создать условия для автономной работы нескольких исполнителей.

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

11.2. Описание процедуры

Описание процедуры имеет следующую структуру:

PROCEDURE ИМЯ (СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ);

РАЗДЕЛ ОПИСАНИЙ

BEGIN

РАЗДЕЛ ОПЕРАТОРОВ (тело процедуры)

END;

Первую строку называют  заголовком процедуры.

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

Возможно использование параметров следующих видов:

- параметры-значения;

- параметры-переменные;

- параметры-процедуры;

- параметры-функции.

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

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

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

Параметры-процедуры  указываются после служебного слова PROCEDURE.

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

Пример заголовка процедуры

PROCEDURE KRL (A,B:REAL; FUNCTION F(X:REAL):REAL);

PROCEDURE P(X,Y:REAL); VAR R:REAL);

В этом примере A,B - параметры-значения, FUNCTION - параметр-функция, PROCEDURE - параметр-процедура, R - параметр-переменная. Список формальных параметров необязателен и может отсутствовать. В этом случае объявляется процедура без параметров, например, процедура рисования строки звездочек фиксированной длины по месту установки курсора.

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

ИМЯ_ПРОЦЕДУРЫ(СПИСОК ФАКТИЧЕСКИХ ПАРАМЕТРОВ).

Значения фактических параметров присваиваются формальным параметрам при вызове процедуры

Имена фактических и формальных параметров могут не совпадать (даже лучше, если они не будут совпадать, потому что при этом есть вероятность сделать меньше ошибок). Однако необходимо придерживаться следующих правил:

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

- порядок следования фактических параметров при обращении должен  совпадать с порядком следования соответствующих формальных параметров;

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

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

а : Integer = 5;

b : Integer = 7 ;

{-----------------}

ProcedureInc2 (varc: Integer; b: Integer); {Заголовок процедуры в объявлении}

begin {Начало тела процедуры Inc2}

с := с + с;

b := b + b;

WriteLn ( 'удвоенные: ', c:5, b:5);

end; {Окончание тела inc2}

{--------------}

begin {Начало тела основной программы}

WriteLn('исходные: ', a:5, b:5);

Inc2(a,b); {Вызов процедуры с передачей фактических параметров}

WriteLn('результат: ', a:5, b:5)

end. {Окончание основной программы}

В результате прогона программы будет выведено на монитор:

- "исходные: 5 7" (это значения переменных до вызова процедуры);

- "удвоенные: 10 14" (это значения, которые выводятся в самой процедуре под именами формальных параметров. В данном случае переменная В является внутренней переменной процедуры);

- "результат: 10 7" (это значения переменных основной процедуры, в том числе и переменной В).

Как видно из примера, удвоение второго формального параметра (В) в процедуре INC2 не вызвало изменения фактической переменной В, так как этот параметр описан в заголовке процедуры как параметр-значение. Этот пример может служить еще и иллюстрацией механизма «накрывания» глобальной переменной одноименной локальной: хотя переменная В объявлена как глобальная (она описана в вызывающей программе перед описанием процедуры), в теле процедуры ее «закрыла» локальная переменная В, объявленная как параметр-значение.