Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОП Конспект лекций - Паскаль.doc
Скачиваний:
20
Добавлен:
30.11.2018
Размер:
1.46 Mб
Скачать

Тема 28: Поняття та робота з процедурами та функціями

При написанні програм часто приходиться зіштовхуватися із ситуаціями, коли однаковий набір операторів потрібно повторити кілька разів. У таких випадках раціонально використовувати підпрограми.

Підпрограма – це іменована логічно закінчена група операторів, яку можна викликати за ім’ям в різних місцях програми будь-яке число раз.

У Pascal-і підпрограми реалізовані у виді процедур і функцій.

Процедура – це іменована логічно незалежна частина програми, призначена для виконання визначених дій після однократного опису.

Для виконання дій, передбачених процедурою, її викликають по імені. Ім'я процедури використовується тільки для її виклику і його не можна використовувати як операнд у вираженнях.

Функція аналогічна процедурі, але відрізняється від неї тим, що з ім'ям функції пов'язується її значення, що передається в точку виклику. Ім'я функції можна використовувати у вираженнях як операнд.

Виділяють дві групи процедур і функцій:

  1. Убудовані (стандартні), що є частиною мови і мають строго фіксовані імена. Зберігаються вони в бібліотечних модулях, що підключаються до програми Uses.

  2. Процедури і функції обумовлені користувачем. Ті дії, що потрібно виконувати в різних місцях програми, можна описати у вигляді процедури чи функції, а потім звертатися до них по імені.

Опис процедур і функцій розташовується в розділі описів і має ту ж структуру, що і програма.

Опис процедури:

procedure ім'я (список формальних параметрів);

розділи описів;

розділ операторів;

end;

Опис функції:

function ім'я (список формальних параметрів) : тип результату;

Розділ опису;

Розділ операторів;

end;

Локалізація імен. Імена змінних не повинні збігатися з ім'ям процедури й усередині локального блоку повинні бути унікальні. Змінні усередині блоку називаються локальними. Змінні в глобальному блоці називаються глобальними.

Імена локальних і глобальних змінних можуть збігатися. У цьому випадку ім'я локальної змінної закриває відповідну глобальною змінну.

Параметри процедур і функцій. У списку формальних параметрів вказуються імена параметрів і їхній тип. Перед іменами змінних може бути var. Приклади.

procedure demo (x,y : real; var z : real);

function power (var i,j : integer; real; var c: char) : boolean;

Список формальних параметрів може бути відсутній, тобто припустимі процедури і функції без параметрів. Формальні параметри використовуються в тілі процедури без їхнього попереднього опису в розділі опису процедури.

При звертанні до процедури чи функції формальні параметри заміняються фактичними.

Приклад.

Обчислити ab (вираження ab заміняємо вираженням exp(b ln(a))):

Приклад використання процедури:

var a,b,c : real; {фактичні параметри}

procedure demo (var x,y,z : real);

begin

if x>0 then z := exp(y*ln(x))

else if x<0 then z := exp(y*ln(abs(x)))

else if y = 0 then z := 1

else z := 0;

end;

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

writeln(‘Введіть значення a, b:’);

read(a,b);

demo(a,b,c); {при звертанні формальні параметри заміняються} {фактичними}

writeln(‘a^b=’,c:3:2);

end.

Приклад використання функції:

var a,b,c : real;{фактичні параметри}

function demo (var x, y: real) : real;

begin

if x > 0 then demo := exp(y*ln(x))

else if x<0 then demo := exp(y*ln(abs(x)))

else if y = 0 then demo := 1

else demo := 0;

end;

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

writeln(‘Dведіть значення a,b:’);

read(a,b);

writeln(‘a^b=’,demo(a,b):3:2);{при звертанні формальні параметри заміняються фактичними}

end.

Виклик функції можна використовувати в списках параметрів оператора Write і Writeln. Для процедур це неможливо.

Як бачимо, імена фактичних параметрів можуть не збігатися з формальними, оголошеними при описі процедури чи функції; важливі їхній порядок і збіг типу.

Параметрі-змінні і параметри-значення. Якщо в списку формальних параметрів процедури чи функції в описі присутнє зарезервоване слово Var, параметр називається параметр-змінної, якщо Var не є присутнім, параметр називається параметром-значенням.

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

Приклад.

function power (var x,y : real) : real;

c := power(a,b); {вірно}

c := power(1,4,b); {не вірно, потрібно тільки ім'я змінної}

Якщо опис такий:

function power(x,y:real) : real;

то

c := power(a,b); {вірно}

c := power(2/*a,b+1,5);{вірно}

2-і відмінність. Якщо формальний параметр описаний як параметр-змінна, то при звертанні до процедури чи функції всі дії, описані в блоці для даного параметра, виконуються безпосередньо над глобальною перемінною, що є відповідно фактичним параметром; у випадку параметра-значення ці дії виконуються не над глобальною перемінною, а над її копією.

Приклад.

var a,b : integer;{фактичні параметри}

procedure double(x : integer; var y : integer);

begin

x := x+x; y := y+y;

writeln(‘Подвоєні: x = ’,x,’ y = ’,у);

end;

begin

a := 1; b := 3;

writeln(‘Вихідні: x = ’,a,’ y = ’,b);

double(a,b);

writeln(‘Після звертання до процедури: x = ’,a,’ y = ’,b);

end.

Результат роботи: Вихідні: x = 1, y = 3

Подвоєні x = 2, y = 6

Після звертання до процедури: x = 1, y = 6

Рекурсивні процедури і функції.

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

Наприклад, n-факторіал можна визначити в такий спосіб:

1, якщо n = 0 При n = 1

n! = n(n-1)!, якщо n ≠ 0 1! = 1*0! = 1;

При n = 2

2!=2*1!=2*1*0!

Рекурсивна функція для обчислення факторіала,

function fact(n : word) : word;

begin

if n = 0 then fact := 1 else

fact := fact(n-1)*n;

end;

Поряд із прямою рекурсією можливий непрямий рекурсивний виклик. Наприклад:

procedure A

. . .

begin

. . .

B;

. . .

end;

procedure B

. . .

begin

. . .

A;

. . .

end;

Непряма рекурсія при такому описі порушує основний принцип ТР: будь-який ідентифікатор перед застосуванням повинний бути описаний.

Щоб допустити можливість рекурсії в ТР вводиться випереджальний опис. Заголовок функції, на який передбачається посилання до опису, описується звичайним чином, а потім слідом за заголовком указується слово forward, що означає, що тіло даної процедури буде далі.

Наприклад.

procedure B;

forward;

procedure A;

. . .

procedure B;

Питання для контролю:

  1. Що таке підпрограма і як вона реалізована в Pascal?

  2. Визначення процедури і функції. Відмінність функції від процедури.

  3. На які групи поділяються процедури і функції?

  4. Опис процедури і функції.

  5. Локалізація імен змінних.

  6. Параметри процедур і функцій.

  7. Параметри-змінні і параметри-значення. Відмінності.

  8. Рекурсивні процедури і функції. Пряма і непряма рекурсія. Випереджальний опис.