- •§ 1. Поняття про інформаційне моделювання
- •Опорний конспект
- •§ 2. Етапи розв’язання задач на комп’ютері
- •§ 3. Середовища розробки проектів
- •§ 4. Властивості елементів керування
- •§ 1. Поняття про інформаційне моделювання 2
- •Контрольна робота № 1
- •§ 5. Створення проектів
- •§ 6. Основні поняття мови програмування
- •9. Процедура кнопки «Обчислити» для задачі про калькулятор.
- •§ 7. Алгоритм та його властивості
- •Запитання
- •§ 8. Різновиди алгоритмів
- •Запитання
- •§ 9. Типи даних
- •§ 10. Лінійні програми
- •Запитання та вправи
- •Контрольна робота № 2
- •§11. Введення даних і виведення результатів
- •§ 12. Текстові файли даних
- •§ 13. Програми з розгалуженням
- •§ 1. Поняття про інформаційне моделювання 2
- •Запитання
- •§ 14. Елементи керування прапорці і перемикачі
- •§ 15. Алгоритмічна конструкція вибір
- •Контрольна робота № 3
- •§ 16*. Списки
- •§ 17. Підпрограми. Функції користувача
- •§ 18. Підпрограми. Процедури користувача
- •§ 19. Цикли. Цикл з параметром
- •§ 20. Задачі пошуку даних. Цикл «доки»
- •§ 21. Застосування циклів
- •Контрольна робота № 4
- •Розділ 2. Складені структури даних
- •§ 22. Одновимірні масиви. Створення масивів
- •§ 23. Пошук даних в одновимірному масиві
- •1. Пошук даних у масиві за заданим критерієм.
- •5. Проект «На метеостанції». Застосування масивів і процедур користувача у vb.
- •§ 24. Впорядкування одновимірного масиву
- •§ 1. Поняття про інформаційне моделювання 2
- •4. Моделювання предметних областей за допомогою масивів.
- •§ 25. Двовимірні масиви. Створення масивів
- •§ 26*. Опрацювання двовимірних масивів
- •1. Елементи керування DataGridView (vb) та DataGrid (vba).
- •Контрольна робота № 5
- •§ 27. Опрацювання текстових даних
- •§ 28. Структури даних (записи)
- •§ 1. Поняття про інформаційне моделювання 2
- •§ 29. Файли даних прямого доступу
- •5. Vb. Команди для роботи з файлами даних прямого доступу.
- •§ 30. Застосування файлів даних послідовного доступу
- •§ 31. Графіка у vb
- •§ 32. Поняття про об’єктно-орієнтоване програмування
- •Розділ 3. Задачі
- •Складніші задачі*
- •Розділ 4. Vba у програмах пакету ms office
- •§ 33. Застосування vba у ms word
- •§ 34. Vba у програмі ms excell
- •§ 35. Задача про облік товарів на складі
- •§ 36. Розв’язування математичних задач
- •§ 37. Робота 3 базами даних
- •Список літератури
- •§ 1. Поняття про інформаційне моделювання 2
§ 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=...) є вказівник функції, то система виконує такий алгоритм:
обчислює значення фактичних параметрів (тут вони будуть 2, 5 і 6 відповідно);
звертається до опису заданої функції: Function dodaty(a, b, с);
передає параметрам функції значення відповідних фактичних параметрів (тут а отримає 2, b отримає 5, с отримає 6);
виконує команди, описані у функції, зокрема, обчислює результат, який надає назві функції (тут dodaty отримає значення 13);
передає результат (13) у точку виклику у вираз, кажуть «присвоює результат вказівнику» (у виразі для z вказівник dodaty(x, 5, 2 * 3) отримає значення 13);
продовжує обчислення конкретного арифметичного виразу (тут змінна 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). Традиційно, якщо підпрограма повертає більше одного результату, то прийнято застосовувати процедури, а не функції.
Висновок. У масових програмах не прийнято робити зміни в головних кодах, якщо вхідні дані змінюються. Вхідною інформацією може бути не лише число, але й деякий вираз. Щоб цей вираз відокремити від головного коду, використовують функцію. Функції користувача застосовують, коли деякий зазвичай громіздкий вираз потрібно обчислити декілька разів у декількох місцях коду. Тоді, щоб не записувати вираз декілька разів, складають одну функцію користувача і звертаються до неї за допомогою вказівника потрібну кількість разів.
Вправи
Задано функцію
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.
Задано функцію:
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)).
Розгляньте функцію y(x):
Function y(x)
у=х^2-5*х+6
End Function
Яке значення: a) y(2); б) y(5); в) y(4) — y(1)?
Запишіть функцію для:
а) додавання чотирьох заданих чисел;
б) обчислення середнього арифметичного трьох заданих чисел;
в) обчислення площі круга за відомим радіусом;
г) обчислення об’єму кулі за відомим радіусом;
д) визначення мінімального з двох заданих чисел;
е) переведення гривень у долари за курсом Нацбанку.
є) переведення морських миль у кілометри, якщо 1 миля = 1,609344 км. Запишіть вираз, щоб визначити, скільки кілометрів мають три милі?
Використавши функцію dniv із задачі 5, запишіть вираз, щоб визначити кількість днів у березні, квітні та травні (весною) разом.
З’ясуйте, які фрагменти повторюються в наступному виразі, і створіть та застосуйте для їх обчислення функцію користувача з назвою myfun:
а)
;
б)
Оформіть розв’язок задачі 1 з розділу «Задачі» з використанням функції чи декількох функцій.
Оформіть розв’язок задачі 2 з розділу «Задачі» з використанням функції чи декількох функцій.
Оформіть розв’язок задачі 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) про те, яке число найбільше: перше, друге чи третє.
