3. Основи програмування VBSCRIPT
Описавши можливі контексти виконання скрипту VBScript, ми переходимо до розгляду самої мови. У подальшому ми будемо виходити з таких умов:
- контейнер скрипта — WSH
- скрипт розміщений у файлі з розширенням .vbs
Щоб представити якусь концепцію, ми зазвичай діємо таким чином:
- за необхідності вводимо поняття
- наводимо ілюстративну програму з її результатами
- за необхідності коментуємо результати та програму
Контейнери VBScript не чутливі до регістру (великі/малі літери) у тексті скрипта. Тому можна писати як wscript.echo «привіт», так і WSCRIPT.ECHO «привіт».
Програми, представлені далі, часто виводять інформацію на екран, тому ми ще раз розглянемо методи виведення об’єкта wscript.
3.1. Виведення інформації
Ми вже використовували метод echo об’єкта wscript, але цей об’єкт має й інші методи, що дозволяють виводити інформацію на екран, як показано в наступному скрипті:
Програма | Результати |
![]() |
Слід звернути увагу на наступні моменти:
- Будь-який текст, розміщений після апострофа, вважається коментарем до скрипта і не інтерпретується WSH (рядок 1).
- Метод echo записує свої аргументи та переходить до наступного рядка, так само як і метод writeLine (рядки 2 та 6)
- метод write записує свої аргументи і не переходить до наступного рядка (рядок 3)
- позначка кінця рядка представлена послідовністю двох кодових символів ASCII — 13 та 10. Отже, рядок 4 представлений виразом chr(13) & chr(10), де chr(i) — це символ з кодом ASCII i, а & — оператор конкатенації рядків. Таким чином, «chat» & «eau» утворює рядок «chateau».
- Позначку кінця рядка простіше представити за допомогою константи vbCRLF (рядок 5)
3.2. E Написання команд у скрипті VBScript
За замовчуванням кожна інструкція записується в окремому рядку. Проте можна записувати кілька інструкцій в одному рядку, розділяючи їх символом :, як у inst1:inst2:inst3. Якщо рядок занадто довгий, його можна розділити на частини. У цьому випадку різні частини команди повинні закінчуватися двома символами (пробіл)_. Повернемося до попереднього прикладу, переписавши команди по-іншому:
Програма | Результати |
![]() |
3.3. Запис за допомогою функції msgBox
Хоча в цьому документі ми майже виключно використовуємо об’єкт wscript для виведення тексту на екран, існує більш досконала функція для відображення інформації у вікні. Це функція msgbox, яка зазвичай використовується з трьома параметрами:
msgbox повідомлення, іконки+кнопки, заголовок
- message — це текст повідомлення, яке потрібно відобразити
- icônes+boutons (опціонально) — це число, яке вказує тип іконки та кнопок, що мають бути розміщені у вікні повідомлення. Найчастіше це число є сумою двох чисел: перше визначає іконку, друге — кнопки
- заголовок — це текст, який потрібно розмістити в рядку заголовка вікна повідомлення
Для визначення піктограми та кнопок у вікні повідомлення слід використовувати такі значення:
Константа | Значення | Опис |
vbOKOnly | 0 | Відображає лише кнопку OK. |
vbOKCancel | 1 | Відображає кнопки OK та «Скасувати». |
vbAbortRetryIgnore | 2 | Відображає кнопки «Відмовитися», «Спробувати ще раз» та «Пропустити». |
vbYesNoCancel | 3 | Відображає кнопки «Так», «Ні» та «Скасувати». |
vbYesNo | 4 | Відображає кнопки «Так» і «Ні». |
vbRetryCancel | 5 | Відображає кнопки «Спробувати ще раз» та «Скасувати». |
vbCritical | 16 | Відображає піктограму «Критичне повідомлення». |
vbQuestion | 32 | Відображає піктограму «Запит на попередження». |
vbExclamation | 48 | Відображає піктограму «Повідомлення про попередження». |
vbInformation | 64 | Відображає піктограму інформаційного повідомлення. |
vbDefaultButton1 | 0 | Перша кнопка є кнопкою за замовчуванням. |
vbDefaultButton2 | 256 | Друга кнопка є кнопкою за замовчуванням. |
vbDefaultButton3 | 512 | Третя кнопка є кнопкою за замовчуванням. |
vbDefaultButton4 | 768 | Четверта кнопка є кнопкою за замовчуванням. |
vbApplicationModal | 0 | Модальне вікно; користувач повинен відповісти на повідомлення, перш ніж продовжити роботу в поточній програмі. |
vbSystemModal | 4096 | Модальна система; робота всіх додатків призупиняється, доки користувач не відповість на повідомлення. |
Ось кілька прикладів:
Програма | ||||||||||||||||||
![]() | ||||||||||||||||||
Результати | ||||||||||||||||||
| ||||||||||||||||||
У деяких випадках відображається інформаційне вікно, яке одночасно є вікном введення даних. Якщо ставиться запитання, то, наприклад, потрібно дізнатися, чи натиснув користувач кнопку oui чи кнопку non. Функція msgBox повертає результат, який ми не використовували в попередній програмі. Цей результат — ціле число, що позначає кнопку, яку користувач натиснув для закриття вікна відображення:
Константа | Значення | Вибрана кнопка |
vbOK | 1 | OK |
vbCancel | 2 | Скасувати |
vbAbort | 3 | Відмова |
vbRetry | 4 | Спробувати ще раз |
vbIgnore | 5 | Пропустити |
vbYes | 6 | Так |
vbNo | 7 | Ні |
Наступна програма демонструє використання результату функції msgBox. 4 рази з’являється вікно з кнопками «так», «ні» та «скасувати». Відповідаємо наступним чином:
- натискаємо «Так»
- натискаємо «Ні»
- натискаємо «Скасувати»
- закрити вікно, не натискаючи жодної кнопки. Програма демонструє, що це еквівалентно натисканню кнопки «Скасувати».
Програма | ||||
![]() | ||||
Результати | ||||
|
3.4. , дані, які можна використовувати у VBScript
VBscript підтримує лише один тип даних: variant. Значенням варіанту може бути число (4, 10,2), рядок символів («bonjour»), логічне значення (true/false), дата (#01/01/2002#), адреса об’єкта або сукупність усіх цих даних, розміщених у структурі, що називається масивом.
Розглянемо наступну програму та її результати:
Програма | Результати |
![]() |
Коментарі:
- деякі мови програмування (C, C++, Pascal, Java, C# тощо) вимагають попереднього оголошення змінної перед її використанням. Це оголошення полягає у вказівці імені змінної та типу даних, які вона може містити (ціле число, дійсне число, рядок, дата, логічне значення тощо). Оголошення змінних дає змогу:
- визначити обсяг пам’яті, необхідний для змінної, оскільки різні типи даних потребують різного обсягу пам’яті
- перевірити узгодженість програми. Так, якщо i є цілим числом, а c — рядком символів, то множення i на c не має сенсу. Якщо типи змінних i та c були оголошені програмістом, програма, що аналізує код перед його виконанням, може повідомити про таку невідповідність.
Як і більшість скриптових мов з єдиним типом даних (Perl, Python, JavaScript тощо), VBScript дозволяє не оголошувати змінні. Саме це було зроблено у наведеному вище прикладі.
- Звернімо увагу на синтаксис різних значень
- 10,2 у рядку 10 (десяткова крапка, а не кома). Зазначимо, що на екрані відображається саме 10,2.
- 1.4e-2 у рядку 13 (науковий запис). На екрані відображається число 0,014
- [#01/10/2002#] (рядок 26) для позначення дати 10 січня 2002 року. Отже, VBScript використовує формат #mm/jj/aaaa# для представлення дати jj місяця mm року aaaa
- булеві значення true та false (істина/хиба) у рядках 31 та 34. Ці два значення представлені відповідно цілими числами -1 та 0, як показано у рядках 32 та 35. Коли булеве значення об'єднується з символьним рядком, ці значення перетворюються відповідно на рядки «Vrai» та «Faux», як показано в рядках 33 та 36. Зазначимо, що оператор об'єднання & може використовуватися для об'єднання не лише рядків.
- Оскільки змінна v не має призначеного типу, вона може послідовно приймати значення різних типів.
3.5. : підтипи типу variant
Ось що говорить офіційна документація про різні типи даних, які може містити variant:
Окрім простого розрізнення між числом і рядком, Variant може розрізняти різні типи числової інформації. Наприклад, певна числова інформація представляє дату або час. Коли ця інформація використовується разом з іншими даними про дату або час, результат завжди виражається у вигляді дати або часу. Також доступні інші типи числової інформації — від булевих значень до великих чисел з плаваючою комою. Ці різні категорії інформації, які можуть міститися у варіанті, є підтипами. У більшості випадків ви просто розміщуєте свої дані у варіанті, і він поводиться найбільш доречним чином відповідно до цих даних.
У наступній таблиці наведено різні підтипи, які можуть міститися у Variant.
Підтип | Опис |
Empty | Варіант не ініціалізовано. Його значення дорівнює нулю для числових змінних і порожньому рядку ("") для рядкових змінних. |
Null | Варіант навмисно містить некоректні дані. |
Boolean | Містить значення True (істина) або False (хиба). |
Byte | Містить ціле число від 0 до 255. |
Integer | Містить ціле число від -32 768 до 32 767. |
Валюта | Від -922 337 203 685 477,5808 до 922 337 203 685 477,5807. |
Long | Містить ціле число від -2 147 483 648 до 2 147 483 647. |
Single | Містить число з плаваючою комою з одинарною точністю в діапазоні від -3,402823E38 до -1,401298E-45 для від’ємних значень; від 1,401298E-45 до 3,402823E38 для додатних значень. |
Double | Містить число з плаваючою комою подвійної точності від -1,79769313486232E308 до -4,94065645841247E-324 для від’ємних значень; від 4,94065645841247E-324 до 1,79769313486232E308 для додатних значень. |
Дата (Час) | Містить число, що позначає дату в діапазоні від 1 січня 100 року до 31 грудня 9999 року. |
Рядок | Містить рядок змінної довжини, обмежений приблизно 2 мільярдами символів. |
Об’єкт | Містить об’єкт. |
Error | Містить номер помилки. |
3.6. C изначити точний тип даних, що містяться у варіанті
Змінна типу variant може містити дані різних типів. Іноді нам потрібно знати точний характер цих даних. Якщо в програмі ми записуємо produit=nombre1*nombre2, то припускаємо, що nombre1 і nombre2 — це два числові значення. Іноді ми не впевнені в цьому, оскільки ці значення можуть походити з введення з клавіатури, з файлу або з будь-якого зовнішнього джерела. Тоді нам потрібно перевірити тип даних, що містяться в nombre1 та nombre2. Функція typename(var) дозволяє визначити тип даних, що містяться у змінній var. Ось кілька прикладів:
Програма | Результати |
![]() |
Ще однією можливою функцією є vartype(var), яка повертає число, що позначає тип даних, які містяться у змінній var:
Константа | Значення | Опис |
vbEmpty | 0 | Порожнє (не ініціалізовано) |
vbNull | 1 | Null (відсутні дійсні дані) |
vbInteger | 2 | Ціле число |
vbLong | 3 | Довге ціле число |
vbSingle | 4 | Число з плаваючою комою (одинарна точність) |
vbDouble | 5 | Число з плаваючою комою подвійної точності |
vbCurrency | 6 | Валютне число |
vbDate | 7 | Дата |
vbString | 8 | Канал |
vbObject | 9 | Об'єкт автоматизації |
vbError | 10 | Помилка |
vbBoolean | 11 | Логічне значення |
vbVariant | 12 | Варіант (використовується лише з масивами варіантів) |
vbDataObject | 13 | Об’єкт, що не належить до Automation |
vbByte | 17 | Байт |
vbArray | 8192 | Таблиця |
Примітка Ці константи визначені в VBScript. Отже, ці імена можна використовувати в будь-якому місці вашого коду замість фактичних значень.
Наведена вище інформація взята з документації до VBscript. Вона іноді містить неточності, що, ймовірно, пов’язано з копіюванням та вставкою з документації до VB. Функція vartype з VBScript виконує лише частину того, що зазначено вище.
Попередня програма, переписана для vartype, дає такі результати:
Програма | Результати |
![]() |
3.7. D кларація змінних, що використовуються скриптом
Ми вже зазначали, що оголошувати змінні, які використовує скрипт, не обов’язково. У цьому випадку, якщо ми напишемо:
1) somme=4
...
2) somme=smme+10
Якщо в інструкції 2 міститься друкарська помилка «smme» замість «somme», VBScript не повідомить про жодну помилку. Він вважатиме, що «smme» — це нова змінна. Він створить її та в контексті інструкції 2 використає, ініціалізувавши її значенням 0.
Такі помилки може бути дуже важко виявити. Тому рекомендується примусово оголошувати змінні за допомогою директиви option explicit, розміщеної на початку скрипта. Після цього кожна змінна має бути оголошена за допомогою оператора dim перед її першим використанням:
option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10
У цьому прикладі VBScript повідомить про наявність неоголошеної змінної, як показано в пункті 2), про що свідчить наступний приклад:
Програма | Результати |
![]() |
Хоча в коротких прикладах цього документа змінні здебільшого не оголошуються, ми будемо обов’язково оголошувати їх, щойно почнемо писати перші значущі скрипти. Тоді директива Option explicit використовуватиметься систематично.
3.8. Функції перетворення в « »
VBScript перетворює дані варіантів на рядки, числа, логічні значення тощо залежно від контексту. Здебільшого це працює добре, але іноді трапляються несподіванки, про що ми поговоримо пізніше. У таких випадках може знадобитися «примусове» визначення типу даних варіанту. VBscript має функції перетворення, які перетворюють вираз на різні типи даних. Ось деякі з них:
Cint (вираз) | перетворює вираз на коротке ціле число (integer) |
Clng (вираз) | перетворює вираз на довге ціле число (long) |
Cdbl (вираз) | перетворює вираз у число типу «double» |
Csng (вираз) | перетворює вираз у число типу «single» |
Ccur (вираз) | перетворює вираз у валютну одиницю (currency) |
Ось кілька прикладів:
3.9. : зчитування даних, введених з клавіатури
Об'єкт wscript дозволяє скрипту отримувати дані, введені з клавіатури. Метод wscript.stdin.readLine дозволяє зчитати рядок тексту, введений з клавіатури та підтверджений клавішею «Enter». Цей зчитаний рядок можна присвоїти змінній.
Програма | Результати |
![]() | |
Коментарі:
- У стовпці результатів у рядку [Tapez votre nom : st] значення st є рядком, введеним користувачем.
Якщо текст, введений з клавіатури, являє собою число, він все одно розглядається насамперед як рядок символів, як показано в прикладі нижче:
Програма | Результати |
![]() |
Якщо це число бере участь в арифметичній операції, VBscript автоматично перетворить рядок на число, але не завжди. Розглянемо наступний приклад:
Програма | Результати |
![]() |
У результатах видно, що рядок 8 скрипта не виконався так, як очікувалося, оскільки (на жаль) у VBScript оператор + має два значення: додавання двох чисел або конкатенацію двох рядків (два рядки з’єднуються один з одним). Раніше ми бачили, що числа, введені з клавіатури, зчитуються як символьні рядки, і що VBScript перетворює їх на числа за потреби. Він правильно впорався з операціями -, *, /, які можуть використовувати лише числа, але не з оператором +, який також може використовувати символьні рядки. У цьому випадку він припустив, що ми хочемо об’єднати рядки.
Простим рішенням цієї проблеми є перетворення рядків у числа одразу після їхнього зчитування, як показано в наступному вдосконаленому варіанті попередньої програми:
Програма | Результати |
![]() |
3.10. S Введення даних за допомогою функції inputbox
Іноді може знадобитися ввести дані через графічний інтерфейс, а не за допомогою клавіатури. У цьому випадку використовується функція inputBox. Вона підтримує багато параметрів, але найчастіше використовуються лише перші два:
reponse=inputBox(message,title)
- повідомлення: питання, яке ви ставите користувачеві
- заголовок (необов'язково): заголовок, який ви даєте вікну введення
- відповідь: текст, введений користувачем. Якщо користувач закрив вікно, не надавши відповіді, відповідь є порожнім рядком.
Ось приклад, у якому запитуються ім’я та вік людини. Для імені ми вводимо інформацію та натискаємо OK. Для віку ми також вводимо інформацію, але натискаємо «Скасувати».
Програма | ||||
![]() | ||||
Результати | ||||
|
3.11. U використання структурованих об'єктів
За допомогою VBScript можна створювати об’єкти, що мають методи та властивості. Щоб не ускладнювати справу, ми розглянемо тут об’єкт із властивостями, але без методів. Уявімо собі людину. Вона має багато властивостей, що її характеризують: зріст, вагу, колір шкіри, очей, волосся... Ми зупинимося лише на двох: її ім’я та вік. Перш ніж почати використовувати об’єкти, потрібно створити «форма», яка дозволить їх створювати. У VBScript це робиться за допомогою класу. Клас personne можна визначити так:
class personne
Dim nom,age
End class
Саме інструкція [Dim nom,age] визначає дві властивості класу personne. Щоб створити екземпляри (їх називають інстанціями) класу personne, пишемо:
Чому не написати
Тому що варіант не може містити об’єкт. Він може містити лише його адресу. При написанні set personne1=new personne відбувається така послідовність подій:
- створюється об’єкт personne. Це означає, що йому виділяється пам’ять.
- адреса цього об’єкта personne присвоюється змінній personne1
Тоді ми маємо таку схему розміщення в пам’яті для змінних personne1 та personne2:
![]() |
Умовно можна сказати, що personne1 є об’єктом personne. Таке неточне формулювання можна прийняти, якщо згадати, що personne1 насправді є адресою об’єкта personne, а не самим об’єктом personne.
Ми вже зазначали, що об’єкт personne має дві властивості: nom та age. Як використовувати ці властивості? За допомогою позначення objet.propriété, як було пояснено трохи вище. Отже,
personne1.nom позначає ім’я особи 1, а personne1.age — її вік. Ось коротка програма для ілюстрації:
Програма | Результати |
![]() |
Попередню програму можна змінити таким чином:
Програма | Результати |
![]() |
Тут ми використали конструкцію with ... end with, яка дозволяє «факторизувати» імена об’єктів у виразах. Конструкція with p1 ... end with у рядках 9–12 та 15–18 дозволяє згодом використовувати синтаксис .nom замість p1.nom та .age замість p1.age. Це дозволяє спростити написання інструкцій, у яких одна й та сама назва об’єкта використовується повторно.
3.12. Присвоєння значення змінній
Існує дві інструкції для присвоєння значення змінній:
- змінна=вираз
- set змінна=вираз
Форма 2 призначена для виразів, результатом яких є посилання на об'єкт. Для всіх інших типів виразів підходить форма 1. Різниця між цими двома формами полягає в наступному:
- у операторі variable=expression змінній присвоюється значення. Якщо v1 і v2 — дві змінні, то запис v1=v2 присвоює значення v1 змінній v2. Таким чином, відбувається дублювання значення у двох різних місцях. Якщо згодом значення v2 змінюється, значення v1 залишається незмінним.
![]() |
- у операторі set variable=expression змінна отримує як значення адресу об’єкта. Якщо v1 і v2 — дві змінні, а v2 є адресою об’єкта obj2, то запис set v1=v2 присвоює v2 значення v1, тобто адресу об’єкта obj2. Коли скрипт потім оперує з v1 і v2, оперують не «значеннями» v1 і v2, а об’єктами, на які «вказують» v1 і v2, тобто в даному випадку одним і тим самим об’єктом. Кажуть, що v1 і v2 — це два посилання на один і той самий об’єкт, і маніпулювання ним через v1 або v2 не має жодної різниці. Інакше кажучи, зміна об’єкта, на який вказує v2, змінює об’єкт, на який вказує v1.
![]() |
Ось приклад:
Програма | Результати |
![]() |
3.13. Е оцінка виразів
Основними операторами, що дозволяють обчислювати вирази, є такі:
Тип операторів | Оператори | Приклад |
Арифметичні | +,-,*,/ | |
mod | ||
\ | ||
^ | ||
Порівняння | <, <= >, >= =,<> | a<>b є істинним, якщо a відрізняється від b a=b є істинним, якщо a дорівнює b a та b можуть бути як числами, так і рядками символів. В останньому випадку chaine1<chaine2, якщо в алфавітному порядку chaine1 стоїть перед chaine2. При порівнянні рядків великі літери стоять перед малими в алфавітному порядку. |
is | ||
Логіка | and, or, not, xor | Усі операнди тут є булевими. bool1 or bool2 є істинним, якщо bool1 або bool2 є істинним bool1 and bool2 є істинним, якщо bool1 і bool2 є істинними not bool1 є істинним, якщо bool1 є хибним, і навпаки bool1 xor bool2 є істинним, якщо істинним є лише одне з булевих значень bool1 або bool2 |
Конкатенація | &, + | Не рекомендується використовувати оператор + для об'єднання двох рядків через можливу плутанину з додаванням двох чисел. Тому слід використовувати виключно оператор &. |
3.14. C контроль виконання програми
3.14.1. E виконання дій за певних умов
Інструкція VBScript, що дозволяє виконувати дії залежно від значення «істина»/«хиба» умови, має такий вигляд:
| Спочатку обчислюється вираз expression. Цей вираз повинен мати булеве значення. Якщо його значення дорівнює «true», виконуються дії з then, інакше — дії з else, якщо він присутній. |
Далі наведено програму, що демонструє різні варіанти конструкції «if-then-else»:
Програма | Результати |
![]() |
Коментарі:
- у VBScript можна писати instruction1:instruction2:... : instructionn замість того, щоб писати по одній інструкції на рядок. Саме ця можливість була використана, наприклад, у рядку 10.
3.14.2. E виконання дій повторно
Цикл із відомим числом ітерацій |
З циклу for можна вийти в будь-який момент за допомогою оператора exit for. |
Цикл з невідомою кількістю ітерацій |
З циклу do while можна вийти в будь-який момент за допомогою оператора exit do. |
Наведена нижче програма ілюструє ці моменти:
Програма |
![]() |
Результати |
Примітка: На етапі розробки програми нерідко трапляється, що програма «зациклюється», c.a.d, тобто ніколи не зупиняється. Зазвичай програма виконує цикл, умову виходу з якого неможливо перевірити, як, наприклад, у наведеному нижче прикладі:
' нескінченна петля
i=0
Do While 1=1
i=i+1
wscript.echo i
Loop
' ще одна такого ж типу
i=0
Do While true
i=i+1
wscript.echo i
Loop
Якщо запустити попередню програму, перший цикл ніколи не зупиниться самостійно. Його можна примусово зупинити, ввівши з клавіатури CTRL-C (одночасно утримуючи клавіші CTRL та C).
3.14.3. Завершення виконання програми
Інструкція wscript.quit n завершує виконання програми, повертаючи код помилки, рівний n. У DOS цей код помилки можна перевірити за допомогою команди if ERRORLEVEL n, яка є істинною, якщо код помилки, повернутий останньою виконаною програмою, >=n. Розглянемо наступну програму та її результати:
![]() |
Відразу після виконання програми видаються такі три команди DOS:
Команда DOS 1 перевіряє, чи код помилки, повернутий програмою, >=5. Якщо так, вона виводить (echo) 5, інакше — нічого.
Команда DOS 3 перевіряє, чи код помилки, повернутий програмою, >=4. Якщо так, вона виводить 4, інакше — нічого.
Команда DOS 5 перевіряє, чи код помилки, повернутий програмою, не менший за 3. Якщо так, вона виводить 3, інакше — нічого.
З виведених результатів можна зробити висновок, що код помилки, повернутий програмою, дорівнював 4.
3.15. : масиви даних у варіанті
Варіант T може містити список значень. У такому випадку кажуть, що це масив. Масив T має різні властивості:
- Доступ до елемента i масиву T здійснюється за допомогою синтаксису T(i), де i — ціле число, яке називається індексом і лежить у діапазоні від 0 до n-1, якщо T містить n елементів.
- Індекс останнього елемента масиву T можна визначити за допомогою виразу ubound(T). Кількість елементів масиву T дорівнює ubound(T)+1. Цю величину часто називають розміром масиву.
- Змінну T можна ініціалізувати порожнім масивом за допомогою синтаксису T=array() або набором елементів за допомогою синтаксису T=array(елемент0, елемент1, ...., елементn)
- До вже створеного масиву T можна додавати елементи. Для цього використовується оператор redim preserve T(N), де N — новий індекс останнього елемента масиву T. Ця операція називається зміною розміру (redim). Ключове слово preserve вказує, що під час зміни розміру поточний вміст масиву має бути збережено. За відсутності цього ключового слова масив T змінюється за розміром, а його елементи видаляються.
- Елемент T(i) масиву T має тип variant і тому може містити будь-яке значення, зокрема масив. У цьому випадку позначення T(i)(j) означає елемент j масиву T(i).
Ці різноманітні властивості масивів проілюстровано в наступній програмі:
Програма | Результати |
![]() |
Коментарі
- тут було використано функцію join, про яку детальніше йдеться трохи далі.
3.16. Масиви змінних
У VBScript існує ще один спосіб використання масиву — це використання масивної змінної. На відміну від скалярних змінних, така змінна обов'язково повинна бути оголошена за допомогою оператора dim. Можливі різні варіанти оголошення:
- dim масив(n) оголошує статичний масив із n+1 елементів, пронумерованих від 0 до n. Розмір такого масиву не можна змінювати
- dim масив() оголошує порожній динамічний масив. Щоб його можна було використовувати, його розмір потрібно змінити за допомогою оператора redim так само, як і для варіанту, що містить масив
- dim масив(n,m) оголошує двовимірний масив розміром (n+1)*(m+1) елементів. Елемент (i,j) масиву позначається як tableau(i,j). Зверніть увагу на відмінність від варіанту, де той самий елемент позначався б як tableau(i)(j).
Чому існують два типи масивів, які, зрештою, дуже схожі? У документації до VBScript про це не згадується, і також не вказано, чи один із них є більш ефективним за інший. Надалі у наших прикладах ми будемо використовувати майже виключно масив у варіанті. Однак слід пам’ятати, що VBscript походить із мови Visual Basic, яка містить типізовані дані (integer, double, boolean тощо). У цьому випадку, якщо, наприклад, потрібно використовувати масив дійсних чисел, змінна типу «масив» буде ефективнішою, ніж змінна типу «варіант». Тоді для оголошення масиву дійсних чисел ми напишемо щось на кшталт dim tableau(1000) as double або просто dim tableau() as double, якщо масив є динамічним.
Ось приклад, що ілюструє використання масивів:
Програма | Результати |
![]() |
3.17. функції split та join
Функції split та join дозволяють перетворювати рядок на масив і навпаки:
- Якщо T — масив, а car — рядок, то join(T,car) — це рядок, утворений об’єднанням усіх елементів масиву T, кожен з яких відокремлений від наступного рядком car. Таким чином, join(array(1,2,3),"abcd") дасть рядок "1abcd2abcd3"
- Якщо C — це рядок, що складається з послідовності полів, розділених рядком car, то функція split(C,car) повертає масив, елементи якого є окремими частинами рядка C. Так, split("1abcd2abcd3", "abcd") поверне масив (1, 2, 3)
Ось приклад:
Програма | Результати |
|
3.18. Масиви
Доступ до елемента масиву T можна отримати, знаючи його номер i. У цьому випадку він позначається як T(i). Існують масиви, доступ до елементів яких здійснюється не за номером, а за рядком символів. Типовим прикладом такого масиву є словник. Коли ми шукаємо значення слова в «Ларусі» або «Ле петіт Робер», ми отримуємо доступ до нього за допомогою самого слова. Цей словник можна представити у вигляді масиву з 2 стовпцями:
слово1 | опис1 |
слово2 | опис2 |
слово3 | опис3 |
.... |
Тоді можна було б писати щось на кшталт:
словник("слово1")="опис1"
словник("слово2")="опис2"
...
Це дуже нагадує роботу масиву, за винятком того, що індекси масиву — це не цілі числа, а символьні рядки. Такий тип масиву називають словником (або асоціативним масивом, хеш-таблицею), а індекси-символьні рядки — ключами словника (keys). Словники надзвичайно часто використовуються у світі інформатики. У кожного з нас є картка соціального страхування з номером. Цей номер однозначно ідентифікує нас і надає доступ до інформації, що стосується нас. У моделі «словник("ключ")="інформація"» «ключ» тут буде номером соціального страхування, а «інформація» — усією інформацією про нас, що зберігається на комп’ютерах служби соціального страхування.
У Windows доступний об’єкт ActiveX під назвою «Scripting.Dictionary», який дозволяє створювати словники та керувати ними. Об’єкт ActiveX — це програмний компонент, що надає інтерфейс, який можуть використовувати програми, написані на різних мовах, за умови дотримання стандарту використання об’єктів ActiveX. Отже, об’єкт Scripting.dictionary можна використовувати з мовами програмування Windows: JavaScript, Perl, Python, C, C++, VB, VBA тощо, а не лише з VBScript.
1 | Об’єкт Scripting.Dictionary створюється за допомогою команди set dico=wscript.CreateObject("Scripting.Dictionary") або просто set dico=CreateObject("Scripting.Dictionary") CreateObject — це метод об’єкта WScript, що дозволяє створювати екземпляри об’єктів ActiveX. У версії 2 показано, що wscript може бути неявним об’єктом. Коли метод не можна «прив’язати» до об’єкта, контейнер WSH спробує прив’язати його до об’єкта wscript. |
2 | Після створення словника ми зможемо додавати до нього елементи за допомогою методу add: dico.add «ключ», значення створить новий запис у словнику, пов’язаний із ключем «ключ». Відповідне значення — це варіант, що містить довільні дані. |
3 | Щоб отримати значення, пов’язане з певним ключем, використовуємо метод item словника: var=dico.item("ключ") або set var=dico.item("ключ"), якщо значення, пов'язане з ключем, є об'єктом. |
4 | За допомогою методу `keys` можна отримати набір усіх ключів словника у вигляді масиву змінної довжини: ключі = dic.keys clés — це масив, елементи якого можна перебирати. |
5 | За допомогою методу `items` можна отримати набір значень словника у вигляді масиву: значення = dic.items items — це масив, елементи якого можна перебирати. |
6 | Наявність ключа можна перевірити за допомогою методу `exists`: dico.exists("ключ") має значення «true», якщо ключ "ключ" існує у словнику |
7 | За допомогою методу remove можна видалити запис зі словника (ключ+значення): dico.remove("ключ") видаляє запис зі словника, пов'язаний із ключем "ключ". dico.removeall видаляє всі ключі, c.a.d очищає словник. |
Наступна програма використовує ці різні можливості:
Програма |
|
Результати |
|
3.19. Сортування масиву або словника
Часто виникає потреба в сортуванні масиву або словника за зростанням або спаданням значень або ключів (у випадку словника). Хоча в більшості мов програмування існують функції сортування, у VBScript їх, здається, немає. Це є недоліком.
3.20. Аргументи програми
Можна викликати програму VBScript, передаючи їй параметри, як у цьому прикладі:
Це дозволяє користувачеві передавати інформацію програмі. Як програма отримує ці дані? Розглянемо таку програму:
Програма | Результати |
![]() |
Коментарі
- WScript.Arguments — це колекція аргументів, переданих скрипту
- колекція C — це об’єкт, який має
- властивість count, яка є кількістю елементів у колекції
- метод C(i), який повертає i-й елемент колекції
3.21. Перше застосування: IMPOTS
Запропонуємо написати програму, яка дозволяє обчислити податок платника податків. Розглянемо спрощений випадок, коли платник податків має лише одну заробітну плату, яку потрібно задекларувати:
- розраховуємо кількість часток працівника nbParts = nbEnfants/2 + 1, якщо він не одружений, nbEnfants/2+2, якщо він одружений, де nbEnfants — кількість його дітей.
- розраховується його оподатковуваний дохід R = 0,72*S, де S — його річна заробітна плата
- розраховується його сімейний коефіцієнт Q = R/N
розраховуємо його податок I на основі таких даних
12620,0 | 0 | 0 |
13190 | 0,05 | 631 |
15640 | 0,1 | 1290,5 |
24740 | 0,15 | 2072,5 |
31810 | 0,2 | 3309,5 |
39970 | 0,25 | 4900 |
48360 | 0,3 | 6898,5 |
55790 | 0,35 | 9316,5 |
92970 | 0,4 | 12106 |
127860 | 0,45 | 16754,5 |
151250 | 0,50 | 23147,5 |
172040 | 0,55 | 30710 |
195 000 | 0,60 | 39312 |
0 | 0,65 | 49 062 |
Кожен рядок містить 3 поля. Щоб обчислити податок I, шукаємо перший рядок, у якому QF <= поле1. Наприклад, якщо QF = 30000, то буде знайдено рядок
Тоді податок I дорівнює 0,15*R - 2072,5*nbParts. Якщо QF є таким, що співвідношення QF<=поле1 ніколи не виконується, то використовуються коефіцієнти останнього рядка. У даному випадку:
що дає податок I = 0,65*R - 49062*nbParts.
Програма виглядає так:
Програма | ||
| ||
Результати | ||
|
Коментарі:
- програма використовує те, що було розглянуто раніше (оголошення змінних, аргументи, зміни типів, умови, цикли, масив у варіанті)
- вона не перевіряє правильність даних, що було б ненормальним у реальній програмі
- Складність полягає лише в циклі while. Він має на меті визначити індекс i масиву limites, для якого виконується умова limites(i)>qf, причому для i<ubound(limites) (c.a.d. Тут i<13), оскільки останній елемент масиву limites не має значення. Його було додано виключно для того, щоб перевірка [Do While i<ubound(limites) And qf>limites(i)] могла бути виконана для i=13. У цьому випадку перевірка має вигляд 13<13 and qf>limites(13), і тому (у VBScript) необхідно, щоб limites(13) існував. При виході з циклу while останнє обчислене значення i дозволяє обчислити податок: [impot=int(revenu*coeffr(i)-nbParts*coeffn(i))].









































