Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

Процедури і функції

Процедура ( послідовність дій (записаних на Паскалі), названа яким-небудь ім'ям. Для того щоб виконати цю послідовність, потрібно у відповідному місці програми вказати її ім'я (так, наприклад, для очищення екрана при роботі з графікою ми вказуємо ClearDevice;). Крім того, що програма стає при використанні процедур коротше і зрозуміліше, процедури можна викликати з різних місць програми (у противному випадку довелося б повторювати в тексті програми однакові послідовності дій кілька разів).

Ті дії, що входять у процедуру, записуються до початку основної програми в наступному виді:

program ...

const ...

type ...

var ...

procedure MyProc;

begin

{дії}

end;

begin

{основна програма}

end.

Розглянемо приклад знаходження максимуму з трьох чисел:

program Max1;

var a,b,c,m: integer;

begin

write('Уведіть a: '); readln(a);

write('Уведіть b: '); readln(b);

write('Уведіть c: '); readln(c);

if a>b then m:=a else m:=b;

if c>m then m:=c;

writeln('Максимум = ',m);

readln;

end.

Перепишемо його з використанням процедури:

program Max2;

var a,b,c,m: integer;

procedure FindMax;

begin

if a>b then m:=a else m:=b;

if c>m then m:=c;

end;

begin

write('Уведіть a: '); readln(a);

write('Уведіть b: '); readln(b);

write('Уведіть c: '); readln(c);

FindMax;

writeln('Максимум = ',m);

readln;

end.

Цей варіант можна поліпшити. Поки наша процедура може шукати мінімум тільки серед значень конкретних змінних a, b і c. Змусимо її шукати мінімум серед будь-яких трьох цілих чисел і поміщати результат у потрібну нам змінну, а не завжди в m.

Щоб була видна користь від такої процедури, розглянемо приклад програми для пошуку максимуму серед чисел a+b, b+c и a+c:

program Max3;

var a,b,c,m: integer;

procedure FindMax(n1,n2,n3: integer; var max: integer);

begin

if n1>n2 then max:=n1 else max:=n2;

if n3>max then max:=n3;

end;

begin

write('Уведіть a: '); readln(a);

write('Уведіть b: '); readln(b);

write('Уведіть c: '); readln(c);

FindMax(a+b,b+c,a+c,m);

writeln('Максимум із сум = ',m);

readln;

end.

У дужках після імені процедури (у її описі) записані так називані параметри. Цей запис позначає, що усередині процедури можна використовувати цілі числа, позначені n1, n2 і n3, а також заносити значення в змінну типу integer, що усередині процедури називається max (а реально під час роботи програми всі дії виконуються над змінною m). Параметри, у яких зберігаються числа (n1,n2,n3) називаються параметрами-значеннями; а ті, котрі позначають змінні (max) – параметрами-змінними, перед ними в описі ставиться слово var. Параметри, на які маються посилання усередині процедури (n1, n2, n3, max), називаються формальними, а ті, котрі реально використовуються при виклику (a+b, b+c, a+c, m) — фактичними.

Процедури останнього виду виявляються досить зручними. Можна один раз написати таку процедуру, переконатися в її працездатності і використовувати в інших програмах. Прикладами таких процедур є процедури для роботи з рядками, убудовані в Турбо-Паскаль.

У нашому прикладі можна переписати програму і по-іншому. Максимум із трьох чисел визначається по них однозначно, чи, говорячи математичною мовою, є функцією цих трьох чисел. Поняття функції є також і в Паскале. Розглянемо таку програму:

program Max4;

var a,b,c,m: integer;

function Max(n1,n2,n3: integer) : integer;

var m: integer;

begin

if n1>n2 then m:=n1 else m:=n2;

if n3>m then m:=n3;

Max:=m;

end;

begin

write('Уведіть a: '); readln(a);

write('Уведіть b: '); readln(b);

write('Уведіть c: '); readln(c);

writeln('Максимум = ',Max(a+b,b+c,a+c));

readln;

end.

Нам уже відомо як викликати функцію з програми (наприклад sqrt, sin і т.п.). Розглянемо опис функції. Воно дуже схоже на опис процедур, але є дві відмінності:

  1. Після імені функції і списку параметрів (якщо є) через двокрапку записується тип значення функції (можливі не тільки числові типи, але і логічні, строкові, символьні);

  2. Серед операторів у тілі функції найбільш важливими є оператори присвоювання значення функції (у нашому випадку це рядок Max:=m;).

У записаній вище функції використовується так називана локальна змінна m, тобто змінна, котра «видна» тільки нашій функції, а інші процедури і функції, а також головна програма її «не бачать». Крім локальних змінних у Турбо-Паскалі можна визначати локальні константи і типи.

Приведемо інші приклади процедур і функцій.

  1. Напишемо на Паскале функцію .

function Cube(x: real): real;

begin

Cube:=x*x*x;

end;

  1. Обчислення площі трикутника через довжини сторін. Тут буде використана формула Герона: , де p – напівпериметр трикутника, a, b, c – довжини сторін.

function Square(a,b,c: real): real;

var p: real;

begin

p:=(a+b+c)/2;

Square:=sqrt(p*(p-a)*(p-b)*(p-c));

end;

  1. Процедура для рішення квадратного рівняння. Будемо передавати цій процедурі коефіцієнти рівняння, а результати своєї роботи вона буде видавати в трьох параметр-перемінних. Через першу, логічного типу, процедура повідомить, є чи речовинні корені, а ще в двох вона видасть самі ці корені (якщо коренів ні, те на ці два перемінні користувачів нашої процедури може не звертати уваги).

procedure SqEquation(a,b,c: real; var RootsExist: boolean; var x1,x2: real);

var d: real;

begin

d:=sqr(b)-4*a*c;

if d>=0 then begin

RootsExist:=true;

x1:=(-b+sqrt(d))/(2*a);

x2:=(-b-sqrt(d))/(2*a);

end

else RootsExist:=false;

end;

Можна замість процедури написати і функцію, за логічним значенням якої ми визначаємо, чи є корені, а самі корені передавати також як і в процедурі:

function EqHasRoots(a,b,c: real; var x1,x2: real) : boolean;

var d: real;

begin

d:=sqr(b)-4*a*c;

if d>=0 then begin

EqHasRoots:=true;

x1:=(-b+sqrt(d))/(2*a);

x2:=(-b-sqrt(d))/(2*a);

end

else EqHasRoots:=false;

end;

Використовувати таку функцію навіть простіше чим останню процедуру:

if EqHasRoots(1,2,1,r1,r2) then writeln(r1,' ',r2) else writeln('Немає коренів');