Приклади операторів процедури:
Picture;
Power(( a + b )/2, 3, degree, root );
Integral ( 0, P/2, 1E-6, SUMMA);
Зверніть увагу на відповідність між заголовком процедури і оператором процедури. Між списками формальних і фактичних параметрів встановлена взаємно-однозначна відповідність, що визначена їх місцями в списках. Ця відповідність ілюструється наступним прикладом:
Приклад 5.1. Розглянемо заголовок процедури і оператор цієї процедури:
Procedure Integral ( a, b, eps: real; var s: real );
Integral ( -Pi/2, Pi/2, 1E-6, summa );
Відповідність:
Формальний параметрФактичний параметр
Значення а Вираз -Рі/2
Значення b Вираз Рі/2
Значення eps Дане 1Е-6
Змінна s Змінна Summa
Як було вказано вище, параметри бувають 2-х видів: параметри-значення і параметри-змінні. Якщо перед описанням параметрів ніякого службового слова немає, мова йде про параметри-значення. Перед описанням параметрів-змінних ставиться службове слово var. При зверненні до процедури (в процесі виконання оператора процедури) формальним параметрам-значенням присвоюються значення відповідних фактичних параметрів, а замість імен формальних параметрів-змінних підставляються відповідні фактичні параметри – імена змінних, а потім виконується підпрограма, що описана процедурою.
Якщо х1, х2, ..., хn – фактичні параметри-змінні, відповідні формальним параметрам-змінним v1, ... , vn, то x1, x2, ..., xn повинні бути різними. Фактичними параметрами-значеннями можуть бути вирази або дані відповідних типів.
Розглянемо приклад:
Приклад 5.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)
ні пам’яті, ні пересилань не знадобиться.
5.4. Функції
Поряд із стандартними функціями, у мові можна визначити і інші необхідні програмі функції. Функція – це підпрограма, що визначає одне - єдине скалярне або посилальне значення, що використовується при обчисленні виразу. Описання функції має, по суті, такий самий вид, як і описання процедури. Різниця тільки у заголовку, який має вид:
Function < ім’я > : < тип результату > ;
або
Function < ім’я > (<описи аргументів (параметрів)>): < тип результату>;
Синтаксична діаграма заголовка функції: