Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 15.doc
Скачиваний:
9
Добавлен:
20.11.2019
Размер:
390.66 Кб
Скачать

15.3.Оператор процедуры. Фактические параметры

Оператор процедуры имеет вид:

< имя >

или

< имя > (< список фактических параметров >)

Синтаксическая диаграмма оператора процедуры:

 Оператор процедуры

Примеры операторов процедуры:

Picture;

Power(( a + b )/2, 3, degree, root );

Integral ( 0, P/2, 1E–6, SUMMA);

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

 Пример 1. Рассмотрим заголовок процедуры и оператор этой процедуры:

Procedure Integral ( a, b, eps: real; var s: real );

Integral ( –Pi/2, Pi/2, 1E–6, summa );

Соответствие:

Формальный параметр

Фактический параметр

Значение a

Выражение –Pi/2

Значение b

Выражение Pi/2

Значение eps

Данное 1E–6

Переменная s

Переменная Summa

Как было указано выше, параметры бывают 2–х видов: параметры–значения и параметры–переменные. Если перед описанием параметров никакого служебного слова нет, речь идет о параметрах–значениях. Перед описанием параметров–переменных ставится служебное слово Var. При обращении к процедуре (в процессе исполнения оператора процедуры) формальным параметрам–значениям присваиваются значения соответствующих фактических параметров, а вместо имен формальных параметров–переменных подставляются соответствующие фактические параметры–имена переменных, а затем исполняется подпрограмма, описанная процедурой.

Если х1, х2,..., хn – фактические параметры–переменные, соответствующие формальным параметрам–переменным v1, ... , vn, то x1, x2, ..., xn должны быть различными. Фактическкими параметрами–значениями могут быть выражения или данные соответствующих типов.

Рассмотрим пример.

Пример 2. Программа вычисляет координаты точки (x0, y0) при последовательных поворотах и параллельных переносах системы координат.

Program Coordinates;

Const Pi = 3.141592;

Var Alfa, Beta : Real;

x0, y0, x1, y1, x2, y2 : Real;

x, y : Real;

Procedure Rotate(x, y, Fi: Real; var u, v: Real );

var cosFi, sinFi : Real; { локальные переменные }

begin

Fi := Fi*Pi/180 ;

cosFi := Cos(Fi); sinFi := Sin(Fi);

{ параметры x, y защищены от глобальных переменных x, y }

u := x * cosFi – y * sinFi ;

v := x * sinFi + y * cosFi

end ;

Procedure Move(x, y, a, b : Real; var u, v: Real);

begin

u := x + a; v := y + b

end;

begin

Read (x0, y0); Read (Alfa);

Rotate(x0, f0, alfa, x, y);

Read (x1, y1);

Move(x, y, x1, y1, x, y);

Read (Beta);

Rotate(x, y, Beta, x, y);

Read ( x2, y2 );

Move(x, y, x2, y2, x, y);

Writeln (‘================================’);

Writeln (‘абсцисса точки : ‘, х); Writeln (‘ордината точки : ‘, y);

end.

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

Пусть, например, переменная A типа Sequence – массив из 1000 действительных чисел и Procedure MaxMin(X : Sequence; var Max, Min : Real) – поиск максимального и минимального элементов массива X. Тогда при обращении к процедуре MaxMin с помощью оператора MaxMin(A, Sup, Inf) компилятор выделит память (6 – 10 байт на каждый элемент массива – всего 6000 – 10000 байт) и осуществит 1000 циклов пересылки чисел из A в X. Если же параметр X определить как параметр–переменную: Procedure MaxMin(var X : Sequence; var Max, Min : Real) ни памяти, ни пересылок не понадобится.