План лекції:
6.1. Створення процедур (підпрограм) загального призначення
6.2. Процедури типу Function
6.3. Процедури типу Sub
6.1. СТВОРЕННЯ ПРОЦЕДУР (ПІДПРОГРАМ)
ЗАГАЛЬНОГО ПРИЗНАЧЕННЯ
В стандартних модулях існують процедури загального призначення, які можуть бути викликані з будь-якого місця в програмі. Процедури загального призначення близькі до внутрішніх операторів та функцій. В Visual Basic вони викликаються за іменем, можуть мати аргументи і кожна з них виконує конкретні дії. Процедури загального призначення дозволяють економити час, роблять програми більш компактними, зручними в перегляді (прочитанні), спрощують роботу програм.
В стандартному модулі можна створити три види процедур загального призначення:
1. Процедури типу Function (функція). Такі процедури викликаються з інших процедур. Вони можуть мати аргументи, через які одержують вхідні значення також повертати значення у вигляді імені. Зазвичай використовуються для обчислень.
2. Процедури типу Sub (підпрограми). Вони також викликаються за ім'ям з інших процедур, можуть мати аргументи, одержувати вхідні значення, виконувати відповідні дії і повертати значення. На відміну від функцій процедури Sub використовуються для одержання або обробки вхідних даних і відображення вихідних даних або встановлення властивостей значень.
3. Процедури типу Property (Властивість). Такі процедури використовуються для створення властивостей, які визначаються користувачем у програмах, і маніпулювання ними. Це корисно, коли вимагається створити засіб, який дозволяє використовувати засоби управління Visual Basic.
Щоб набрати будь-яку процедуру загального призначення необхідно:
У меню Разработать вибрати команду Добавить модуль (Add Module).
Відкриється вікно Add Module. Вибрати Новый та натиснути кнопку Open (Открыть). У вікні Code з'явиться новий стандартний модуль.
Ввести в стандартному модулі текст процедури.
6.2. ПРОЦЕДУРИ ТИПУ FUNCTION
Синтаксис:
Function ім'я (х1 [As тип], х2 [As тип],... хn [As тип]) As Тип
блок операторів
ім'я = А
[оператори ]
[Exit Function ]
End Function
де ім’я – ідентифікатор функції;
x1, х2, х3..., хn - формальні параметри, які можуть бути:
1) змінними;
2) масивом;
Exit Function – достроковий вихід із процедури.
Звернення до функції здійснюється за ім’ям:
ім'я(а1,а2, ...,аn),
де а1, а2,..., аn – фактичні аргументи.
Фактичними аргументами можуть бути:
· змінні (прості та з індексами);
· масив;
· константа;
· арифметичний вираз.
Зауваження! Щоб передати у процедуру масив, достатньо після імені вказати порожні дужки Х().
Дія:
При зверненні до процедури:
1) формальні параметри визначаються фактичними аргументами;
2) виконується процедура, в якій ім’я приймає значення;
3) значення передається в головний модуль.
Приклад.Обчислити P=arctg a+4.7b, де а – сума компонентів вектора х; b – сума компонентів вектора y; x(1.5; -6.7; 8.35; -1.9; 0.7)
Компоненти вектора y обчислюються за формулою
Yi=xi /cos i
Нехай ім’я процедури Function SV.
1. Відкрити новий проект.
2. За допомогою елемента CommandButton створити командну кнопку в формі.
3. Змінити стандартний напис на командній кнопці (властивість Caption) на Пуск.
4. Обов’язково встановити для властивості форми Autoredraw значення Да (True).
5. Двічі клацнути по кнопці Пуск у формі. У вікні Форма1(Код) з’явиться заголовок процедури та його кінець:
Private Sub Команда1_Click()
End Sub
6.Після заголовку процедури набрати текст(тіло програми).
Option Base 1
Dim y!
Private Sub Команда1_Click()
Dim a!, b!, p!
N=InputBox(“n=”)
ReDim y(n)
X=Array(1.5, -6.7, 8.35, -1.9, 0.7)
Print “Вектор y”
For i=1 to n
Y(i)=x(i)/cos(i)
Print y(i);Spc(3);
Next і: Print
A=SV(5,x)
B=SV(n,y)
P=Atn(a)+4.7*b
Print Tab(5);”Результати обчислень”
Print Spc(5);”a=”; a; Spc(5);”b=” ; b; Spc(5); “p=”; p
End sub
7. У меню Разработать обрати команду Добавить модуль. З’явиться вікно Add Module. Вибрати Новый і натиснути кнопку Открыть.
8. З’явиться вікно Проект1-Модуль 1(Код).
Надрукуємо ім’я процедури Function SV(n,z) і натиснемо Enter. З’явиться End Function (кінець процедури).
9. Після заголовку процедури набрати текст(тіло процедури).
Function SV(n,z)
S=0
For i=1 to n
S=s+z(i)
Next i
SV=s
End Function
10. Запустити команду на виконання, натиснувши кнопку Начать на панелі інструментів Стандартная.
11. У вікні Форма1 клацнути по командній кнопці Пуск. Ввести розмір масиву n. (n<=5=розміру массиву х).
Результат виконання процедури буде показаний у вікні форми (рис. 6.1).
Рисунок 6.1. Вікно форми з результатом виконання прикладу.
12. Для закінчення розрахунків необхідно клацнути по кнопці Конец на панелі інструментів.
13. Зберегти проект, клацнувши Сохранить (Save Project).
6.3. ПРОЦЕДУРИ ТИПУ SUB
Синтаксис:
Sub ім'я (х1 [As тип], х2 [As тип],... хn [As тип])
блок операторів
[Exit Sub ]
End Sub
де ім’я – довільний ідентификатор процедури;
x1, х2, х3,..., хn – формальні параметри, які умовно поділяються на 2 групи:
· параметри, що визначаються фактичними аргументами (при звернені до процедури)
· параметри, що визначають фактичні аргументи (після виконання процедури)
і ті і інщі можуть бути:
1) змінною;
2) масивом;
3) константою;
4) арифметичним виразом.
Exit Sub – достроковий вихід з процедури.
Звернення до процедури – функції здійснюється за допомогою оператора Call
Синтаксис:
Call ім'я(а1,а2, ...,аn),
де а1, а2,...,аn – фактичні аргументи.
Зауваження! Щоб передати в процедуру масив, достатньо після імені його вказати пусті дужки Х().
Приклад. Задані матриці Anm та Bmn (n>m)/
Нехай елементи матриць знаходяться на проміжку [f1,f2], де f1=-20; f2=20. Обчислити матрицю С=A*B. Формування матриці та знаходження суми елементів матриці оформити у вигляді процедури (підпрограми).
1. Відкрити новий проект.
2. Створити командну кнопку в формі.
3. Дати нову назву цій кнопці Пуск.
4. Обов’язково встановити для властивості форми Autoredraw значення Да(True).
5. Двічі клацнути по кнопці Пуск у формі. У вікні Форма1(Код) (Code) з’явиться заголовок процедури та його кінець:
Private Sub Комманда1_Click()
End Sub
Після заголовку процедури набрати текст (тіло програми)
Option Base 1
Dim a!(), b!(), с!(), S!
Private Sub Комманда1_Click()
Dim n%, m%, i%, j%, k%, f1!, f2!, p!
m = InputBox("m=")
n = InputBox("n=")
l = InputBox("L=")
f1 = Val(InputBox("f1="))
f2 = Val(InputBox("f2="))
ReDim a(m, n), b(n, l), C(m, l)
Print Tab(10); "Матриця А"
Call Form(m, n, f1, f2, a!())
Print Tab(10); "Матриця В"
Call Form(n, l, f1, f2, b!())
Print Tab(10); "Матриця С=A*B"
For i = 1 To m
For j = 1 To l
Call Sum(i, j, n, S)
C(i, j) = S
Next j
Next i
For i=1 To m
t = 2
For j = 1 To l
Форма1.Print Tab(t); C(i, j);: t = t + 7
Next j
Форма1.Print
Next i
End Sub
У меню Разработать вибрати команду Добавить модуль.
У вікні Add Module обрати Новый і натиснути кнопку Открыть.
З’явиться вікно Проект1 – Модуль1 (Код). Надрукуємо ім’я процедури Sub Form(k,f1,f2,z!()) і натиснемо Enter. З’явиться End Sub (кінець процедури).
Після заголовку процедури набрати текст(тіло процедури).
Private Sub Form(k, l, f1, f2, z!())
For u = 1 To k
t = 2
For q = 1 To l
z(u, q) = Int((f2 - f1 + 1) * Rnd) + f1
Форма1.Print Tab(t); z(u, q);: t = t + 7
Next q
В цій процедурі елемент матриці створюється за допомогою генератора випадкових чисел. Для введення реальної конкретної матриці досить замінити оператор
z(i,j)=int((f2-f1+1)*Rnd)+f1 на
z(i,j)=Val(InputBox(“Введіть елемент матриці”).
В меню Разработать вибрати команду Добавить модуль.
В вікні Add Module вибрати Новый і натиснути кнопку Открыть.
З’явиться вікно Проект1 – Модуль2 (Код). Надрукуємо ім’я процедури Sub Sum (k,z!(),s!) і натиснемо Enter. З’явиться End Sub (кінець процедури).
Після заголовку процедури набрати текст(тіло процедури).
Sub Sum(i, j, n, S)
S = 0
For k = 1 To n
S = S + a(i, k) * b(k, j)
Next k
End Sub
12. Запустити команду на виконання, натиснувши кнопку Начать на панелі інструментів Стандартная.
13.У вікні Форма1 клацнути по командній кнопці Пуск. Ввести початкові дані m,n,L,f1,f2.
Результат виконання процедури буде показаний у вікні форми (рис.6.2).
Рисунок 6.2. Результат знаходження добутку матриць
15. Для закінчення розрахунків необхідно клацнути по кнопці Конец на панелі інструментів.
16. Зберегти проект, клацнувши Сохранить (Save Project).
Приклад. Створити додаток для обчислення ймовірності події за алгоритмом, блок-схема якого відображена на рис. 1.10.
1. Відкриваємо новий проект.
2. На формі встановимо 5 елементів TextBox.
3. Відкриваючи вікна їх властивостей, видалимо з вікон текст по замовчуванню (Текст1, Текст2,…). Поруч з текстовими вікнами розмістимо елементи Label з написами про призначення тестових вікон. Подвійним щигликом на вікні елемента Текст4 відкриємо вікно коду з рядками.
Private Sub Текст4_Exchange()
End Sub
4. Замінимо подію Exchange на LostFocus і введемо наступний код головної процедури
Private Sub Текст4_LostFocus()
Dim u!, v!, R1!, R2!, R3!, p!, no%, n%, m%, k%, D!
no = Текст1.Text
n = Текст2.Text
m = Текст3.Text
k = Текст4.Text
Call R(n, k, R1)
Call R(no - n, m - k, R2)
Call R(no, m, R3)
D = R1 * R2 / R3
Текст5.Text = D
End Sub
5. Потім введемо код підпрограми R(u,v,R):
Private Sub R(u, v, R)
Dim C1!, C2!, C3!
Call Fakt(u, C1)
Call Fakt(v, C2)
Call Fakt(u - v, C3)
R = C1 / C2 / C3
End Sub
6. Після цього або перед цим (порядок розміщення процедур не має значення) вводимо код підпрограми Fakt(z,p).
Private Sub Fakt(z, p)
p = 1
For i = 1 To z
p = p * i
Next i
End Sub
7. Клацнемо кнопку Начать на панелі інструментів.
8. Введемо в текстові поля початкові дані. Четверте вікно заповнюємо останнім і клацаємо на п’ятому. При цьому четверте вікно втрачає фокус і починає виконуватись головна процедура, яка відповідає такій події. В п’ятому вікні з’явиться результат (рис.6.3)
У Basic N і n не відрізняються, тому замість імені змінної N використовуємо ім’я no.
Коли головна процедура звертається до підпрограми R(u,v,R), наприклад, за командою Call R(k,n,R1), то формальні параметри заміщуються фактичними, так ніби u=k, v=n, а результат R1=R. За наступною командою Call(no-n, m-k, R2) u=no-n, v=m-k, а результатом стане R2 і т.д. В свою чергу процедура R при кожному звертанні до неї сама тричі звертається до підпрограми Fakt(z,p), Це здійснюється послідовністю операторів
Call Fakt(u, C1)
Call Fakt(v, C2)
Call Fakt(u - v, C3)
В наслідок виконання яких, отримуємо C1=u!, C2=v!, C3=(u-v)!
Рисунок 6.3. Результат обчислення ймовірності.
Приклад. Обчислити наближене значення функції Лапласа для 0< x <5 за формулою з точністю до 0.00001.
Скористаємось алгоритмом розглянутим в розділі 1 (рис.1.10). На формі розмістимо лише один елемент управління – командну кнопку, якій дамо ім’я Обчислити. Значення x будемо вводити за допомогою функції InputBox, а результат виводити безпосередньо на форму за допомогою оператора Print.
Private Sub Обчислити_Click()
Dim Fi As Single, x As Single, eps As Single, i As Integer
s = 0
i = 0: eps = 0.00001
x = Val(InputBox("x=", " Ввести значення x"))
Do
a = (-1) ^ i * x ^ (2 * i + 1) / (2 * 3.14159) ^ 0.5 / ((2 * i + 1) * 2 ^ i * Fact(i))
i = i + 1
s = s + a
Loop Until (Abs(a) < eps)
Print x, Format(s, "#.#####")
End Sub
Function Fact(i)
P = 1
For t = 1 To i
P = P * t
Next t
Fact = P
End Function
Рисунок 6.4. Результат обчислення функції Лапласа
Приклад. Створити за допомогою генератора випадкових чисел Матрицю А. Показати її у вікні Текст1. Впорядкувати її за зростанням. Знайти суму позитивних елементів матриці.
1. Відкрити новий проект. На формі встановити командну кнопку Пуск і два елементи TextBox з розмірами достатніми для відображення матриць. Суму позитивних елементів передбачається вивести у вікні MsgBox.
2. У вікнах властивостей текстових вікон очистити властивості Текст, а властивостям Multiline надати значення Да.
В вікні коду, що виникне після подвійного щиглика на кнопці Пуск записати наступну програму.
Option Base 1
Private Sub Пуск_Click()
Dim A(), B(), S!, m%, n%, i%, j%, t!
m = Val(InputBox("m=", Число рядків m", "Ввести"))
n = Val(InputBox("n=", "Число стовпців n", "Ввести"))
ReDim A(m, n), B(m, n)
Текст1.Text = ""
For i = 1 To m
For j = 1 To n
A(i, j) = 20 * Rnd - 10
Текст1.Text = Текст1.Text & " " & CSng(A(i, j))
Next j: Текст1.Text = Текст1.Text & Chr(13) & Chr(10)
Next i
Текст1.Text = Текст1.Text & " До впорядкування"
For i = 1 To m
For j = 1 To n
For u = 1 To m
For v = 1 To n
If A(i, j) < A(u, v) Then
t = A(i, j): A(i, j) = A(u, v): A(u, v) = t
End If
Next v
Next u
Next j
Next i
Текст2.Text = ""
For i = 1 To m
For j = 1 To n
Текст2.Text = Текст2.Text & " " & CSng(A(i, j))
Next j: Текст2.Text = Текст2.Text & Chr(13) & Chr(10)
Next i
S = 0
For i = 1 To m
For j = 1 To n
If A(i, j) > 0 Then S = S + A(i, j)
Next j, i
Текст2.Text = Текст2.Text & " Після впорядкування"
MsgBox "Сума позитивних елементів S=" & S
End Sub
Рисунок 6.5. Впорядкування елементів матриці.
Рисунок 6.6. Результат обчислення суми елементів
КОНТРОЛЬНІ ЗАПИТАННЯ
1. Розкрийте поняття модульна структура програми.
2. Які типи процедур ви знаєте?
3. Які дії потрібно виконати щоб додати до проекту процедуру визначеного типу?
4. В яких випадках виникає необхідність використання процедури Function…End Function? Наведіть приклади.
5. Звернення до підпрограми Function…End Function. Які аргументи використовуються при звернені до цієї підпрограми?
6. В яких випадках виникає необхідність використання процедури Sub…End Sub? Наведіть приклади.
7. Які параметри використовуються у процедурі Sub…End Sub?
8. Що необхідно зробити, щоб передати до процедури масив?
9. Що таке фактичний аргумент?
10. Що таке лінійна форма функції користувача? Який вона має формат?