Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Візуал Бейсік 2010 Глінський.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.12 Mб
Скачать

§ 17. Підпрограми. Функції користувача

У цьому параграфі ознайомимося з поняттям підпрограми і різ­новидом підпрограм — функцією користувача. Використання функцій — це ще один крок до створення масових алгоритмів і програм. Розглянемо загальні правила описування функцій ко­ристувача і способи використання функцій.

1. «Кожній підзадачі свою підпрограму». Принцип декомпозиції алгоритму реалізовують за допомогою підпрограм. Підпрограма — де код, що має власну назву, записується окремо від основного коду, його можна використати один чи багато разів з метою розв’язання деякої підзадачі. Сукупність підпрограм утворює програму розв’язування задачі. Підпрограми поділяють на два види: функції користувача і процедури.

2. Функції користувача. Усі функції поділяють на стандартні та не­стандартні. Стандартні математичні функції були описані у § 10. Роз­гляньте стандартні функції sin(x), cos(x), sin(2), cos(x+3.14), log(abs(x)) тощо. Такі вирази називають вказівниками функцій. Вказівник функ­ції не є командою. Його можна використати лише у виразі. Обчис­лювати стандартні функції комп’ютер вміє автоматично (вони вхо­дять у бібліотеки середовища).

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

Власну функцію користувач має описати окремо від головного коду. У VBA код функції записують у розділі General коду проекту. У VB код функції записують у розділі опису класу форми. Для опи­ту функції використовують таку конструкцію:

Function <назва>(<список формальних параметрів>)

<назва> = <вираз> ’VB і VBA

End Function

Тут Function і End Function — це службові слова. Перший рядок називають заголовком. Назву для функції придумує користувач, во­на не може збігатися з назвою деякої змінної у коді.

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

До функції звертаються (функцію викликають) з головного коду за допомогою вказівника функції. Він має такий загальний вигляд:

<назва функції>(<список фактичних параметрів функції>)

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

Взаємодія вказівника і опису функції. У момент виклику функ­ції значення фактичних параметрів підставляються в описі функції на місце відповідних формальних параметрів. Після цього викону­ються обчислення всередині функції і результат повертається вка­зівнику в точку виклику.

Задача 1. Для додавання трьох чисел побудувати функцію і за­стосувати її під час обчислення деякого виразу.

Розв’язування. Розгляньте опис шуканої функції з назвою dodaty і трьома формальними параметрами а, Ь, с:

Function dodaty(a, b, с)

dodaty = a + b + с

End Function

Функція сама не виконується. Її треба викликати з іншого коду, який називають головним щодо функції, за допомогою вказівника, наприклад, dodaty(1, 2, 3), де 1, 2, 3 — фактичні параметри. Значен­ням такого вказівника буде число 6.

Розглянемо, як застосовують функції. З’ясуємо, яке значення отримає змінна z після обчислення виразу в такому головному коді:

Dim х, z

х = 2 'Спочатку виконається ця команда,

z = 7 + dodaty(x, 5, 2 * 3) 'а потім ця викличе функцію dodaty

<вивести z>

Тут у списку фактичних параметрів у dodaty(x, 5, 2 * 3) є змінна х, число 5 і вираз 2*3. Виконаємо головний код і отримаємо резу­льтат: z = 20. Пояснимо це за допомогою рис. 1.20.

Рис. 1.20. Взаємодія головної програми з функцією користувача

На рис. 1.20 зображено взаємодію вказівника dodaty(x, 5, 2 * 3) з функцією dodaty(a, b, с). Обчислення і пересилання значень відбува­ються у такому порядку: починаються від команди х=2, далі — за стрілками і закінчуються командою <вивести z>.

Опишемо цей процес. Якщо в арифметичному виразі (тут в команді z=...) є вказівник функції, то система виконує такий алгоритм:

  1. обчислює значення фактичних параметрів (тут вони будуть 2, 5 і 6 відповідно);

  2. звертається до опису заданої функції: Function dodaty(a, b, с);

  3. передає параметрам функції значення відповідних фактичних параметрів (тут а отримає 2, b отримає 5, с отримає 6);

  4. виконує команди, описані у функції, зокрема, обчислює резуль­тат, який надає назві функції (тут dodaty отримає значення 13);

  5. передає результат (13) у точку виклику у вираз, кажуть «при­своює результат вказівнику» (у виразі для z вказівник dodaty(x, 5, 2 * 3) отримає значення 13);

  6. продовжує обчислення конкретного арифметичного виразу (тут змінна z отримає значення 7+13, тобто 20, що й треба було з’ясувати).

Зауваження 1. Назви відповідних формальних і фактичних па­раметрів можуть бути різними. Важливим є їх порядок.

Зауваження 2. Кількість і типи параметрів у відповідних спис­ках мають бути однакові.

Зауваження 3. У VB замість команди <назва> = <вираз> у тілі фу­нкції можна писати команду Return <вираз> .

Задача 2. Прямокутний трикутник заданий двома катетами в метрах. Обчислити довжину гіпотенузи в сантиметрах, застосував­ши функцію користувача.

Розв’язування. Надамо функції назву gipotenuza. Проаналізуємо, скільки ця функція матиме параметрів. З умови задачі випливає, що два — значення довжин двох катетів. Отже, опис функції ма­тиме такий вигляд:

Function gipotenuza (а, b)

gipotenuza = Sqr(a ^ 2 + b ^ 2) 'VBA

gipotenuza = Math.Sqrt(a ^ 2 + b ^ 2) 'VB

End Function

Тепер складемо головний код, який виконуватиметься першим.

Dim a As Single, b As Single, с As Single

a=InputВох("Введіть довжину першого катета")

b=InputВох("Введіть довжину другого катета")

с = 100 * gipotenuza(a, b)

<вивести c>

Цей код є головним щодо функції gipotenuza. Проаналізуємо, як головний код взаємодіє з функцією. Під час виконання коду змін­ним а і b надамо деякі значення, нехай 3 і 4. Почне обчислюватися вираз для змінної с і відразу відбудеться виклик функції. Число 3 буде передане першому формальному параметру, а число 4 — друго­му. Змінна gipotenuza, яка є назвою функції, отримає значення 5. Це значення повернеться в точку виклику у вираз і змінна с отримає значення 100 * 5, тобто 500.

Завдання 1. Розв’яжіть задачу 2 у консольному режимі.

Завдання 2. Реалізуйте проект розв’язування задачі 2.

Завдання 3. Обчисліть площу прямокутного трикутника, за­стосувавши функцію.

Завдання 4. Обчисліть площу довільного трикутника за відо­мими сторонами, використавши функцію для формули Герона.

Задача 3. Обчислити значення функції у = х3 - х2 + 3 у точці х = 3. Обчислити значення функції у = х4 - 2х2 +5 у точці х — 4.

Розв’язання. Першу функцію назвемо у:

Function у(х)

у=х^3-х^2+3

End Function

Другу функцію назвемо у1:

Function у1(х)

у1 = х^4-2*х^2 + 5

End Function

Тоді головний код матиме такий вигляд:

Dim xAs Single, x1 As Single

x= InputBox(“Введіть x")

<вивести y(x)>

x1 = InputBox(“Введіть x1")

<вивести y1(x1)>

Виконавши цей код для х = 3 і х1 = 4, отримаємо такі два ре­зультати: 21 і 227.

Завдання 1. Складіть і виконайте код для обчислення значен­ня функції z = х3 + х2 - 4х + 3 для х = 2 і х = 4.

Завдання 2. Складіть і виконайте код для обчислення значення функції f = f(a,b) = a5 + 3а3 - 5а + 3 + b2 + 26, якщо а = 2 і b = 5.

3. Службові описові слова ByVal і ByRef, або як надійно підпро­грамі передати дані та повертати результати в головний код. У за­гальному випадку в описі підпрограми формальні параметри, які призначені для отримання даних з головного коду, записують зі словом ByVal перед параметром. Таке передавання параметрів нази­вають передаванням за значеннями. Воно працює односторонньо: передає дані з головного коду в підпрограму.

Формальні параметри, які призначені для повернення результа­тів, записують зі словом ByRef перед ними (це називають передаван­ням за адресою, за посиланням). Таке передавання є двостороннім: гані можна пересилати з головного коду в підпрограму і назад.

Що станеться, якщо слова ByVal і ByRef не записати? У VBA мо­жна обійтися і без цих службових слів. Тоді користувач має сам гтежити за тим, які параметри є аргументами, а які — результата­ми. За замовчуванням діє режим передачі ByRef.

У VB за замовчуванням діє режим передачі ByVal. Система авто­матично допише слово ByVal до всіх параметрів, якщо користувач не зазначить його. Це може призвести до суттєвої логічної помилки. Тому користувач має власноручно виправити слово ByVal на ByRef перед параметрами-результатами.

Правило. Формальному параметру-результату у списку фактич­них параметрів може відповідати тільки змінна.

Задача 4. Побудувати функцію, яка отримує три числа і повер­тає найбільше з них.

Розв’язування. Назвемо шукану функцію шахЗ і для описування нормальних параметрів застосуємо службове слово ByVal:

Function max3(ByVal a, ByVal b, ByVal с)

If a > b Then max3 = a Else max3 = b

If с > max3 Then max3 = с

End Function

Застосуємо функцію max3 і переконаємося, що вказівник функ­ції max3 (5, 8, 1) отримає значення 8.

Завдання 1. Модифікуйте код, щоб визначити мінімальне із трьох чисел.

4. Оголошення типу формальних параметрів і типу функції. У загальному випадку формальні параметри прийнято перелічувати із зазначенням їхніх типів. Зазначають також і тип вказівника функ­ції. Наприклад, для задачі 3 замість заголовка Function y(ByVal х) треба писати так: Function y(ByVal х As Single) As Single.

Задача 5. Побудувати функцію, яка отримує номер місяця невисокосного року і повертає кількість днів у ньому.

Розв’язування. Шукану функцію назвемо dniv:

Function dniv(ByVal nomer As Integer) As Integer

Select Case nomer

Case 1, 3,5, 7, 8, 10, 12

dniv = 31

Case 2

dniv = 28

Case 4, 6, 9, 11

dniv = 30

End Select

End Function

Чи можна не описувати конкретні числові типи параметрів : вказівника функції? Так, можна, але це робити не рекомендується. Зазвичай це до помилок не призводить. Код буде компактнішим. але користувач нестиме відповідальність за можливу невідповід­ність типів між фактичними і відповідними формальними парамет­рами, що може призвести до помилок у великих кодах.

Завдання 1. Виконайте такий головний код, що звертається де функції dniv:

Dim n As Integer

n = InputBox(“Введіть номер місяця")

<вивести dniv(n)>

і переконайтеся, що для березня (n = 3) відповідь буде 31.

Завдання 2. Модифікуйте функцію dniv так, щоб вона отриму­вала номер місяця і номер року з діапазону років від 2005 до 2020 : повертала кількість днів у заданому місяці і році. У цьому діапазо­ні високосні такі роки: 2008, 2012, 2016, 2020.

Завдання 3*. Модифікуйте функцію так, щоб вона повертала кількість днів у заданому місяці будь-якого року нашої ери.

Ключ-підказка. Правило високосного року: рік є високосним, якщо його числове значення ділиться на 4 без остачі. Винятки ста­новлять роки 1900, 1800, 1700, 1500 ... (числові значення яких ді­ляться на 100, але не діляться на 400). Отже, числове значення ви­сокосного року має ділитися без остачі на 4 і не ділитися на 100 або ділитися на 400. Це і є критерій високосного року.

Зауваження 4. У VBA є зручний конструктор підпрограм, який ви­кликають з головного меню середовища командами Insert => Procedure. Він дає змогу створювати функції і процедури.

Зауваження 5*. Функція може повертати значення не лише че­рез назву-вказівник, але й через параметр-результат. Тоді заголовок вигляду Function у(х, х1, у1), де х та х1 — аргументи, а у1 — деякий додатковий результат, треба писати так: Function y(ByVal х, ByVal х1, ByRef у1). Традиційно, якщо підпрограма повертає більше одного результату, то прийнято застосовувати процедури, а не функції.

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

Вправи

  1. Задано функцію

Function Mynumber(a, b)

Mynumber = a + 2 * b

End Function

Обчислити усно: a) Mynumber(3, 4); б) 5 * Mynumber(2, 3);

в) Mynumber(4, 2) + Mynumber(5, -2); г) Mynumber(3, 3)^2.

  1. Задано функцію:

Function Start(a, b, c)

if a > b Then Start = a Else Start = с

End Function

Обчислити: a) Start(1, 2, 3); б) Start(2, 1, 3); в) Start(1 + 3. 2 + 3, 3 + 3);

г) Start(1, 2, Start(3, 2, 5)).

  1. Розгляньте функцію y(x):

Function y(x)

у=х^2-5*х+6

End Function

Яке значення: a) y(2); б) y(5); в) y(4) — y(1)?

  1. Запишіть функцію для:

а) додавання чотирьох заданих чисел;

б) обчислення середнього арифметичного трьох заданих чисел;

в) обчислення площі круга за відомим радіусом;

г) обчислення об’єму кулі за відомим радіусом;

д) визначення мінімального з двох заданих чисел;

е) переведення гривень у долари за курсом Нацбанку.

є) переведення морських миль у кілометри, якщо 1 миля = 1,609344 км. Запишіть вираз, щоб визначити, скільки кілометрів мають три милі?

  1. Використавши функцію dniv із задачі 5, запишіть вираз, щоб визна­чити кількість днів у березні, квітні та травні (весною) разом.

  2. З’ясуйте, які фрагменти повторюються в наступному виразі, і ство­ріть та застосуйте для їх обчислення функцію користувача з назвою myfun:

а) ;

б)

  1. Оформіть розв’язок задачі 1 з розділу «Задачі» з використанням функції чи декількох функцій.

  2. Оформіть розв’язок задачі 2 з розділу «Задачі» з використанням функції чи декількох функцій.

  3. Оформіть розв’язок задачі 4 з розділу «Задачі» з використанням де­кількох функцій.

10*. Запишіть функцію для обчислення мінімального значення трьох заданих чисел.

11*. Розгляньте функцію

Function y(ByVal х, ByRef у1)

у = х ^ 3-х +3

у1 = х^4-2*х^2 + 3

End Function

Яке значення: а) вказівника у(2, у1) і змінної у1; б) вказівника у(5, у1) і змінної у1; в) виразу у(4, у 1) — у1 ?

12*. Модифікуйте функцію max3 у задачі 4 (с. 113), щоб вивести додат­ково результат-повідомлення (дане типу String) про те, яке число най­більше: перше, друге чи третє.