Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 10_ОАП.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
96 Кб
Скачать
☆

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

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

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

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

Оператор

процедуры

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

Picture

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

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

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

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

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 должны быть различными. Фактическкими параметрами-значениями могут быть выражения или данные соответствующих типов.

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

Пример. Программа вычисляет координаты точки (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) ни памяти, ни пересылок не понадобится.