
Лабораторна робота №6 Процедури та функції. Короткі теоретичні відомості.
1. Опис процедур.
Технологія програмування мовою програмування типу мови Pascal пропонує проектувати програми методом послідовних уточнень.
На кожному етапі - кроку уточнення програміст розбиває задачу на деяке число підзадач, визначаючи тим самим деяку кількість окремих підпрограм. Концепція процедур (підпрограм) дозволяє виділити підзадачу як явну підпрограму.
У мові Паскаль процедури визначаються в розділі процедур і функцій за допомогою описань процедур. Звернення до процедури здійснюється оператором процедури.
Розділ процедур
і функцій
Описання процедури таке ж, як і описання програми, але замість заголовка програми фігурує заголовок процедури. Заголовок має вид:
Заголовок
процедури
Приклади заголовка процедури:
procedure Picture;
procedure Power(X: real; n: Integer; var u, v: Real);
procedure Integral( a, b, epsilon: Real; var S: Real);
2.Формальні параметри. Локальні і глобальні об’єкти.
Як бачимо з прикладів, у розділі формальних параметрів перелічуються імена формальних параметрів, а потім вказується їхній тип. Таким чином, кожне описання формальних параметрів з точки зору синтаксису має такий же вигляд, як і описання змінних у розділі змінних. Перед деякими описаннями ставиться службове слово Var. Такі параметри називаються параметрами-змінними. Якщо перед описанням службове слово Var не стоїть, це - параметри-значення. Різницю між цими типами параметрів описано нижче.
Мітки, імена констант, типів, змінних, процедур і функцій, що описуються в тілі процедури, а також всі імена, що вводяться в розділи формальних параметрів є локальними в описанні процедури, яка називається областю дії для цих об’єктів. За межами цієї області вони не відомі.
Резервування пам’яті під локальні об’єкти здійснюється таким чином, що вона “захоплюється” процедурою при її виклику оператором і звільняється при виході з процедури. Такий механізм розподілу пам’яті називається динамічним. Динамічний розподіл дозволяє економити пам’ять, що адресується.
Об’єкти, що описані в основній програмі, доступні для використовування в цій процедурі. Вони називаються глобальними. Відмітимо, що локальний і глобальний об’єкти цілковито різні, але можуть мати одне й те ж ім’я. Якщо, наприклад, змінна Х описана як в основній програмі, так і в процедурі, то в процедурі вона використовується як локальна. Якщо ж в процедурі змінна Х не описана, то в процедурі вона використовується як глобальна.
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 );
Відповідність:
Формальний параметр Фактичний параметр
Значення а Вираз -Рі/2
Значення b Вираз Рі/2
Значення eps Дане 1Е-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) ні пам’яті, ні пересилань не знадобиться.