Поняття підпрограми-функції
Другим видом підпрограм є функції, які характеризуються тим, що в результаті їх виконання одержується лише один результат. Тоді як процедура може повертати один, кілька або жодного результату.
Загальний опис функції: алг <тип_результату> Ім'я функції (<формальні параметри>)
арг <список аргументів>
рез <результат>
поч
<опис дій>
знач: = <ім'я змінної, що містить результат> або <вираз для обчислення>
кін
арг <список аргументів>
рез <результат>
поч
<опис дій>
знач: = <ім'я змінної, що містить результат> або <вираз для обчислення>
кін
Опис на Pascal:
function <Назва функції> (<формальні параметри>): <тип результату>
<описова частина>;
begin <опис операторів>;
<назва функції>:= <ім'я змінної, що містить результат> або <вираз для обчислення>
end;
Як і в процедурі в заголовку функції описуються формальні параметри (проте їх може і не бути), а з основної частини програми здійснюється виклик для фактичних параметрів.
Функція, як і процедура, може використовувати в обчисленнях глобальні змінні (описані на початку основної програми), так і свої локальні змінні (описані безпосередньо в функції і доступні лише їй).
function <Назва функції> (<формальні параметри>): <тип результату>
<описова частина>;
begin <опис операторів>;
<назва функції>:= <ім'я змінної, що містить результат> або <вираз для обчислення>
end;
Як і в процедурі в заголовку функції описуються формальні параметри (проте їх може і не бути), а з основної частини програми здійснюється виклик для фактичних параметрів.
Функція, як і процедура, може використовувати в обчисленнях глобальні змінні (описані на початку основної програми), так і свої локальні змінні (описані безпосередньо в функції і доступні лише їй).
Отже, процедура і функція мають ряд подібностей. Але є й відмінності.
По-перше, заголовок функції обов'язково містить тип результату. Процедура ж може повертати кілька різнотипних результатів, тому така характеристика для неї була б проблематичною.
Друга відмінність полягає в способі повернення результатів роботи підпрограми в основну програму. Пересилання результатів у функції здійснюється по її назві (<назва функції>: = <ім'я змінної, що містить результат> або <вираз для обчислення>). Тоді як у процедурі використовується службове слова Var перед параметрами-змінними.
По-третє, функція може входити до складу виразів. Подібне ж використання процедури буде помилковим. Наприклад, вираз НСД(a1, b1, rez1) + НСД(a2, b2, rez2) не має змісту, де НСД - розглянута нами раніше (Урок_15) процедура. Використання ж функції у складі виразу розглянемо на цьому уроці трохи пізніше.
По-перше, заголовок функції обов'язково містить тип результату. Процедура ж може повертати кілька різнотипних результатів, тому така характеристика для неї була б проблематичною.
Друга відмінність полягає в способі повернення результатів роботи підпрограми в основну програму. Пересилання результатів у функції здійснюється по її назві (<назва функції>: = <ім'я змінної, що містить результат> або <вираз для обчислення>). Тоді як у процедурі використовується службове слова Var перед параметрами-змінними.
По-третє, функція може входити до складу виразів. Подібне ж використання процедури буде помилковим. Наприклад, вираз НСД(a1, b1, rez1) + НСД(a2, b2, rez2) не має змісту, де НСД - розглянута нами раніше (Урок_15) процедура. Використання ж функції у складі виразу розглянемо на цьому уроці трохи пізніше.
Задача
Змій Горинич вирішив створити свій стільниковий оператор Snake. Три голови ніяк не могли домовитись, скільки цифр повинно бути в номері телефону, проте відразу погодились, що всі цифри мають бути різні. Підкажіть Гориничу, скількох абонентів він зможе підключити, якщо номер буде к-значний, а цифри обиратимуться з n варіантів.
Розв'язання
Для обчислень на потрібно вміти обчислювати факторіал, причому оформити обчислення як допоміжний алгоритм. Нагадаємо, щоn!=1*2*3*...*n, причому 0!=1 і 1!=1.
Приклад. 4!=1*2*3*4. rez : =1, rez : = rez*2= 1*2= 2, rez : = rez*3= 2*3= 6, rez : = rez*4= 6*4= 24.
Приклад. 4!=1*2*3*4. rez : =1, rez : = rez*2= 1*2= 2, rez : = rez*3= 2*3= 6, rez : = rez*4= 6*4= 24.
Зрозуміло, що для обчислення n!, потрібно організувати цикл n раз, в якому попереднє значення множити на номер кроку обчислень (на 2-ому кроці множимо на 2, ...).
Для усвідомлення відмінностей між процедурою та функцією розглянемо алгоритми процедури та функції.
Для усвідомлення відмінностей між процедурою та функцією розглянемо алгоритми процедури та функції.
| Алгоритм процедури алг Факторіал (ціл p, ціл rez) арг p рез rez поч ціл i rez:= 1 для i від 1 до p пц rez:= rez*i кц кін | Алгоритм функції алг ціл Факторіал (ціл p) арг p поч ціл i rez : = 1 для i від 1 до p пц rez : = rez * i кц знач : = rez кін |
Зверніть увагу:
Алгоритм процедури
|
Алгоритм функції
| |
У заголовку описуються як аргументи, так і результати
|
У заголовку описуються лише аргументи
| |
Біля слова "алг" не вказується тип результату
|
Біля слова "алг" вказується тип результату
| |
Передбачається, що змінні, описані як результати, будуть параметрами-змінними (при перекладі на Pascal біля писатиметься Var)
|
Повернення результату забезпечується командою знач := результат (знач на Pascal перекладеться як назва функції)
|
Перекладемо на Pascal обидва алгоритми.
| procedure Faktorial (p : integer, Var rez : longint); {rez - довге ціле} Var i : integer; begin rez : = 1; for i : =1 to p do begin rez : = rez * i; end; end; | function Faktorial (p : integer) : longint; Var i : integer; rez : longint; begin rez : = 1; for i : =1 to p do begin rez : = rez * i; end; Faktorial : = rez; end; |
Фрагмент програми процедури
|
Фрагмент програми функції
| |
У заголовку описуються аргументи і результати (перед останніми пишеться Var), а також їх типи
|
У заголовку описуються лише аргументи та їх типи
| |
У заголовку немає вказівок на тип результату вказується тип результату
|
Після назви функції та переліку формальних параметрів після ":" вказується тип результату
| |
Передбачається, що змінні, описані як результати, будуть параметрами-змінними "повернуть" необхідні значення в основну програму
|
Повернення результату забезпечується командоюНазва_функціїї : = результат
|
Перед тим, як написати програми цілком, розглянемо алгоритми основних частин.
Алгоритм, що використовує підпрограму-функцію
алг Snake (ціл k, n, ціл kil)
арг k, n
рез kil
поч
kil : = Факторіал(n)/Факторіал(n - k)
кін
алг Snake (ціл k, n, ціл kil)
арг k, n
рез kil
поч
kil : = Факторіал(n)/Факторіал(n - k)
кін
Зверніть увагу на те, що: 1) функцію ми викликаємо прямо з описаного виразу;
2) для виклику функції певній змінній присвоюють значення або самої функції, або виразу, що містить виклик функції або кількох функцій (як у нашому прикладі).
Алгоритм, що використовує підпрограму-процедуру2) для виклику функції певній змінній присвоюють значення або самої функції, або виразу, що містить виклик функції або кількох функцій (як у нашому прикладі).
алг Snake (ціл k, n, ціл kil)
арг k, n
рез kil
поч
ціл kil1, kil2
Факторіал (n, kil1)
Факторіал (n - k, kil2)
кil : = kil1/kil2
кін
Зверніть увагу на те, що вписати процедуру до складу виразу ми не можемо. Ми спочатку викликаємо процедуру для фактичного параметра n (результат вписується в змінну kil1), потім для n - k (результат повертається в kil2). І лише потім описуємо формулу для необхідних обчислень.
Розглянемо повністю 2 програми, одна з яких містить процедуру, а друга - функцію.Program Snake;
Uses Crt;
Var
k, n : integer;
kil, kil1, kil2 : longint;
procedure Faktorial (p : integer, Var rez : longint);
Var
i : integer;
begin
rez : = 1;
for i : =1 to p do
begin
rez : = rez * i;
end;
end;
BEGIN
Write(‘k, n =>');
Readln(k, n);
Faktorial(n, kil1);
Faktorial (n - k, kil2);
kil : = trunc(kil1/kil2);
Write(‘kil=', kil);
Readkey;
END.
Примітка. Кількість шуканих номерів буде цілим числом. Але результат ділення в Pascal - це завжди число дійсне (навіть 4 - це 4.0). Тому ми використовуємо функцію trunс для відкидання дробової частини (яка у нас .0000) і отримання цілого результату.
Program Snake;Uses Crt;
Var
k, n : integer;
kil : longint;
function Faktorial (p:integer):longint;
Var
i : integer;
rez : longint;
begin
rez : = 1;
for i : =1 to p do
begin
rez : = rez * i;
end;
Faktorial : = rez;
end;
BEGIN
ClrScr;
Write(‘k, n =>');
Readln(k, n);
kil : = trunc(Faktorial(n)/Faktorial (n - k));
Write(‘kil= ', kil);
Readkey;
END.
Задача
Дано 2 натуральні числа a i n. Обчислення піднесення до степеня an оформити як функцію.
Розв'язання
Зрозуміло, що для піднесення a до степеня n, потрібно n раз помножити число a.
Допоміжний алгоритм (функція)
алг ціл Степінь (ціл osn, st, ціл rez)
арг osn, st
рез rez
поч
ціл і
і : = 1
rez : = 1
для і від 1 до st
пц
rez : = rez * osn
кц
знач : = rez
кін
Допоміжний алгоритм (функція)
алг ціл Степінь (ціл osn, st, ціл rez)
арг osn, st
рез rez
поч
ціл і
і : = 1
rez : = 1
для і від 1 до st
пц
rez : = rez * osn
кц
знач : = rez
кін
Примітка. Змінні a i n, задані в умові, є глобальними фактичними параметрами, а в функції формальні параметри ми називаємо по-іншому.
Алгоритм основної програми
алг Обчислення_степеня (ціл a, n, ціл r)
арг a, n
рез r
поч
r : = Степінь (a, n)
кін
1. Сконструюйте із запропонованих фрагментів функцію Степінь, вказавши порядок кроків за зразком:123456789.
1) Stepin : = rez;
end;
2) rez : longint;
3) for i : =1 to st do
4) begin
rez : = 1;
5) function Stepin (osn, st : integer) : longint;
6) begin
7) Var
i : integer;
8) rez : = rez * a;
9) end;
1) Stepin : = rez;
end;
2) rez : longint;
3) for i : =1 to st do
4) begin
rez : = 1;
5) function Stepin (osn, st : integer) : longint;
6) begin
7) Var
i : integer;
8) rez : = rez * a;
9) end;
Програма піднесення до степеня з використанням функції
Program Obch_Stepin;
Uses Crt;
Var
a, n : integer;
r : longint;
function Stepin (osn, st : integer) : longint;
Var
i : integer;
rez : longint;
begin
rez : = 1;
for i : =1 to st do
begin
rez : = rez * a;
end;
Stepin : = rez;
end;
BEGIN
ClrScr;
Write(‘a, n =>');
Readln(a, n);
r : = Stepin(a, n);
Write(‘r= ', r);
Readkey;
END.
Uses Crt;
Var
a, n : integer;
r : longint;
function Stepin (osn, st : integer) : longint;
Var
i : integer;
rez : longint;
begin
rez : = 1;
for i : =1 to st do
begin
rez : = rez * a;
end;
Stepin : = rez;
end;
BEGIN
ClrScr;
Write(‘a, n =>');
Readln(a, n);
r : = Stepin(a, n);
Write(‘r= ', r);
Readkey;
END.
2. У фрагменті програми
Var
x, y, z : integer;
a : real;
function f1(m, n : integer) : real;
Var
p, r : integer;
s : real;
begin
. . .
end; змінні m, n є для функції:
Var
x, y, z : integer;
a : real;
function f1(m, n : integer) : real;
Var
p, r : integer;
s : real;
begin
. . .
end; змінні m, n є для функції:
3. Які з вказаних команд забезпечують коректне звернення до функції
function Syma (a, b : integer) : integer?
1) m : = Syma(4, 12) + 2*Syma(45, -23);
2) f : = Syma(23, 6.78);
3) c : = 45; rez : = Syma (2, 3*c);
4) Syma (3, 67).
Введіть відповідь за зразком: 3, або 12, або 234 (цифри у порядку зростання).
function Syma (a, b : integer) : integer?
1) m : = Syma(4, 12) + 2*Syma(45, -23);
2) f : = Syma(23, 6.78);
3) c : = 45; rez : = Syma (2, 3*c);
4) Syma (3, 67).
Введіть відповідь за зразком: 3, або 12, або 234 (цифри у порядку зростання).
4. Оберіть ті характеристики, які стосуються функції:
5. Дано фрагмент програми:
function Dobytok (a, b : integer) : integer;
Var
d : intger;
begin
d : = a * b;
end;
. . .
rez : = Dobytok(7, 9);
. . .Якого значення набуде змінна rez?
function Dobytok (a, b : integer) : integer;
Var
d : intger;
begin
d : = a * b;
end;
. . .
rez : = Dobytok(7, 9);
. . .Якого значення набуде змінна rez?
6. Дано фрагмент програми:
Var
x, y, z : real;
function F1 (a, b : integer) : real;
begin
F1 : = a / b;
end;
. . .
k : = 9.1;
rez : = F1(k, 7);
. . .
При компілюванні буде виникати помилка через:
Var
x, y, z : real;
function F1 (a, b : integer) : real;
begin
F1 : = a / b;
end;
. . .
k : = 9.1;
rez : = F1(k, 7);
. . .
При компілюванні буде виникати помилка через:
7. Дано заголовки алгоритмів. Які з них при перекладі на Pascal оформлятимуться як функції?
Немає коментарів:
Дописати коментар