- •Лекция № 6. Тема: Методология процедурного программирования.
- •Принципы процедурного программирования
- •Структурирование алгоритма в терминах процедур и функций Процедуры и функции
- •Описание процедур
- •Формальные параметры. Локальные и глобальные объекты
- •Оператор процедуры. Фактические параметры
- •Функции
- •Примеры описаний функций.
- •Рекурсивно-определенные процедуры и функции
Оператор процедуры. Фактические параметры
Оператор процедуры имеет вид:
< имя > или < имя > (< список фактических параметров >)
Синтаксическая диаграмма оператора процедуры:
Оператор процедуры
Примеры операторов процедуры:
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) ни памяти, ни пересылок не понадобится.
