- •Лекція 4. Процедури та функції. Процедури та функції у мові Pascal. Локальні та глобальні змінні. Формальні та фактичні Модульний підхід до програмування.
- •3.2. Загальна структура підпрограми.
- •Області дії імен.
- •Var x1: byte absolute d;
- •Функції.
- •Var y: longint;
- •Процедури.
- •Var x1,y1,x2,y2,x3,y3, pl, per:real;
- •Контрольні запитання.
Var x1: byte absolute d;
x2: word absolute d;
x3: longint absolute d;
begin
case sizeof(d)
1: writeln(‘ 1 байт’);
2: writeln(‘ 2 байта’);
4: writeln(‘ 4 байта’);
end;
end;
В описаній програмі використовується механізм absoluteвикористання пам’яті. Він допускає розміщення змінних у тій ділянці пам’яті, яка вже відведена для іншої змінної. Нехай в якомусь блоці описана змінна А. Опис змінної В виду
var B: t absolute A;
де Т – деякий тип, задає розміщення змінної В в тій же ділянці пам’яті, в якій вже розміщено змінну А.
У випадку такого опису нова область для нової змінної не відводиться. Крім того, змінні А та В можуть бути будь-яких типів, в тому числі і різних типів. Вони можуть займати різний об’єм пам’яті. Ніяких перевірок в цьому випадку не виконується. Можна вважати, що такий опис задає розміщення змінних А та В, починаючи з однієї адреси комірчин пам’яті. Таке суміщення пам’яті для різних змінних використовується для досягнення більшої ефективності об’єктного коду програми, і для уникнення використання громіздких операторів перетворення типу змінних у деяких випадках. Особливо це корисно при використанні нетипізованих змінних.
Крім локальних об’єктів розглядають також поняття глобальних об’єктів. Вони визначаються до опису підпрограми. Область дії глобальних об’єктів - вся програма, включаючи всі підпрограми. Для глобальних об’єктів не можна змінювати їх тип у підпрограмі. Але в програмі та в підпрограмі глобальні об’єкти можуть мати різне значення. Це може привести до помилки при виконанні програми. Такі помилки визначають ефект, який називають побічним (хвильовим). Виникає цей ефект, коли до таких змінних в підпрограмі використовують оператор присвоювання, або глобальний об’єкт використовують як параметр - змінну. Тому краще дуже обережно використовувати глобальні об’єкти при побудові підпрограм.
Функції.
Функцією називають підпрограма, в результаті виконання якого обчислюється тільки одне значення. Функція описується в розділі опису Pascal - програми таким чином:
function ім’я_функції(список_форм._параметрів: тип_форм._пар.):тип_функції;
розділ опису функції;
begin
розділ операторів функції
end;
Серед операторів функції обов’язковим є оператор присвоювання, в якому імені функції присвоюється кінцеве значення.
Деякі з тих задач, що були розглянуті у другому розділі, дуже часто використовуються у різних задачах. Тому є сенс описати їх у вигляді функції та запам’ятати.
Приклад 3.1. Скласти функцію обчислення n!.
function fact(n:integer): longint;
Var y: longint;
i: integer;
begin
y:=1;
for i:=1 to n do
y:=y*i;
fact:=y;
end;
Приклад 3.2. Скласти функцію обчислення xk, де k- натуральний показник:
function st(x:real; k:integer): real;
var y: real;
i: integer;
begin
y:=1;
for i:=1 to k do
y:=y*x;
st:=y;
end;
А тепер ще декілька прикладів, які використовують функцію.
Приклад 3.3 Скласти функцію, яка знаходить мінімальне значення з двох заданих величин.
function min(a,b:real): real;
begin
if a>b then min:= b else min := a;
end;
Приклад 3.3. Скласти функцію, яка визначає, чи є задане натуральне число простим (таким, що може бути поділеним на одиницю та на саме себе).
function pr(n:integer): boolean;
var i: integer;
begin
pr:= true;
for i:=2 to n-1 do
if n mod i = 0 then pr:= false;
end;
Викликається функція за ім’ям в операторі основної програми.
Приклад 3.5.
Обчислити
Обчислення завершити, коли модуль наступного доданка буде менше за наперед задане е.
Для побудови програми використаємо функції обчислення факторіалу та степеня числа з натуральним показником:
{Опис глобальних змінних}
var x,y,e,a :real;
n: integer;
{Опис функції обчислення факторіалу k!}
function fact(k:integer): longint;
var g: longint;
i: integer;
begin
y:=1;
for i:=1 to k do
g:=g*i;
fact:=g;
end;
{Опис функції обчислення }
function st(x:real; k:integer): real;
var g: real;
i: integer;
begin
g:=1;
for i:=1 to k do
g:=g*x;
st:=g;
end;
{Основна програма}
begin
writeln(‘x,e’);
readln(x,e);
y:=0;
n:=1;
repeat
a:=st(-1,n-1)*st(x,n)/fact(3*n-1);
y:=y+a;
n:=n+1;
until abs(a)<e;
writeln(‘y=’,y:8:4);
end.
На цьому прикладі дуже чітко видно, що програма, в якій використовується функція, легко читається та аналізується. Так, в задачі два рази треба обчислити степінь чисел. Тому є сенс використати функцію, яка розроблена в прикладі 3.2. При цьому нам треба при виклику функції відповідно до завдання один раз використати замість параметру х значення –1, а другий раз значення х. Замість параметру k перший раз використовується значення показника n-1, а другий раз – значення показника n. У знаменнику використовуємо функцію знаходження факторіалу числа 3n-1. Текст самої програми не захаращений циклами. А самі функції можна взагалі описати в окремому файлі, а потім тільки викликати їх у заданий момент. Але про цю можливість ми поговоримо трохи пізніше.
Увага! При використанні функції уважно слідкуйте за відповідністю формальних та фактичних параметрів за типом та порядком їх використання. І не забувайте при опису функції оператор присвоювання ідентифікатору функції отриманого значення.
Функція може не мати параметрів. Тоді після імені функції іде опис її типу. У мові Pascal передбачена можливість виклику функції як процедури, а не в будь-якому операторі. Це введення зроблено по аналогії з мовою С.