- •Тема 15. Подпрограммы на языке pascal
- •15.1. Описание процедур
- •15.2.Формальные параметры. Локальные и глобальные объекты
- •15.3.Оператор процедуры. Фактические параметры
- •15.4.Функции
- •15.5. Рекурсивно–определенные процедуры и функции
- •15.5.1. Примеры рекурсивных описаний процедур и функций
- •15.5.2. Преимущества и недостатки рекурсивных алгоритмов
- •15.5.3. Метод “разделяй и властвуй” (рекурсивная процедура)
- •15.6. Стандартные функции
- •15.6.1. Арифметические функции
- •15.6.2. Функции преобразования типа
- •15.6.3. Функции для величин перечисляемого типа
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) ни памяти, ни пересылок не понадобится.