Тема: створення макросів.
Мета: створити уявлення про використання макросів і мову LibreOffice Basic, навчити створюювати макроси за зразком і запускати їх на виконання в інтегрованому середовищі розробки LibreOffice Basic.
Обладнання: комп’ютери зі встановленими ОС та LibreOffice Base, (дана) інструкція, файл my_school.odb.
Хід уроку
1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.
2. Актуалізація опорних знань
3. Вивчення нового матеріалу
Макрос — це спеціальна програма, призначена для виконання всередині середовища пакета офісних програм. Наприклад, LibreOffice. Макроси зберігають у модулях (Modules), які, в свою чергу, зберігають у бібліотеках (Libraries). А бібліотеки можна зберігати і в самому документі, і у спеціальному шаблоні.
LibreOffice надає інтерфейс прикладного програмування (API), який дозволяє контролювати компоненти LibreOffice з використанням мов програмування Java, Python, C++, Basic, OLE і CLI за допомогою комплекту засобів розробки (SDK) LibreOffice. Завдяки цьому макроси можуть стати потужним інструментом для автоматизації задач у руках досвідченого розробника. В той самий час потрібно пам’ятати про безпеку під час їх використання. Адже вони потенційно спроможні нанести шкоду. Наприклад, видалити файл з цінною інформацією. Також існують певні різновиди вірусів у вигляді макросів.
У пакеті LibreOffice існує система захисту від неконтрольованого запуску макросів. Ця система в себе включає підписування макросів і реєстрацію довірених джерел місць розташування файлів.
Рівні безпеки використання макросів такі:
Низький — не рекомендовано використовувати, бо макроси буде запущено на виконання без будь-яких попереджень.
Середній — автоматичний запуск будь-яких макросів з довірених джерел і потреба підтвердження для запуску макросів із джерел, які попередньо не оголошено довіреними.
Високий — дозволено запуск будь-яких макросів із довірених джерел і заборонено запуск усіх інших.
Дуже високий — дозволено запуск лише підписаних макросів із довірених джерел.
Користувач може встановити рівень безпеки, використавши вказівку меню Засоби / Параметри / Безпека для виклику вікна діалогу Параметри - LibreOffice - Безпека.
У цьому вікні потрібно натиснути кнопку Безпека макросів і вибрати потрібний рівень безпеки. На малюнку нижче подано вибір середнього рівня — саме такого, який буде використано під час виконання практичної роботи.
Під час відкривання документів, які містять макроси, на екрані з’явиться вікно діалогу, у якому потрібно буде зробити вибір — дозволити виконання макросів чи ні.
LibreOffice Basic — мова для запису макросів, інтегрована у пакет LibreOffice. Ця мова належить до родини мов Basic і багато в чому схожа на мови Microsoft Visual Basic for Applications чи Microsoft Visual Basic. Метою цієї практичної роботи є знайомство саме з цією мовою написання макросів. У ній макроси подано як підпрограми, записані у модулі одна за іншою. Але виконувати макроси можна у довільному порядку, викликаючи їх за їхніми назвами.
Виконання макросів
Під час створення й налаштування макросів їх можна запускати на виконання безпосередньо у інтегрованому середовищі розробки. Після того, як макрос було створено й перевірено, запускати його можна вказівкою меню Засоби / Макроси / Виконати макрос… . У вікні діалогу, яке з’явиться, потрібно вибрати бібліотеку, модуль і макрос, після чого клацнути по кнопці Run або натиснути клавішу Enter на клавіатурі.
Основи мови LibreOffice Base
Мови LibreOffice Base і Visual Basic for Application (VBA) схожі одна на одну, бо вони мають спільне коріння — мову Basic. У налаштуваннях компілятора LibreOffice Base можна встановити режим сумісності з VBA. Хоча повної сумісності досягти не вдається.
Налаштування компілятора здійснюють, використовуючи спеціальні вказівки й опції: Def, Option Base, Option Compatible та Option Explicit, які потрібно записати на початку коду модуля.
Вказівка Option Explicit встановлює режим обов’язкового опису змінних до їхнього використання у програмі. Спроба використати змінну без її попереднього опису призведе до помилки, як показано на малюнку.
Головною перевагою режиму Option Explicit є усунення (логічних) помилок, спричинених помилковим записом назв змінних.
Вказівка Option Compatible скеровує компілятор також до виконання вказівок Microsoft Visual Basic. Але внаслідок несумісності об'єктних моделей цих офісних пакетів просте копіювання макросів із Microsoft Office не завжди дієве. Наприклад, під час виконання поданого нижче макросу виникне помилка Змінна не визначена, бо сталу vbCr не визначена у мові LibreOffice Basic.
Option Explicit Sub CmptDemo Dim S$ S = S & "Перший рядок" & vbCr & "Другий рядок" MsgBox S End Sub
Якщо ж увімкнути режим сумісності з Microsoft Visual Basic, то макрос буде виконано.
Option Compatible Option Explicit Sub CmptDemo Dim S$ S = S & "Перший рядок" & vbCr & "Другий рядок" MsgBox S End Sub
Однак наступний макрос, який працює у Microsoft Word, у LibreOffice Writer працювати не буде навіть при виставленій опції Option Compatible внаслідок відсутності відповідних об'єктів у LibreOfficeWriter.
Sub DemoCmpt() Selection.TypeText Text:="Демонстрація" Selection.TypeParagraph End Sub
Вказівка Option Base дозволяє задавати величину першого індексу масивів «0» або «1». Для сумісності між підпрограми краще не використовувати цю вказівку, а явно задавати межі масивів.
Вказівка Def дозволяє пов'язати з назвами змінних певні типи даних. У коді:
DefDbl d DefInt s, km Sub Speed kmS = 100 sTime = 60 dV = kmS / sTime print VarType(dV), VarType(kmS), VarType(sTime) End Sub
функція VarType(назва змінної) повертає тип вказаної змінної. Наприклад, 5 означає дійсний тип, 2 — цілий). У результаті виконання цього макросу отримаємо таке повідомлення.
Немає сенсу використовувати вказівку Def, якщо встановлено режим обов'язкового опису змінних Option Explicit.
Ідентифікатори
Для назв змінних, сталих, підпрограм і міток можна використовувати літери латиниці A—Z, a—z, цифри 0—9 і «_» — символ нижнього підкреслення. Першим символом назви обов’язково має бути літера латиниці.
Примітка. Як у багатьюх (але не в усіх!) мовах програмування, у назвах змінних великі й малі літери ототожнено. Наприклад, назви MyVar і myvar будуть назвами одного й того самого об'єкту.
Змінні
Опис змінної починають службовим словом Dim. У рядку опису змінної можна вказати її тип даних (цілий, дійсний, рядок тощо) або не вказати (тип Variant). Подамо у таблиці прості типи даних LibreOffice Basic.
Тип | Діапазон допустимих значень | Ініціалізація | Розмір (байт) | Суфікс |
Boolean | True, False | False | 1 | – |
Integer | Цілі числа від –32 768 до 32 767 | 0 | 2 | % |
Long | Цілі числа від –2 147 483 648 до 2 147 483 647 | 0 | 4 | & |
Single | Дійсні числа з [–3.402823 ∙ 1038; 3.402823 ∙ 1038] | 0.0 | 4 | ! |
Double | Дійсні числа з [–1.79769313486232 ∙ 10308; 1.79769313486232 ∙ 10308 | 0.0 | 8 | # |
String | Текстовий рядок від 0 до 65536 символів | “” | 1 на 1 символ | $ |
Currency | Чотири знаки після коми | 0.0000 | 8 | @ |
Date | Дата і час | 00:00:00 | 8 | – |
Крім вказаних типів також використовують типи Object (для дій з об’єктами) і Variant (для опису змінної змінного типу, що може набувати величин будь-якого типу).
Оператор надання величини змінній має таке позначення: «=» (без лапок).
Арифметичні вирази
Пелічимо назви й позначення (у дужках) арифметичних операторів, які використовують для запису арифметичних виразів у LіbreOffice Basic. Перелік подано у порядку спадання пріоритету виконання:
1) оператор зміни знака «унарний мінус» (–);
2) піднесення до степеня (^);
3) множення (*) i ділення (/);
4) лишок від ділення (MOD);
5) частка від ділення (\);
6) додавання (+) i віднімання (–).
Як у більшості мов програмування, оператори виконують у порядку запису зліва-направо з врахуванням пріоритету. Змінити порядок обчислень у виразі можна за допомогою круглих дужок. У записі арифметичних виразів застосовують також математичні функції й сталі, деякі з яких перелічимо тут:
Abs — модуль, абсолютне значення числа;
Atn — арктангенс;
Cos — косинус;
Exp — експонента;
Log — логарифм;
Sgn — знак числа;
Sin — синус;
Sqr — квадратний корінь;
Tan — тангенс;
Pi — число Піфагора π.
Примітка. Aрґументи тригонометричних функцій задано в радіанах.
Логічні (булеві) вирази — це вирази, у результаті обчислення яких отримуємо величину True або False. Крім операторів, функцій і сталих, припустимих у записі арифметичних виразів, у записі логічних виразів використовують такі логічні оператори (перелічено у порядку спадання пріоритету виконання):
NOT — заперечення;
AND — логічне «i»;
OR — логічне «або»;
XOR — побітова сума;
EQV — еквівалентність;
IMP — імплікація
й оператори порівняння (відношення):
> — читати «перевищує»;
< — читати «менше»;
>= — читати «не менше»;
<= — читати «не перевищує»;
= — читати «збігається»;
>< — читати «відмінне».
Примітка. Оператори порівняння (відношення) мають вищий пріоритет, ніж логічні оператори.
Пріоритети операторів:
1) NOT - +
2) ^
3) * /
4) MOD
5) \
6) - +
7) &
8) IS = < > <= >= <>
9) AND OR XOR EQV IMP.
Керування порядком виконання здійснюють за допомогою таких конструкцій: GoSub, GoTo, On GoTo, On Go Sub, If … Then … Else, IIf, Choose, Select Case, While … Wend, Do … Loop, For … Next, Exit Sub, Exit Function.
У межах цієї практичної роботи розглянемо лише деякі з них: If … Then … Else, Select Case, While … Wend, Do … Loop, For … Next.
If … Then … Else
Організувати виконання вказівок залежно від справдження певної умови можна за допомогою оператора розгалуження, який записують у одній із двох форм – неповній і повній.
Неповна форма оператора розгалуження має такий вигляд:
If ЛогічнийВираз Then Вказівка.
Принцип роботи такий: якщо обчислена величина ЛогічнийВираз буде True, то буде виконано Вказівку і здійснено перехід до вказівки у наступному рядку коду, інакше буде здійснено лише перехід до вказівки у наступному рядку коду.
Примітка. До вказівки в наступному рядку коду черга може не дійти, якщо до цього буде припинено виконання програми.
Повна форма оператора розгалуження має такий вигляд:
If ЛогічнийВираз Then
БлокBказівок
[ElseIf ЛогічнийВираз Then]
БлокBказівок
[Else]
БлокBказівок
End If
Тут у квадратних дужках вказано складові запису, які можуть бути відсутніми.
Примітка. Тут і далі вказівки потрібно розташувати в окремих рядках або розділити двокрапкою «:».
Принцип роботи цього оператора полягає у послідовному обчисленні логічних виразів і переходів до виконання блоків вказівок, які
слідують за Then, для результатів True або переходів до ElseIf для результатів False. Вкладати
оператори ElseIf можна будь-яку кількість разів.
Select Case — оператор вибору (перебору) — застосовують для вибору серед великої кількості варіантів. Форма його виклику така.
Select Case Вираз-умова
Case Випадок 1
БлокВказівок 1
Case Випадок 2
БлокВказівок 2
...
Case Випадок N
БлокВказівок N
Case Else
БлокВказівок 0
End Select
Тут:
Вираз-умова — це арифметичний або логічний вираз, величина якого визначає вибір;
Випадок n — вираз, величину якого порівнюють величиною Виразу-умови;
Блок вказівок n — послідовність вказівок, які буде виконано при збігу величин Випадку n і Виразу-умови. Перший (у порядку запису) випадок, для якого збігаються величини, призводить до виконання відповідного блоку вказівок і подальшого виходу із оператора Case. Якщо ж збігу не буде взагалі, то буде виконано Блок вказівок 0, записаний між Case Else і End Select.
Цикли
У LibreOffice Basic організацію повторень реалізовано великою кількістю варіантів. Тут ми розглянемо лише оператори For і Do.
For лічильник = початкова величина To кінцева величина [Step крок]
блок вказівок
Next
Це форма організації повторення, якщо наперед відома кількість повторень для блоку вказівок. Тут лічильник — змінна числового типу, початкова величина, кінцева величина, крок — вирази з числовим результатом.
Виконання такого оператора For починається з надання лічильнику початкової величини. Далі буде виконано блок вказівок. Потім лічильник
буде збільшено на величину кроку (якщо її не вказано, вона дорівнює 1). І знову буде виконано блок вказівок. Такі операції виконують до тих пір, поки лічильник не досягне кінцевої величини. У циклі можна застосувати вказівку примусового виходу з циклу Exit For.
Розглянемо 4 варіанти реалізації повторення блоку вказівок за певних умов. Заважимо: для уникнення нескінченого виконання циклу («зациклення»), блок вказівок має містити вказівки, які впливають на справдження умови і на можливість завершення циклу.
Поки справджується умова, виконують блок вказівок. Перевірку умови здійснюють до першого виконання блоку вказівок.
Do While умова
блок вказівок
Loop
Поки справджується умова, виконують блок вказівок, але, на відміну від попереднього варіанту, перевірку умови здійснюють лише після першого виконання блоку вказівок. Таким чином, щонайменше один раз блок вказівок буде виконано.
Do
блок вказівок
Loop While умова
Блок вказівок виконують, поки умова хибна (має величину False). Тобто реалізовано принцип: «досягли бажаного (умова стала істинною) — завершили роботу».
Do Until умова
блок вказівок
Loop
Блок вказівок виконують, поки умова хибна, але її перевірку здійснюють після виконання блоку вказівок (на відміну від попереднього випадку). Таким чином, щонайменше один раз блок вказівок буде виконано.
Do
блок вказівок
Loop Until умова
У всіх цих конструкціях циклу діє оператор примусового виходу з циклу Exit Do.
Інструменти налаштування макросів інтегрованого середовища розробки LibreOffice Basic такі:
Тут:
— панель інструментів Макрос;
— вказівник точки зупинки;
— вказівник поточної вказівки;
— підказка (з'являється при наведенні вказівника миші) з відображенням поточної величини змінної;
— область вікна Інспектора.
Найчастіше у процесі налаштування використовують панель інструментів Макрос з такими кнопками:
— Компілювати;
— Виконати макрос;
— Зупинити макрос;
— Крок з виходом;
— Крок із заходом;
— Вихід на верхній рівень;
— Точки зупинки;
— Керування точками зупинки;
— Увімкнути інспектора;
— Знайти дужку.
Звертання до баз даних з використанням макросів, записаних мовою Basic
На основі пакету LibreOffice можна створювати рішення для автоматизації задач документообігу й обліку. Для
цього розробнику потрібно не лише знати мову Basic, а й добре розуміти структуру даних самого пакету LibreOffice. Ця структура, на відміну від мови Basic, має відмінну від Microsoft Office реалізацію і несумісна з нею.
Під час розробки такої структури даних за основу була взято парадигму про взаємодію між різними об’єктами, платформами й мовами програмування з використанням єдиного інтерфейсу. У результаті з’явилася платформо-незалежна технологія Universal Network Objects (UNO), яка і стала основою OpenOffice і LibreOffice.
Для отримання доступу з макросу до методів, властивостей і інтерфейсів API LibreOffice ключовим є створення сервісу
UNO.
Подамо приклад алгоритму роботи з базою даних.
Створити сервіс UNO для доступу до вмісту бази даних:
DatabaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
Вказати назву попередньо зареєстрованої бази даних:
DB = DatabaseContext.getByName("my_school")
Встановити під'єднання до бази даних:
Conn = DB.getConnection("", "")
Задати вираз для наступного звертання до бази даних:
Stmt = Conn.createStatement()
Виконати звертання до бази даних і отримати об’єкт з результатами опрацювання заданого звертання для подальшої опрацювання:
Result = Stmt.executeQuery(strSQL)
Закрити під'єднання:
Conn.close()
4. Інструктаж з ТБ
5. Закріплення вивченого матеріалу
Примітка. Після створення кожного макросу результат (всю базу даних) записуватити з назвою Ваше прізвище у теку, вказану вчителем.
У середовищі LibreOffice Basic відкрийте наявну базу даних my_school.odb.
Виберіть середній рівень безпеки використання макросів.
Примітка. Домовимося у цій практичній роботі усі макроси зберігати у поточному документі my_school.odb у бібліотеці PR28.
Для створення бібліотеки PR28 використати вказівку меню Засоби / Макроси / Керування макросами / LibreOffice Basic… або натиснути комбінацію клавіш Alt + F11. У вікні ділогу Макрос LibreOffice Basic натиснути кнопку Organizer (Організатор).
На вкладці Бібліотеки у полі Програма/документ з випадним списком обрати my_school.odb.
Натиснувши кнопку Нова бібліотека, у вікні діалогу Нова бібліотека ввести латиницею назву PR28, після чого натиснути кнопку Гаразд.
Cтворити модуль Intro у бібліотеці PR28 для збереження створених у майбутньому макросів. Для цього вибрати вкладку Модулі й бібліотеку PR28, після чого натиснути кнопку New…(Новий). Зауважимо, що під час створення нової бібліотеки у ній буде автоматично створено порожні новий модуль Module1 і макрос Main.
У вікні діалогу Новий модуль ввести латиницею назву модуля Intro, після чого натиснути кнопку Гаразд.
У вікні Керування макросами LibreOffice натиснути кнопку Редагувати, щоб відкрити вікно з інтегрованим середовищем розробки LibreOffice Basic.
Створення, налаштування й запуск на виконання макросів здійснюють у цьому середовищі, поданому на малюнку.
У полі Каталог об'єктів можна бачити бібліотеку Standard, яку було автоматично створено під час переходу до режиму редагування. Для того, щоб розпочати роботу з цим середовищем, достатньо знати призначення й розташування таких кнопок:
Виконати макрос;
Вибрати макрос;
Вибрати модуль;
Зберегти.
Про призначення інших кнопок можна дізнатися, навівши вказівник миші на відповідну кнопку і прочитати інформацію у підказці, що спливе.
Змінити код макросу Main згідно з поданим зразком.
Зберегти зроблені зміни (клацнути Зберегти) і виконати макрос (клацнути по кнопці Виконати макрос або натиснути клавішу F5). З'явиться вікно, у якому буде відображено текст, записаний у лапках після оператора print.
Виставити нумерацію рядків у тексті програми вказівкою меню Перегляд / Line numbers. Для зручності пояснення роботи макросів набудемо посилатися на номери рядків.
Створити макрос S для обчислення площі прямокутника з довжинами сторін 5 см і 6 см — див. рядки 9 – 15 на малюнку нижче.
Пояснимо код макросу. Згідно з рядками 11 і 12 змінним А і В надають величини відповідно 5 і 6. Згідно з рядком 13 функція MsgBox виводить символьний рядок, який містить добуток величин А і В, у вікно діалогу.
Після цього модуль міститиме два макроси. Для запуску макросу на виконання потрібно помістити вказівник миші будь-де у межах потрібного макросу і виконати команду запуску. Альтернативно можна клацнути по кнопці Вибрати макрос на панелі інструментів інтегрованого середовища розробки і, вибравши потрібний макрос, клацнути по кнопці Виконати макрос.
Пересвідчитися, що результатом виконання макросу S буде таке вікно.
Створити новий модуль Arithmetic і в ньому макрос AverageTwoNumbers для знаходження середнього арифметичного двох цілих чисел (клацнути по кнопці кнопці Вибрати модуль, потім — по New, ввести назву Arithmetic і клацнути по кнопці Редагувати і набрати код, як подано на малюнку.
Тут у рядку 2 записано опцію на обов’язковий опис змінних у модулі. Самі змінні описано в рядках 6 і 7:
зміннi A й B — як змінну цілого типу;
змінну AvrAB, у якій має бути записано результат обчислення — як змінну дійсного типу, бо результатом усереднення цілих чисел різної парності буде дробове число.
Запустити макрос AverageTwoNumbers на виконання і переконатися у правильності його виконання,
після чого натиснути кнопку Гаразд.
Замінити тип double на integer і виконати макрос AverageTwoNumbers з різними величинами А: 5, 6, 7. Прослідкувати, що відбувається, якщо нецілий результат записувати у змінну цілого типу.
Примітка. Описувати змінні можна і за допомогою суфіксів. Наприклад, рядки 6 і 7 можна було б записати одним рядком таким чином:
Dim A%, B%, AvrAB#
Така форма запису дозволяє скоротити час набору змінних. Але перелічити кілька змінних одного типу простіше, застосовуючи оператор as.
У модулі Arithmetic створити макрос F_a для обчислення величини такої функції:
Запишемо код цього макросу:
Sub F_a Dim A, F As Double A = CDbl(InputBox("Введіть число")) F = Sqr(2 * A + Sin(Abs(3 * A))) / 3.56 MsgBox (F) End Sub
У цьому макросі для надання величини змінній А застосовано функцію InputBox, яка передає введений у діалоговому вікні рядок типу string вказаній змінній. Також застосовано функцію CDbl, яка примусово перетворює тип результату виразу на тип Double. Таке явне перетворення потрібно зробити, бо функція InputBox повертає величину типу string. Для конвертації у інші типи даних використовують функції: CByte, CCur, CDec, CInt, CLng, CDbl, CSng. Наступним малюнком показано роботу фукції InputBox (буде введенно рядок тексту "5,9" після клацання по кнопці Гаразд).
Примітка. У тексті програми дійсні величини записують з розділювачем «крапка», а під час введення з клавіатури — «кома». Так роблять при використанні комп’ютерів, налаштованих для регіонів, у яких у числах використовуються розділювач «кома» (наприклад, Україна, Росія). Для регіонів, де визначено розділювач «крапка» (наприклад, Великобританія, США), і у вікні діалогу, і в тексті програми використовують розділювач «крапка».
Дослідіть, яку величину повертає функція InputBox після клацання по кнопці Скасувати.
Створити макрос, який повертає величину True, якщо кожне з двох чисел А і В, заданих з клавіатури, перевищує 100. Для цього:
cтворити новий модуль Logic (клацнути по кнопці Вибрати модуль, а потім натиснути кнопку New, ввести назву Logic і клацнути по кнопці Редагувати);
у модулі Logic створити макрос АВ100 і ввести текст макросу:
Option Explicit Sub AB100 Dim A, B As Integer Dim Res As Boolean A = CInt(InputBox("Введіть А")) B = CInt(InputBox("Введіть B")) Res = A > 100 And B > 100 MsgBox "Результат: " & Res End Sub
Перед виконанням наступних 3 завдань бажано розібратися у двох прикладах використання умовного оператору галуження, поданих нижче до наступної горизонтальної лінії.
Знаходження найбільшого з двох різних цілих чисел, введених з клавіатури, можна здійснити за допомогою такого макросу.
Sub MaxAB Dim A, B, Max As Integer A = CInt(InputBox("Введіть А")) B = CInt(InputBox("Введіть B")) If A > B Then Max = A Else Max = B End If MsgBox "Найбільше число " & Max End Sub
Результат роботи макросу для величин А = 2 і В = 3 показано на рисунку.
Для двоцифрового натурального числа, введеного з клавіатури, визначення більшої цифри можна здійснити за допомогою такого макросу.
Sub MaxN Dim N, D1, D2 As Integer N = CInt(InputBox("Введіть число")) 'Виділяємо цифри у числі 'Перша цифра D1 = N \ 10 'Друга цифра D2 = N Mod 10 If D1 > D2 Then MsgBox "Перша більша" ElseIf D2 > D1 Then MsgBox "Друга більша" Else MsgBox "Цифри однакові" End If End Sub
У модулі Logic створити макрос Neg для розв'язання такої задачі: для трьох дійсних чисел, введених з клавіатури, визначити кількість від’ємних.
У модулі Logic створити макрос Zero для розв'язання такої задачі: для цілого числа, введеного з клавіатури, визначити, чи закінчується воно цифрою 0.
У модулі Logic створити макрос Sum4 для обчислення і повідомлення суми двох найбільших цифр 4-цифрового натурального числа, введеного з клавіатури.
Перед виконанням наступних 2 завдань бажано ознайомитися з прикладом макросу, який виводить на екран назву дня тижня залежно від введеного його номеру (1 — понеділок, 2 — вівторок і т.і.).
Sub NameOfWeek Dim I$ I = InputBox("Введіть номер дня тижня") Select Case I Case "1" MsgBox "Понеділок" Case "2" MsgBox "Вівторок" Case "3" MsgBox "Середа" Case "4" MsgBox "Четвер" Case "5" MsgBox "П'ятниця" Case "6" MsgBox "Субота" Case "7" MsgBox "Неділя" Case Else MsgBox "Такого дня немає!" End Select End Sub
У модулі Logic створити макрос Month, який виводить на екран назву місяця за введеним його номером (1 — січень, 2 — лютий і т.д.).
У модулі Logic створити макрос Season, який виводить на екран назву пори року за введеним номером місяця (12, 1, 2 — зима тощо).
Перед виконанням наступного завдання бажано ознайомитися з такими двома прикладами. Спочатку подамо текст макросу виведення таблиці множення на 7.
Sub TimesTable7 Dim I%, S$ For I = 1 To 9 S = S & I & " X 7 = " & I * 7 & Chr(10) Next MsgBox S End Sub
Тут оператор Chr(10) вставляє ознаку кінця рядка (символ перенесення вказівника на наступний рядок). Результат виконання макросу такий.
Подамо текст макросу виведення таблиці величин функції f (x) = x2 – 5 при x ∈ [2; 2,5] з кроком 0,1.
Sub Fx Dim X, F As Double Dim S$ For X = 2 To 2.51 Step 0.1 F = X ^ 2 - 5 S = S & "F(" & X & ") = " & F & Chr(10) Next MsgBox S End Sub
Результат виконання цього макросу такий.
Завдання для допитливих. До чого призведе заміна числа 2,51 на 2,5?
Відповідь. Заміна числа 2,51 на 2,5 призведе до відсутності у результатах виведення рядка для F(2,5).
Пояснення. Дійсні числа в комп’ютері подано у двійковому коді. А саме добутком скінченого двійкового дробу (зі знаком) на цілий степінь 2. Не всі скінчені десяткові дроби є скінченими двійковими дробами. Для запису у певному типі даних їх округлюють до найближчого двійкового дробу. Таким чином виникає похибка, яку потрібно обов’язково враховувати під час обчислень з дійсними числами.
Покажемо, що крок 0,1 є нескінченим періодичним двійковим дробом.
0,1 = 10– 1 = 2– 1 ∙ 5– 1 = 2– 1 ∙ (4 + 1)– 1 = 2– 1 ∙ 4– 1 ∙ (1 + 1/4)– 1 = 2– 3 ∙ (1 + 1/4)– 1.
В отриманому добутку останній множник подамо нескінченою сумою згідно з формулою для суми всіх членів нескінченої спадної геометричної прогресії з початковим членом 1 і знаменником прогресії –1/4. Отримаємо таке:
0,1 = 2– 3 ∙ (1 – 1/4 + 1/42 – 1/43 + 1/44 – 1/45 + 1/46 – 1/47 + …) =
0,1
= 2– 3 ∙ (3/4 + 3/43 + 3/45 + 3/47 + …) =
0,1 =
0,0012 ∙ (0,112 + 0,0000112 + 0,00000000112 + 0,000000000000112 + …) =
0,1 =
0,0012 ∙ 0,1100110011001100…2 = 0,000(1100)2,
що й потрібно було довести. Тут в останніх двох рядках індекс праворуч знизу «2» вказує на двійковий запис. Зазвичай для десяткового запису аналогічне позначення «10» не записують. В останньому записі круглими дужками виділено основний період — найкоротшу послідовність цифр, які нескінченно повторюються в записі, починаючи з певного місця, за умови, що немає таких повторень, що починаються раніше.
Зауважимо: при невід'ємному цілому n округлення числа 0,1 до двійкового запису з (3 + 4n) чи (4 + 4n) знаками після (двійкової) коми призводить до наближення з надвишком, в усіх інших випадках — до наближення з недостачею. З 64 бітів (8 байтів), відведених на зберігання змінної типу double, 1 біт призначено на знак числа, 1 біт — на знак степеня 2, решту — на модулі запису числа з фіксованою двійковою точкою та множника — цілого степеня двійки. Допитливі й наполегливі зі знанням англійської мови можуть відшукати опис розподілу бітів, на основі якого можна дійти висновку щодо того, яке наближення 0,1 отримаємо — з надвишком чи недостачею. Але не знаючи цього розподілу, можна дослідним шляхом пересвідчитися у наближенні з надвишком, запустивши на виконання такий код:
Sub Experiment Dim Y As Double Y = (2.+0.1+0.1+0.1+0.1+0.1)-2.5 MsgBox Y End Sub
і отримавши таку відповідь.
Таким чином, збільшивши 6 разів лічильник X, отримаємо не 2,5, а більше число. Буде перевищено кінцеву величину лічильника, що призведе до виходу з циклу. Тому для включення в обчислення граничної величини 2,5 потрібно врахувати похибку округлення і встановити кінцеву величину лічильника у межах з 2,5 до 2,6. Наприклад, 2,51.
Як бачимо, операції з дійсними числами не завжди призводять до результатів, очевидних з точки зору чистої математики. Про точну реалізацію й стандарти застосувань можна прочитати у книзі Девида Голдберга «What Every Computer Scientist Should Know About Floating-Point Arithmetic».
У модулі Logic створити макрос Cube, що виводить таблицю значень функції f (x) = x3 +1 при x ∈ [–1,5; –0,5] з кроком 0,25.
Перед виконанням наступних 2 завдань бажано ознайомитися з такими двома прикладами. Спочатку подамо текст макросу знаходження найбільшого спільного дільника двох натуральних чисел з використанням алгоритму Евкліда, реалізованого відніманням.
Sub Evklid Dim A, B As Integer, S$ A = CInt(InputBox("Введіть перше натуральне число")) B = CInt(InputBox("Введіть друге натуральне число")) S = "НСД(" & A & "," & B & ") = " Do While A <> B If A > B Then A = A - B Else B = B - A End If Loop MsgBox S & A End Sub
Результат виконання макросу Evklid для чисел 32 і 24 такий.
Подамо текст макросу виведення на екран у зворотному порядку цифр натурального числа, введеного з клавіатури.
Sub DecompNum Dim N As Long, S$ N = CLng(InputBox("Введіть натуральне число")) Do Until N \ 10 = 0 S = S & N Mod 10 & " " N = N \ 10 Loop MsgBox S & N End Sub
Результат виконання макросу DecompNum для числа 123456 такий.
У модулі Logic створити макрос Many для визначення кількості цифр цілого числа, введеного з клавіатури.
У модулі Logic створити макрос MaxС для визначення найбільшої цифри натурального числа, ввведеного з клавіатури.
Всі наступні дії стосуються вироблення навичок щодо налаштування макросів.
Створити модуль Debug і в ньому макрос Evklid, який раніше було розглянуто як приклад.
Увімкнути відображення номерів рядків вказівкою меню Перегляд / Line numbers.
Поставити вказівник у 7-му рядку й натиснути кнопку Точка останова.
Додати в область вікна Інспектора три змінні для перегляду: A, B, S. Для цього розташувате вказівник у 4-й рядок і послідовно виконати такі дії тричі (для кожної змінної): розташувати вказівник біля назви змінної і клацнути по кнопці Увімкнути інспектора.
Переконатися, що у вікні Інспектора долучено для перегляду усі три потрібні змінні. Якщо помилково долучено не ту змінну, то у вікні області Інспектора вибрати її і клацнути по кнопці Прибрати контрольне значення.
Таким чином, завершено лише підготовку до налаштування. Далі потрібно запустити макрос на виконання і простежити за поведінкою змінних у покроковому режимі виконання програми.
Запустіть макрос на виконання, натиснувши кнопку Виконати макрос.
Введіть числа 234 і 567.
На 7-му рядку виконання макросу призупиниться, бо там встановлена точка зупинки. Тоді навести вказівник миші на змінну A і затримати його над нею на деякий час. Переконатися, що у вікні, що спливе, відображено саме те число, яке було введене. Повторіть це саме для змінної B. Перевірте, чи такий самий результат маєте у вікні Інспектора.
Клацаючи по кнопці Крок із заходом або натискаючи клавішу F8, проконтролювати проходи рядками 9—10—14 і 9—12—14, а також зміну величин змінних у вікні Інспектора.
Клацнути по кнопці Виконати макрос або натиснути клавішу F5 для завершення виконання макросу в автоматичному режимі.
Перед виконанням завдань щодо опрацювання таблиці бази даних бажано ознайомитися з такими двома прикладами. Виконати завдання можна і потрібно редагуванням наданих прикладів кодів.
Другий приклад є аналогом частини домашнього завдання. Ознайомлення з ним можна здійснити у ході виконання цього домашнього завдання.
До виконання макросів потрібно обов'язково переконатися у тому, що базу даних my_school.odb зареєстровано. Для цього використати вказівку меню Засоби / Параметри / Бази даних і у полі Зареєстровані бази даних вікна діалогу Параметри - LibreOffice - … переконатися у наявності база є у переліку. Інакше натиснути кнопку Створити і зареєструвати базу даних.
Подамо текст макросу, який звертається до таблиці Учні бази даних my_school.odb, що містить записи про результати тестування учнів з предметів математики й інформатики, виводить на екран кількість учнів, які здали тестування хоча б з одного предмету менше ніж на 9, їхні імена й прізвища.
Sub LowMarks Dim DatabaseContext Dim DB Dim Conn Dim Stmt Dim Result Dim strSQL As String Dim List as String Dim iMarks as integer DatabaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext") DB = DatabaseContext.getByName("my_school") Conn = DB.getConnection("", "") Stmt = Conn.createStatement() strSQL = "SELECT *FROM [Учні]" Result = Stmt.executeQuery(strSQL) List = "" iMarks = 0 While Result.Next() If Result.getInt(4) <= 8 OR Result.getInt(5) <= 8 Then List = List & Result.getString(2) & " " & Result.getString(3) & Chr(10) iMarks = iMarks + 1 EndIf Wend MsgBox "Кількість учнів: " & iMarks MsgBox "Учні: " & Chr(10) & List & Chr(10) Conn.close() End SubТут
Нехай таблиця Учні має такий вигляд.
Тоді результат виконання макросу такий.
Подамо текст макросу, який долучає до таблиці Список бази даних my_school.odb записи з даними про учнів, які здали тестування менш ніж на 9 з будь-якого предмету. До виконання цього макросу потрібно створити таблицю Список з такими трьома полями:
Sub NewTableLowMarks Dim DatabaseContext Dim DB Dim Conn Dim Stmt Dim Result Dim Updt Dim strSQL As String Dim I as Integer DatabaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext") DB = DatabaseContext.getByName("my_school") Conn = DB.getConnection("", "") Stmt = Conn.createStatement() strSQL = "SELECT *FROM [Учні]" Result = Stmt.executeQuery(strSQL) strSQL = "INSERT INTO ""Список"" VALUES(?,?,?)" Updt = Conn.prepareStatement(strSql) I = 1 While Result.Next() If Result.getInt(4) <= 8 OR Result.getInt(5) <= 8 Then Updt.setInt(1, I) Updt.setString(2, Result.getString(2)) Updt.setString(3, Result.getString(3)) Updt.executeUpdate() I = I + 1 EndIf Wend Conn.close() End SubТут
Updt — об’єкт, який містить підготовлену до виконання вказівку SQL;
I — номер наступного запису таблиці;
setInt(номер поля, величина) — метод встановлення величини цілого типу в заданному полі поточного запису;
setString(номер поля, значення) – метод встановлення величини текстового типу в заданному полі поточного запису.
У результаті виконання цього макросу при поданому прикладі таблиці Учні таблиця Список набуде такого вигляду.
Створити модуль DB і у ньому макрос HighMarks. Цей макрос має:
звертатися до таблиці Учні бази даних my_school.odb, що містить записи про результати тестування учнів з предметів математики й інформатики;
виводити на екран кількість учнів, які здали тестування з обох предметів на відмінно (тобто отримали 10, 11 чи 12 балів), їхні імена й прізвища.
6. Підбиття підсумків уроку
Виставлення оцінок.
7. Домашнє завдання
Повторити навчальний матеріал уроку. Доробити незавершені завдання. Виконати додатково такі завдання.
У модулі Arithmetic створити макрос для обчислення величини такої функції:
|
У модулі Arithmetic створити макрос Dist для обчислення відстані між двома точками, заданими прямокутними координатами на площині.
У модулі Logic створити макрос АВ_even, який повертає величину True тоді й лише тоді, коли лише одне з цілих чисел А і В, заданих з клавіатури, парне.
У модулі Logic створити макрос АВ_pos, який повертає величину True тоді й лише тоді, коли хоча б одне з цілих чисел А і В, заданих з клавіатури, додатне.
Визначити результат обчислення таких виразів:
а) 5 > 2 AND -4 * -2 = 8;
б) -3 ^ 2 + 2 * -4 / 2
і записати результат у зошит.
У модулі Logic створити макрос Divider для розв'язання такої задачі: для двох цілих чисел, введених з клавіатури, визначити, чи є перше число дільником другого.
У модулі Logic створити макрос Max для розв'язання такої задачі: для натурального трицифрового числа, введеного з клавіатури, визначити, яка по порядку його цифра найбільша.
У модулі Logic створити макрос Function для обчислення величини фукції f (x) для дійсного числа, x введеного з клавіатури, якщо:
f (x) = –3x при x ≤ 0;
f (x) = 0 при 0 < x ≤ 2;
f (x) = 2 при 2 < x.
У модулі Logic створити макрос Day, який виводить на екран кількість днів у місяці за введеним його номером.
У модулі Logic створити макрос Harmony, що виводить дійсне число — суму 1 + 1/2 + 1/3 + 1/4 + … + 1/n при натуральному n, заданому з клавіатури.
У модулі Logic створити макрос Last для визначення, скільки разів у натуральному числі, ввведеному з клавіатури, зустрічається його остання цифра.
У модулі Logic створити макрос MaxD для визначення відмінного від 1 найбільшого натурального дільника натурального числа, введеного з клавіатури.
У модулі DB створити макрос HighMarksTable, який додає до таблиці Список бази даних my_school записи з даними про учнів, які здали тестування з інформатики на відмінно.
Текст упорядкував Киричков Ярослав Васильович, вчитель інформатики Технічного ліцею НТУУ «КПІ» Солом'янського району міста Києва під час виконання випускної роботи на курсах підвищення кваліфікації з 15.10.2012 р. по 21.12.2012 р.
При створенні розробки використано такі джерела:
Roberto C. Benitez. Database Programming. OpenOffice.org Base & Basic. — 2008. ISBN 978–0–557–00758–5
Book Code & Other Resources
http://www.libreoffice.org
OpenOffice.org 3.2 BASIC Guide
https://wiki.documentfoundation.org/Macros
OpenOffice.org Macro Information by Andrew Pitonyak
Andrew D. Pitonyak. OpenOffice.org Macros Explained. Third Edition. 2012
http://www.openoffice.org
http://wiki.openoffice.org/wiki
StarOfficeTM 7.0 Office Suite. Basic Programmer's Guide
David Goldberg. What Every Computer Scientist Should Know About Floating-Point Arithmetic. — Association for Computing Machinery, Inc. — 1991. — 264 p.