5. Функції та процедури
5.1. Вбудовані функції VBScript
Багатство мови значною мірою залежить від її бібліотеки функцій, які можуть бути інкапсульовані в об’єкти під назвою методів. З цієї точки зору можна вважати, що VBScript є досить бідним.
У наступній таблиці наведено функції VBScript, що не входять до об’єктів. Ми не будемо їх детально описувати. Зазвичай їхні назви вказують на їхнє призначення. Для отримання детальної інформації про конкретну функцію читач може звернутися до документації.
Abs | Array | Asc | Atn |
CBool | CByte | CCur | CDate |
CDbl | Chr | CInt | CLng |
Перетворення | Cos | CreateObject | CSng |
Дата | DateAdd | DateDiff | DatePart |
DateSerial | DateValue | День | Похідні математичні дисципліни |
Оцінка | Експ | Фільтр | FormatCurrency |
FormatDateTime | FormatNumber | FormatPercent | GetLocale |
GetObject | GetRef | Шістнадцятковий | Година |
InputBox | InStr | InStrRev | Інтервал, Фіксований |
IsArray | IsDate | IsEmpty | IsNull |
IsNumeric | IsObject | Приєднатися | LBound |
LCase | Ліворуч | Len | LoadPicture |
Log | LTrim; RTrim; та обрізки | Математика | Середня |
Хвилина | Місяць | MonthName | MsgBox |
Зараз | Жовтень | Замінити | RGB |
Праворуч | Rnd | Round | ScriptEngine |
ScriptEngineBuildVersion | ScriptEngineMajorVersion | ScriptEngineMinorVersion | Другий |
SetLocale | Підпис | Sin | Пробіл |
Спліт | Sqr | StrComp | String |
Тан | Час | Таймер | TimeSerial |
TimeValue | TypeName | UBound | UCase |
VarType | День тижня | WeekdayName | Рік |
5.2. Модульне програмування
Описати запрограмоване рішення задачі — це описати послідовність елементарних дій, які може виконати комп'ютер і які здатні вирішити задачу. Залежно від мови програмування ці елементарні операції є більш-менш складними. Наприклад, серед них є:
- зчитування даних з клавіатури або з диска
- запис даних на екран, на принтер, на диск тощо
- обчислення виразів
- переміщення по файлу
- ...
Опис складної задачі може вимагати кількох тисяч таких елементарних інструкцій і навіть більше. У такому разі людському розуму дуже важко охопити програму в цілому. З огляду на цю складність у сприйнятті проблеми в цілому, її розкладають на підпроблеми, які простіше вирішити. Розглянемо таку задачу: відсортувати список числових значень, введених з клавіатури, та вивести відсортований список на екран.
Спочатку можна описати рішення у такій формі:
début
lire les valeurs et les mettre dans un tableau T
trier le tableau T
écrire les valeurs triées du tableau T à l'écran
fin
Ми розклали задачу на 3 підзадачі, які простіше вирішити. Алгоритмічний запис часто є більш формалізованим, ніж попередній, і алгоритм буде виглядати приблизно так:
де T — масив. Операції
є неелементарними операціями, які, у свою чергу, мають бути описані за допомогою елементарних операцій. Це здійснюється в так званих модулях. Дані T називаються параметрами модуля. Це інформація, яку програма-викликач передає модулю, що викликається (вхідний параметр), або отримує від нього (вихідний параметр). Отже, параметри модуля — це інформація, яка обмінюється між програмою-викликом та модулем, що викликається.
модуль lire_tableau(T) | ![]() |
модуль trier_tableau(T) | ![]() |
модуль écrire_tableau(T) | ![]() |
Модуль lire_tableau(T) можна описати наступним чином:
début
écrire "Tapez la suite de valeurs à trier sous la forme val1 val2 ... : "
lire valeurs
construire tableau T à partir de la chaîne valeurs
fin
Тут ми достатньо докладно описали модуль lire_tableau. Дійсно, три необхідні дії мають безпосередній відповідник у VBScript. Остання дія вимагатиме використання функції split. Якби у VBScript не було цієї функції, дію 3 довелося б, у свою чергу, розкласти на елементарні дії, що мають безпосередній відповідник у VBScript.
Модуль écrire_tableau(T) можна описати так:
début
construire chaîne texte "valeur1,valeur2,...." à partir du tableau T
écrire texte
fin
Модуль écrire_tableau(T) можна описати наступним чином (припускаємо, що індекси елементів T починаються з 0):
début
N<-- indice dernier élément du tableau T
pour IFIN variant de N à 1
faire
//шукаємо індекс IMAX найбільшого елемента T
// IFIN — індекс останнього елемента T
chercher_max(T, IFIN, IMAX)
// обмінюємо найбільший елемент T з останнім елементом T
échanger (T, IMAX, IFIN)
finfaire
FIN
Тут алгоритм знову використовує не елементарні дії:
. chercher_max(T, IFIN, IMAX)
. échanger(T, IMAX, IFIN)
chercher_max(T, IFIN, IMAX) повертає індекс IMAX найбільшого елемента масиву T, індекс останнього елемента якого дорівнює IFIN.
![]() |
обміняти(T, IMAX, IFIN) обмінює 2 елементи масиву T — ті, що мають індекси IMAX та IFIN.
![]() |
Отже, необхідно описати нові неелементарні операції.
модуль chercher_max(A, IFIN, IMAX) | |
модуль обміну (T IMAX, IFIN) |
Початкова задача була повністю описана за допомогою елементарних операцій VBScript і тепер може бути переведена на цю мову. Слід зауважити, що елементарні дії можуть відрізнятися від однієї мови до іншої, а отже, аналіз задачі в певний момент повинен враховувати мову програмування, що використовується. Об’єкт, який існує в одній мові, може не існувати в іншій, що, відповідно, змінює використовуваний алгоритм. Так, якщо в мові є функція сортування, було б безглуздо не використовувати її в даному випадку.
Принцип, що застосовується тут, називається «низхідним аналізом». Якщо зобразити основу рішення, отримаємо таке:
![]() |
Ми маємо деревоподібну структуру.
5.3. Функції та процедури VBScript
Після проведення модульного аналізу програміст може перекласти модулі свого алгоритму на VBScript у вигляді fonctions або procédures. fonctions та procédures приймають вхідні/вихідні параметри, але fonction повертає результат, який дозволяє використовувати її у виразах, тоді як procédure такого результату не повертає.
5.3.1. Оголошення функцій та процедур VBScript
Оголошення процедури VBScript має такий вигляд
а оголошення функції — таким
Щоб повернути результат, функція повинна містити оператор присвоєння результату змінній, що має ім’я функції:
ім'я_функції = результат
Виконання функції або процедури припиняється двома способами:
- при зустрічі з оператором закінчення функції (end function) або закінчення процедури (end sub)
- при зустрічі з оператором виходу з функції (exit function) або процедури (exit sub)
Щодо функції слід пам’ятати, що результат має бути присвоєно змінній, яка має ім’я функції, до того, як функція завершиться за допомогою end function або exit function.
5.3.2. Способи передачі параметрів функції або процедури
У оголошенні вхідних та вихідних параметрів функції або процедури вказується спосіб (byRef, byVal) передачі параметра від програми-викликувача до програми, що викликається:
sub nomProcédure([Byref/Byval] param1, [Byref/Byval] param2, ...)
function nomFonction([Byref/Byval] param1, [Byref/Byval] param2, ...)
Якщо режим передачі byRef або byVal не вказано, використовується режим byRef.
Фактичні параметри, формальні параметри
Нехай функція VBScript визначається таким чином:
Параметри parmamFormi, що використовуються у визначенні функції або процедури, називаються формальними параметрами. Попередню функцію можна викликати з головної програми або іншого модуля за допомогою такої інструкції:
Параметри parmamEffi, що використовуються під час виклику функції або процедури, називаються фактичними параметрами. Коли починається виконання функції nomFonction, формальні параметри отримують значення відповідних фактичних параметрів. Ключові слова byRef та byVal визначають режим передачі цих значень.
Режим передачі за значенням (byVal)
Коли формальний параметр вказує цей режим передачі, формальний параметр і фактичний параметр є двома різними змінними. Значення фактичного параметра копіюється у формальний параметр перед виконанням функції або процедури. Якщо функція або процедура змінює значення формального параметра під час виконання, це жодним чином не впливає на значення відповідного фактичного параметра. Цей режим передачі добре підходить для вхідних параметрів функції або процедури.
![]() |
Спосіб передачі за посиланням (byRef)
Цей режим передачі є режимом за замовчуванням, якщо не вказано жодного режиму передачі параметра. Коли формальний параметр визначає цей режим передачі, формальний параметр і відповідний фактичний параметр є однією й тією самою змінною. Отже, якщо функція змінює формальний параметр, фактичний параметр також змінюється. Цей режим передачі добре підходить:
- для вихідних параметрів, оскільки їхні значення мають передаватися програмі, що викликає
- для вхідних параметрів, копіювання яких є трудомістким, наприклад масивів
![]() |
Наступна програма демонструє приклади передачі параметрів:
Програма |
|
Результати |
Коментарі
- У скрипті VBScript немає окремого місця для функцій і процедур. Вони можуть бути розміщені в будь-якому місці вихідного коду. Зазвичай їх групують або на початку, або в кінці, і роблять так, щоб основна програма утворювала суцільний блок.
5.3.3. Синтаксис виклику функцій і процедур
Нехай процедура p приймає формальні параметри pf1, pf2, ...
- виклик процедури p здійснюється у формі
без дужок навколо параметрів
- якщо процедура p не приймає жодних параметрів, можна однаково використовувати виклик p або p() та оголошення sub p або sub p()
Нехай функція f приймає формальні параметри pf1, pf2, ...
- виклик функції f здійснюється у формі
Дужки навколо параметрів є обов’язковими. Якщо функція f не приймає жодних параметрів, можна однаково використовувати виклик f або f() та оголошення function f або function f().
- Результат функції f може ігноруватися програмою, що її викликає. У такому разі функція f розглядається як процедура і підпорядковується правилам виклику процедур. Тоді для виклику функції f пишуть f pe1, pe2, ... (без дужок).
Якщо функція або процедура є методом об’єкта, то, здається, правила дещо відрізняються і не є однорідними.
- Так, можна написати MyFile.WriteLine «Це тест.» або MyFile.WriteLine(«Це тест.»)
- але якщо можна написати wscript.echo 4, то не можна написати wscript.echo(4).
Будемо дотримуватися таких правил:
- не ставити дужки навколо параметрів процедури або функції, що використовується як процедура
- дужки навколо параметрів функції
5.3.4. Деякі приклади функцій
Нижче наведено кілька прикладів визначення та використання функцій:
Програма |
|
Результати |
Коментарі
- Функція rendUnTableau демонструє, що функція може повертати не один, а кілька результатів. Для цього достатньо розмістити їх у масиві-варіанті та повернути цей варіант як результат.
- І навпаки, функція argumentsVariables демонструє, що можна написати функцію, яка приймає змінну кількість аргументів. Для цього також достатньо помістити їх у масив-варіант і зробити цей варіант параметром функції.
5.3.5. Вихідний параметр або результат функції
Припустимо, що аналіз програми показав необхідність модуля M із вхідними параметрами Ei та вихідними параметрами Sj. Нагадаємо, що вхідні параметри — це інформація, яку програма-викликач передає програмі-викликаній, а, навпаки, вихідні параметри — це інформація, яку програма-викликана передає програмі-викликачу. У VBScript існує кілька рішень для вихідних параметрів:
- якщо є лише один вихідний параметр, його можна зробити результатом функції. У цьому випадку вже не існує вихідного параметра, а є лише результат функції.
- якщо є n вихідних параметрів, один із них може слугувати результатом функції, а інші n-1 залишаються вихідними параметрами. Можна також не використовувати функцію, а процедуру з n вихідними параметрами. Можна також використати функцію, яка поверне масив, у який будуть поміщені n значень, що мають бути повернуті програмі-викликувачу. Нагадаємо, що викликана програма повертає свої результати програмі-викликачу шляхом копіювання значень. У випадку вихідних параметрів, що передаються за посиланням, такого копіювання вдається уникнути. Отже, останній варіант забезпечує економію часу.
5.4. Програма Vbscript для сортування значень
Ми розпочали обговорення модульного програмування з алгоритмічного аналізу сортування числових значень, введених з клавіатури. Ось переклад VBScript, який можна було б для цього використати:
Коментарі:
- модуль échanger, який було виявлено в початковому алгоритмі, тут не став предметом модуля на VBScript, оскільки його було визнано занадто простим, щоб виділяти для нього окремий модуль.
5.5. Програма IMPOTS у модульній формі
Ми повертаємося до програми розрахунку податку, написаної цього разу у модульній формі
Коментарі
- функція getArguments дозволяє отримати інформацію (дружина, діти, заробітна плата) про платника податків. Тут ці дані передаються як аргументи до програми VBScript. Якщо це зміниться, наприклад, якщо ці аргументи будуть надходити з графічного інтерфейсу, то переписати потрібно буде лише процедуру getArguments, а не інші.
- Функція getArguments може виявляти помилки в аргументах. У такому випадку можна було б вирішити зупинити виконання програми у функції getArguments за допомогою інструкції wscript.quit. Цього ніколи не слід робити у функції чи процедурі. Якщо функція або процедура виявляє помилку, вона повинна якимось чином повідомити про це програму, що її викликає. Саме вона, а не процедура, має прийняти рішення про те, чи зупиняти виконання. У нашому прикладі програма, що викликає, може вирішити попросити користувача повторно ввести помилкові дані з клавіатури, замість того щоб зупиняти виконання.
- Тут функція getArguments повертає масив, перший елемент якого є кодом помилки (0, якщо помилки немає), а другий — повідомленням про помилку, якщо помилка сталася. Перевіривши отриманий результат, програма-викликач може визначити, чи сталася помилка.
- Процедура getData дозволяє отримати дані, необхідні для розрахунку податку. Тут вони безпосередньо визначені в процедурі getData. Якщо ці дані мають надходити з іншого джерела, наприклад, із файлу або бази даних, то переписати слід лише процедуру getData, а інші — ні.
- Функція calculerImpot дозволяє розрахувати податок після отримання всіх даних, незалежно від способу їх отримання.
- Отже, слід зазначити, що модульний підхід до програмування дозволяє (повторно) використовувати певні модулі в різних контекстах. Ця концепція протягом останніх двадцяти років активно розвивалася в рамках об’єктно-орієнтованого програмування.







