Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal_lectures_small.doc
Скачиваний:
13
Добавлен:
23.03.2015
Размер:
339.46 Кб
Скачать
    1. Процедуры и функции

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

      1. Описание

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

<процедура>::= <заголовок процедуры> ";" <блок> ";".

<функция>::= <заголовок функции> ";" <блок> ";".

Синтаксис блока описан в подразделе "Структура программы на Паскале". Синтаксис заголовков:

<заголовок процедуры>::= <имя> ["("<список формальных параметров>")"].

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

Поскольку функция является частным случаем фактора, с ее именем связываются ячейки памяти, в которые заносится результат (или один из результатов) выполнения функции. Говорят, что функция возвращает результат через свое имя. Это значение, возвращенное через имя, используется как фактор в выражении (см. структуру выражения в подразделе "Оператор присваивания"). Поэтому в исполняемом разделе функции (в составном операторе, входящем в блок функции) должен быть хотя бы один оператор присваивания вида:

<оператор возврата результата> ::= <имя функции> ":=" <выражение> .

Тип результата должен быть простым типом или указателем.

      1. Список формальных параметров

Формальные параметры – это переменные, через которые производится обмен данными с процедурами и функциями. С формальными параметрами можно производить операции внутри процедур и функций. При обращении к процедуре или функции формальные параметры заменяются фактическими параметрами. Так достигается автономность процедур и функций при их разработке. Имена формальным параметрам присваивает разработчик процедур и функций, а программист, использующий процедуры и функции, просто подставляет нужные фактические параметры при вызове соответствующей процедуры или функции.

Синтаксис:

<список формальных параметров>::=<описание формальных параметров> {";" <описание формальных параметров>}.

<описание формальных параметров>::=["Var"] <имя> {","<имя>}":"<имя типа> | <заголовок функции> | <заголовок процедуры>.

В Паскале возможны три различных формата описания формальных параметров:

1) Параметр-переменная;

2) Параметр-значение;

3) Процедурный (функциональный) параметр.

Рассмотрим их подробнее.

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

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

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

Таким образом, через параметр-переменную можно передавать данные в процедуру или функцию и возвращать результат выполнения процедуры или функции.

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

Параметр-значение.

Описание похоже на описание переменных в соответствующем разделе описаний, но ему не предшествует слово Var.

Фактическим параметром для формального параметра-значения должно быть выражение такого же, или совместимого типа.

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

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

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

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

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

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

Пример: функция, вычисляющая площадь круга .

Function CircleS(R:Real):Real;

Const Pi=3.14159265;

Begin

CircleS:=Pi*R*R

End;

В этой функции один формальный параметр-значение и один результат, возвращаемый через имя функциии.

Пример: процедура для нахождения действительных корней квадратных уравнений вида ax2+bx+c.

Procedure SqEqRoots(a,b,c:Real;Var x1,x2:Real;Var Err:Boolean);

Var d:real;

Begin

d:=b*b-4*a*c; {вычисление дискриминанта}

If d>=0 then begin

d:=sqrt(d);

x1:=(-b-d)/(2*a);x2:=(-b+d)/(2*a);

Err:=False End

else Err:=true

End;

В этой процедуре через параметры-значения передаются коэффициенты квадратного уравнения, через параметры-переменные возвращается результат. Если уравнение имеет действительные корни, они возвращаются через параметры-переменные x1 и x2, а параметр-переменная Err, используемая как признак ошибки, будет иметь значение False. Если у уравнения нет корней, признак ошибки будет иметь значение True, а содержимое переменных x1 и x2 не изменится. В процедуре использована стандартная функция sqrt, которая вычисляет квадратный корень из аргумента (фактического параметра). Подробнее стандартные функции рассмотрены далее.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]