Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка з Інформатики.doc
Скачиваний:
18
Добавлен:
08.05.2019
Размер:
2.29 Mб
Скачать

Лабораторна робота № 31-33. Процедури та функції. Методичні рекомендації

Якщо в програмі виникає необхідність частого звернення до деякої групи операторів, які виконують дії або обчислюють вираз, то раціонально згрупувати ці оператори в блок, до якого можна звертатися по імені. Такі розроблені програмістом самостійні програмні блоки називаються підпрограмами користувача. Використання підпрограм дозволяє, зосереджуючи в них детальний опис деяких операцій, в основній програмі вказувати тільки імена підпрограм, щоб виконати ці операції. Такі звернення до підпрограм можливі багаторазові та з різних ділянок основної програми, причому при виклику підпрограми можна передати інформацію (різну в різних зверненнях), щоб одна і та ж підпрограма виконувала розв’язання підзадачі для різних випадків.

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

Структура процедури повторює структуру програми, вона також представлена заголовком та тілом. На відміну від програми, для процедур та функцій заголовок є обов’язковим. Заголовок складається із зарезервованого слова procedure, ідентифікатора (імені) процедури та необов’язкового, заключеного в круглі дужки, списку формальних параметрів із вказанням типу кожного параметра:

Procedure Ім’яПроцедури (ФормальніПараметри);

Ім’я процедури повинно бути унікальним, тобто його не можна використовувати повторно в програмі для найменування інших процедур. Тіло процедури за своєю структурою аналогічне звичайній програмі:

Procedure Ім’яПроцедури (ФормальніПараметри);

{Описова частина процедури}

begin

{Інструкції виконуваної частини процедури}

end;

Для звернення до процедури використовується оператор виклику процедури. Він складається з імені процедури та списку фактичних параметрів, що відділені один від одного комами та заключені в круглі дужки. Список параметрів відсутній, якщо процедурі не передаються жодні значення.

Ім’яПроцедури (ФактичніПараметри);

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

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

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

Опис міток, констант, типів і т.п. дійсний тільки в межах даної користувальницької процедури. Для примусового виходу з процедури використовується оператор завершення exіt, що забезпечує вихід у зовнішній блок (зазвичай - основну програму).

Приклад . Запишемо процедуру, що виконує зведення до цілого ненегативного степеня будь-яке числа. За допомогою даної процедури обчислимо, скільки байтів міститься в кілобайті, мегабайті і гігабайті, використовуючи відомі співвідношення: 1Кбайт = 210 байт, 1 Мбайт =220 байт, 1 Гбайт =230 байт

procedure degree(x: real; n: byte; var res: real);

{ процедура приведення числа х до цілого невід’ємного степеня n, }

{ результатом є параметр-змінна res }

var i: integer;

begin

res:=l;

for i:=l to n do res:=res*x;

end;

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

var kb,mb,gb: real;

begin

degree(2,10,kb);

degree(2,20,mb);

degree(2,30,gb);

writeln('l Kb = ', kb:4:0, ' byte');

writeln('l Mb = ', mb:7:0, ' byte');

writeln('l Gb = ', gb:10:0,' byte');

end.

Функції користувача

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

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

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

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

function Ім’яФункції(ФормальніПараметри): ТипРезультату;

Наприклад:

function fibo(n: integer): integer;

function instep(a,b: real): real;

function normrandom : double;

Ім'я функції унікальне в межах програми. Тіло функції за своєю структурою аналогічне звичайній програмі:

function Ім’яФункції(ФормальніПараметри) : ТипРезультату;

{ Описова частина функції }

begin

{ Інструкції виконуваної частини функції }

Ім’яФункції := Результат;

end;

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

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

Для допитливих !!!

Приклад.

У 1202 р. італійський математик Леонард Пізанський, відомий під ім'ям Фібоначчі, запропонував наступну задачу. Пара кроликів кожен місяць дає приплід - двох кроликів (самця і самку), від яких через два місяці уже виходить новий приплід. Скільки пар кроликів буде через рік, якщо на початку року ми мали одну пару тільки що народжених кроликів? Звертається увага на те, що числа, які відповідають кількості пар кроликів по місяцях, складають послідовність

1, 1, 2, 3, 5, 8, 13, 21.34 , ....

Кожний із членів цієї послідовності, починаючи з третього, дорівнює сумі двох попередніх членів. Ця послідовність називається рядом Фібоначчі, а її члени - числами Фібоначчі. Числа Фібоначчі мають багато цікавих властивостей. Ряд Фібоначчі визначають так:

F0 = F1 = 1; … Fn = Fn-1 + Fn-2.

Програма обчислення членів ряду Фібоначчі

function fibo(n: integer): integer;

{ функція обчислення чисел Фібоначчі }

var fn,fnl,fn2,k: integer;

begin

fnl:=1;

fn:=0;

for k:=l to n do

begin

fn2:=fnl;

fnl:=fn;

fn:= fnl+fn2;

end;

fibo:= fn; { імені функції присвоюється значення, яке повертається }

end;

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

var i, n: integer;

begin

write('Введіть число членів ряду Фібоначчі: '); readln(n);

for i:= 1 to n do writeln(fibo(i)); { викликв функції }

end.

Завдання 1.

Виконати завдання з використанням умови завдання 2 лабораторної роботи 28 із використанням процедури для оформлення результатів у вигляді таблички. Горизонтальні лінії якої виділити різним кольором (за допомогою звернення до процедури).

Завдання 2.

Скласти програму з використанням процедури для обчислення виразу:

  1. S = 1 + 3 + 5 + 7 + … + (2n - 1);

  2. S = 1 + 9 + 25 + … + (2n - 1)2;

  3. S = 1 + 27 + 125 + … + (2n - 1)3;

  1. S =

  1. P =

  1. S =

  1. S =

  1. S = 2 + 4 + 6 + 8 + … + 2n ;

  2. S = 2 + 4 + 16 + … + ( 2n )2;

  3. S = 8 + 64 + 216 + … + ( 2n )3

  1. S =

  1. S =