Розробка уроку — практичної роботи

Тема: створення макросів.

Мета: створити уявлення про використання макросів і мову LibreOffice Basic, навчити створюювати макроси за зразком і запускати їх на виконання в інтегрованому середовищі розробки LibreOffice Basic.

Обладнання: комп’ютери зі встановленими ОС та LibreOffice Base, (дана) інструкція, файл my_school.odb.

Структура уроку
  1. Організаційний момент.
  2. Актуалізація опорних знань.
  3. Вивчення нового матеріалу.
  4. Інструктаж з ТБ.
  5. Закріплення вивченого матеріалу.
  6. Підбиття підсумків уроку.
  7. Домашнє завдання.

Хід уроку

1. Організаційний момент
Вітання з класом. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання.

2. Актуалізація опорних знань

  1. Назвіть елементи вікна програми LibreOffice Base.


  2. Дати означення алгоритму.
  3. Перелічити властивості алгоритму.
  4. Перелічити базові структури алгоритмів.
  5. Описати поняття об’єкту та його властивостей.

3. Вивчення нового матеріалу

Макрос — це спеціальна програма, призначена для виконання всередині середовища пакета офісних програм. Наприклад, LibreOffice. Макроси зберігають у модулях (Modules), які, в свою чергу, зберігають у бібліотеках (Libraries). А бібліотеки можна зберігати і в самому документі, і у спеціальному шаблоні.

LibreOffice надає інтерфейс прикладного програмування (API), який дозволяє контролювати компоненти LibreOffice з використанням мов програмування Java, Python, C++, Basic, OLE і CLI за допомогою комплекту засобів розробки (SDK) LibreOffice. Завдяки цьому макроси можуть стати потужним інструментом для автоматизації задач у руках досвідченого розробника. В той самий час потрібно пам’ятати про безпеку під час їх використання. Адже вони потенційно спроможні нанести шкоду. Наприклад, видалити файл з цінною інформацією. Також існують певні різновиди вірусів у вигляді макросів.

У пакеті LibreOffice існує система захисту від неконтрольованого запуску макросів. Ця система в себе включає підписування макросів і реєстрацію довірених джерел місць розташування файлів.

Рівні безпеки використання макросів такі:

  1. Низький — не рекомендовано використовувати, бо макроси буде запущено на виконання без будь-яких попереджень.

  2. Середнійавтоматичний запуск будь-яких макросів з довірених джерел і потреба підтвердження для запуску макросів із джерел, які попередньо не оголошено довіреними.

  3. Високийдозволено запуск будь-яких макросів із довірених джерел і заборонено запуск усіх інших.

  4. Дуже високийдозволено запуск лише підписаних макросів із довірених джерел.

Користувач може встановити рівень безпеки, використавши вказівку меню Засоби / Параметри / Безпека для виклику вікна діалогу Параметри - 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.

ТипДіапазон допустимих значеньІніціалізаціяРозмір
(байт)
Суфікс
BooleanTrue, FalseFalse1
IntegerЦілі числа від –32 768 до 32 76702%
Long Цілі числа від –2 147 483 648 до 2 147 483 64704&
Single Дійсні числа з [–3.402823 ∙ 1038; 3.402823 ∙ 1038]0.04!
Double Дійсні числа з [–1.79769313486232 ∙ 10308; 1.79769313486232 ∙ 103080.08 #
StringТекстовий рядок від 0 до 65536 символів“”1 на 1
символ
$
CurrencyЧотири знаки після коми0.00008@
DateДата і час00:00:008

Крім вказаних типів також використовують типи 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

Тут:

Цикли
У LibreOffice Basic організацію повторень реалізовано великою кількістю варіантів. Тут ми розглянемо лише оператори For і Do.

For лічильник = початкова величина To кінцева величина [Step крок]
блок вказівок
Next

Це форма організації повторення, якщо наперед відома кількість повторень для блоку вказівок. Тут лічильник — змінна числового типу, початкова величина, кінцева величина, крок — вирази з числовим результатом.

Виконання такого оператора For починається з надання лічильнику початкової величини. Далі буде виконано блок вказівок. Потім лічильник буде збільшено на величину кроку (якщо її не вказано, вона дорівнює 1). І знову буде виконано блок вказівок. Такі операції виконують до тих пір, поки лічильник не досягне кінцевої величини. У циклі можна застосувати вказівку примусового виходу з циклу Exit For.

Розглянемо 4 варіанти реалізації повторення блоку вказівок за певних умов. Заважимо: для уникнення нескінченого виконання циклу («зациклення»), блок вказівок має містити вказівки, які впливають на справдження умови і на можливість завершення циклу.

  1. Поки справджується умова, виконують блок вказівок. Перевірку умови здійснюють до першого виконання блоку вказівок.

    Do While умова
    блок вказівок

    Loop

  2. Поки справджується умова, виконують блок вказівок, але, на відміну від попереднього варіанту, перевірку умови здійснюють лише після першого виконання блоку вказівок. Таким чином, щонайменше один раз блок вказівок буде виконано.

    Do
    блок вказівок
    Loop While умова

  3. Блок вказівок виконують, поки умова хибна (має величину False). Тобто реалізовано принцип: «досягли бажаного (умова стала істинною) — завершили роботу».

    Do Until умова
    блок вказівок

    Loop

  4. Блок вказівок виконують, поки умова хибна, але її перевірку здійснюють після виконання блоку вказівок (на відміну від попереднього випадку). Таким чином, щонайменше один раз блок вказівок буде виконано.

    Do
    блок вказівок
    Loop Until умова

У всіх цих конструкціях циклу діє оператор примусового виходу з циклу Exit Do.

Інструменти налаштування макросів інтегрованого середовища розробки LibreOffice Basic такі:

На наступному малюнку показано основні елементи вікна інтегрованого середовища розробки, призначені для налаштування.

Тут:
— панель інструментів Макрос;
— вказівник точки зупинки;
— вказівник поточної вказівки;
— підказка (з'являється при наведенні вказівника миші) з відображенням поточної величини змінної;
— область вікна Інспектора.

Найчастіше у процесі налаштування використовують панель інструментів Макрос з такими кнопками:
Компілювати;
Виконати макрос;
Зупинити макрос;
Крок з виходом;
Крок із заходом;
Вихід на верхній рівень;
Точки зупинки;
Керування точками зупинки;
Увімкнути інспектора;
Знайти дужку.

Звертання до баз даних з використанням макросів, записаних мовою Basic

На основі пакету LibreOffice можна створювати рішення для автоматизації задач документообігу й обліку. Для цього розробнику потрібно не лише знати мову Basic, а й добре розуміти структуру даних самого пакету LibreOffice. Ця структура, на відміну від мови Basic, має відмінну від Microsoft Office реалізацію і несумісна з нею.

Під час розробки такої структури даних за основу була взято парадигму про взаємодію між різними об’єктами, платформами й мовами програмування з використанням єдиного інтерфейсу. У результаті з’явилася платформо-незалежна технологія Universal Network Objects (UNO), яка і стала основою OpenOffice і LibreOffice.

Для отримання доступу з макросу до методів, властивостей і інтерфейсів API LibreOffice ключовим є створення сервісу UNO.

Подамо приклад алгоритму роботи з базою даних.

  1. Створити сервіс UNO для доступу до вмісту бази даних:
    DatabaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")

  2. Вказати назву попередньо зареєстрованої бази даних:
    DB = DatabaseContext.getByName("my_school")

  3. Встановити під'єднання до бази даних:
    Conn = DB.getConnection("", "")

  4. Задати вираз для наступного звертання до бази даних:
    Stmt = Conn.createStatement()

  5. Виконати звертання до бази даних і отримати об’єкт з результатами опрацювання заданого звертання для подальшої опрацювання:
    Result = Stmt.executeQuery(strSQL)

  6. Закрити під'єднання:
    Conn.close()

4. Інструктаж з ТБ

5. Закріплення вивченого матеріалу

Примітка. Після створення кожного макросу результат (всю базу даних) записуватити з назвою Ваше прізвище у теку, вказану вчителем.

  1. У середовищі LibreOffice Basic відкрийте наявну базу даних my_school.odb.

  2. Виберіть середній рівень безпеки використання макросів.

    Примітка. Домовимося у цій практичній роботі усі макроси зберігати у поточному документі my_school.odb у бібліотеці PR28.

  3. Для створення бібліотеки PR28 використати вказівку меню Засоби / Макроси / Керування макросами / LibreOffice Basic… або натиснути комбінацію клавіш Alt + F11. У вікні ділогу Макрос LibreOffice Basic натиснути кнопку Organizer (Організатор).

  4. На вкладці Бібліотеки у полі Програма/документ з випадним списком обрати my_school.odb.

  5. Натиснувши кнопку Нова бібліотека, у вікні діалогу Нова бібліотека ввести латиницею назву PR28, після чого натиснути кнопку Гаразд.

  6. Cтворити модуль Intro у бібліотеці PR28 для збереження створених у майбутньому макросів. Для цього вибрати вкладку Модулі й бібліотеку PR28, після чого натиснути кнопку New…(Новий). Зауважимо, що під час створення нової бібліотеки у ній буде автоматично створено порожні новий модуль Module1 і макрос Main.

    У вікні діалогу Новий модуль ввести латиницею назву модуля Intro, після чого натиснути кнопку Гаразд.

    У вікні Керування макросами LibreOffice натиснути кнопку Редагувати, щоб відкрити вікно з інтегрованим середовищем розробки LibreOffice Basic.

  7. Створення, налаштування й запуск на виконання макросів здійснюють у цьому середовищі, поданому на малюнку.

    У полі Каталог об'єктів можна бачити бібліотеку Standard, яку було автоматично створено під час переходу до режиму редагування. Для того, щоб розпочати роботу з цим середовищем, достатньо знати призначення й розташування таких кнопок:

    Виконати макрос;
    Вибрати макрос;
    Вибрати модуль;
    Зберегти.

    Про призначення інших кнопок можна дізнатися, навівши вказівник миші на відповідну кнопку і прочитати інформацію у підказці, що спливе.

  8. Змінити код макросу Main згідно з поданим зразком.

  9. Зберегти зроблені зміни (клацнути Зберегти) і виконати макрос (клацнути по кнопці Виконати макрос або натиснути клавішу F5). З'явиться вікно, у якому буде відображено текст, записаний у лапках після оператора print.

  10. Виставити нумерацію рядків у тексті програми вказівкою меню Перегляд / Line numbers. Для зручності пояснення роботи макросів набудемо посилатися на номери рядків.

  11. Створити макрос S для обчислення площі прямокутника з довжинами сторін 5 см і 6 см — див. рядки 9 – 15 на малюнку нижче.

    Пояснимо код макросу. Згідно з рядками 11 і 12 змінним А і В надають величини відповідно 5 і 6. Згідно з рядком 13 функція MsgBox виводить символьний рядок, який містить добуток величин А і В, у вікно діалогу.

    Після цього модуль міститиме два макроси. Для запуску макросу на виконання потрібно помістити вказівник миші будь-де у межах потрібного макросу і виконати команду запуску. Альтернативно можна клацнути по кнопці Вибрати макрос на панелі інструментів інтегрованого середовища розробки і, вибравши потрібний макрос, клацнути по кнопці Виконати макрос.

  12. Пересвідчитися, що результатом виконання макросу S буде таке вікно.

  13. Створити новий модуль Arithmetic і в ньому макрос AverageTwoNumbers для знаходження середнього арифметичного двох цілих чисел (клацнути по кнопці кнопці Вибрати модуль, потім — по New, ввести назву Arithmetic і клацнути по кнопці Редагувати і набрати код, як подано на малюнку.

    Тут у рядку 2 записано опцію на обов’язковий опис змінних у модулі. Самі змінні описано в рядках 6 і 7:

    • зміннi A й B — як змінну цілого типу;

    • змінну AvrAB, у якій має бути записано результат обчислення — як змінну дійсного типу, бо результатом усереднення цілих чисел різної парності буде дробове число.

  14. Запустити макрос AverageTwoNumbers на виконання і переконатися у правильності його виконання,

    після чого натиснути кнопку Гаразд.

  15. Замінити тип double на integer і виконати макрос AverageTwoNumbers з різними величинами А: 5, 6, 7. Прослідкувати, що відбувається, якщо нецілий результат записувати у змінну цілого типу.

    Примітка. Описувати змінні можна і за допомогою суфіксів. Наприклад, рядки 6 і 7 можна було б записати одним рядком таким чином:

    Dim A%, B%, AvrAB#

    Така форма запису дозволяє скоротити час набору змінних. Але перелічити кілька змінних одного типу простіше, застосовуючи оператор as.

  16. У модулі Arithmetic створити макрос F_a для обчислення величини такої функції:

    f (a) = (2a + sin |3a|)1/2 : 3,56.

    Запишемо код цього макросу:

    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" після клацання по кнопці Гаразд).

    Примітка. У тексті програми дійсні величини записують з розділювачем «крапка», а під час введення з клавіатури — «кома». Так роблять при використанні комп’ютерів, налаштованих для регіонів, у яких у числах використовуються розділювач «кома» (наприклад, Україна, Росія). Для регіонів, де визначено розділювач «крапка» (наприклад, Великобританія, США), і у вікні діалогу, і в тексті програми використовують розділювач «крапка».

  17. Дослідіть, яку величину повертає функція InputBox після клацання по кнопці Скасувати.

  18. Створити макрос, який повертає величину 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
    • запустити макрос АВ100 на виконання 4 рази з такими наборами величин А і В:

      1) А =110 , В = 120;
      2) А =100 , В = 120;
      3) А =120 , В = 100;
      4) А =100 , В = 100,

      щоб пересвідчитися, що величину True буде повернуто лише у випадку 1.

    Перед виконанням наступних 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
    

  19. У модулі Logic створити макрос Neg для розв'язання такої задачі: для трьох дійсних чисел, введених з клавіатури, визначити кількість від’ємних.

  20. У модулі Logic створити макрос Zero для розв'язання такої задачі: для цілого числа, введеного з клавіатури, визначити, чи закінчується воно цифрою 0.

  21. У модулі 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

  22. У модулі Logic створити макрос Month, який виводить на екран назву місяця за введеним його номером (1 — січень, 2 — лютий і т.д.).

  23. У модулі 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».


  24. У модулі 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 такий.


  25. У модулі Logic створити макрос Many для визначення кількості цифр цілого числа, введеного з клавіатури.

  26. У модулі Logic створити макрос MaxС для визначення найбільшої цифри натурального числа, ввведеного з клавіатури.


    Всі наступні дії стосуються вироблення навичок щодо налаштування макросів.

  27. Створити модуль Debug і в ньому макрос Evklid, який раніше було розглянуто як приклад.

  28. Увімкнути відображення номерів рядків вказівкою меню Перегляд / Line numbers.

  29. Поставити вказівник у 7-му рядку й натиснути кнопку Точка останова.

  30. Додати в область вікна Інспектора три змінні для перегляду: A, B, S. Для цього розташувате вказівник у 4-й рядок і послідовно виконати такі дії тричі (для кожної змінної): розташувати вказівник біля назви змінної і клацнути по кнопці Увімкнути інспектора.

  31. Переконатися, що у вікні Інспектора долучено для перегляду усі три потрібні змінні. Якщо помилково долучено не ту змінну, то у вікні області Інспектора вибрати її і клацнути по кнопці Прибрати контрольне значення.


    Таким чином, завершено лише підготовку до налаштування. Далі потрібно запустити макрос на виконання і простежити за поведінкою змінних у покроковому режимі виконання програми.

  32. Запустіть макрос на виконання, натиснувши кнопку Виконати макрос.

  33. Введіть числа 234 і 567.

  34. На 7-му рядку виконання макросу призупиниться, бо там встановлена точка зупинки. Тоді навести вказівник миші на змінну A і затримати його над нею на деякий час. Переконатися, що у вікні, що спливе, відображено саме те число, яке було введене. Повторіть це саме для змінної B. Перевірте, чи такий самий результат маєте у вікні Інспектора.

  35. Клацаючи по кнопці Крок із заходом або натискаючи клавішу F8, проконтролювати проходи рядками 9—10—14 і 9—12—14, а також зміну величин змінних у вікні Інспектора.

  36. Клацнути по кнопці Виконати макрос або натиснути клавішу F5 для завершення виконання макросу в автоматичному режимі.


  37. Перед виконанням завдань щодо опрацювання таблиці бази даних бажано ознайомитися з такими двома прикладами. Виконати завдання можна і потрібно редагуванням наданих прикладів кодів.

    Другий приклад є аналогом частини домашнього завдання. Ознайомлення з ним можна здійснити у ході виконання цього домашнього завдання.

    До виконання макросів потрібно обов'язково переконатися у тому, що базу даних 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
    Тут
    • DatabaseContext — контейнер для бази даних;
    • DB — база даних;
    • getByName(назва) — метод пов’язування з вказаною базою даних сервісу DatabaseContext;
    • getConnection — метод встановлення з’єднання з базою даних
      (потрібно вказати ім’я користувача і пароль у разі їх наявності);
    • createStatement() – метод створення нової вказівки для виконання бажаної команди;
    • strSQL – задає команду у вигляді sql-вказівки;
    • Result– джерело з даними, отримане в результаті виконання методів:
      • executeUpdate() – для SQL-вказівок UPDATE, DELETE, INSERT, CREATE, DROP, ALTER, і GRANT;
      • executeQuery() – для SQL-вказівки SELECT;
    • List — рядок із списком учнів;
    • iMarks — змінна, яка містить кількість учнів з оцінками менше 9;
    • Next — перехід до наступного запису об’єкта Result;
    • getString(номер поля) — метод отримання даних із вказаного поля поточного запису.

    Нехай таблиця Учні має такий вигляд.

    Тоді результат виконання макросу такий.

    Подамо текст макросу, який долучає до таблиці Список бази даних my_school.odb записи з даними про учнів, які здали тестування менш ніж на 9 з будь-якого предмету. До виконання цього макросу потрібно створити таблицю Список з такими трьома полями:

    • ID — первинний ключ цілого типу;
    • Прізвище — текстового типу;
    • Ім’я — текстового типу.
    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(номер поля, значення) – метод встановлення величини текстового типу в заданному полі поточного запису.

    У результаті виконання цього макросу при поданому прикладі таблиці Учні таблиця Список набуде такого вигляду.


  38. Створити модуль DB і у ньому макрос HighMarks. Цей макрос має:

    • звертатися до таблиці Учні бази даних my_school.odb, що містить записи про результати тестування учнів з предметів математики й інформатики;

    • виводити на екран кількість учнів, які здали тестування з обох предметів на відмінно (тобто отримали 10, 11 чи 12 балів), їхні імена й прізвища.

6. Підбиття підсумків уроку
Виставлення оцінок.

7. Домашнє завдання
Повторити навчальний матеріал уроку. Доробити незавершені завдання. Виконати додатково такі завдання.

  1. У модулі Arithmetic створити макрос для обчислення величини такої функції:


    y(x) = sin

    3,2 + (1 + x)1/2
    5|x| + 1

  2. У модулі Arithmetic створити макрос Dist для обчислення відстані між двома точками, заданими прямокутними координатами на площині.

  3. У модулі Logic створити макрос АВ_even, який повертає величину True тоді й лише тоді, коли лише одне з цілих чисел А і В, заданих з клавіатури, парне.

  4. У модулі Logic створити макрос АВ_pos, який повертає величину True тоді й лише тоді, коли хоча б одне з цілих чисел А і В, заданих з клавіатури, додатне.

  5. Визначити результат обчислення таких виразів:
    а) 5 > 2 AND -4 * -2 = 8;
    б) -3 ^ 2 + 2 * -4 / 2
    і записати результат у зошит.

  6. У модулі Logic створити макрос Divider для розв'язання такої задачі: для двох цілих чисел, введених з клавіатури, визначити, чи є перше число дільником другого.

  7. У модулі Logic створити макрос Max для розв'язання такої задачі: для натурального трицифрового числа, введеного з клавіатури, визначити, яка по порядку його цифра найбільша.

  8. У модулі Logic створити макрос Function для обчислення величини фукції f (x) для дійсного числа, x введеного з клавіатури, якщо:
    f (x) = –3x при x ≤ 0;
    f (x) = 0      при 0 < x ≤ 2;
    f (x) = 2      при 2 < x.

  9. У модулі Logic створити макрос Day, який виводить на екран кількість днів у місяці за введеним його номером.

  10. У модулі Logic створити макрос Harmony, що виводить дійсне число — суму 1 + 1/2 + 1/3 + 1/4 + … + 1/n при натуральному n, заданому з клавіатури.

  11. У модулі Logic створити макрос Last для визначення, скільки разів у натуральному числі, ввведеному з клавіатури, зустрічається його остання цифра.

  12. У модулі Logic створити макрос MaxD для визначення відмінного від 1 найбільшого натурального дільника натурального числа, введеного з клавіатури.

  13. У модулі DB створити макрос HighMarksTable, який додає до таблиці Список бази даних my_school записи з даними про учнів, які здали тестування з інформатики на відмінно.


Текст упорядкував Киричков Ярослав Васильович, вчитель інформатики Технічного ліцею НТУУ «КПІ» Солом'янського району міста Києва під час виконання випускної роботи на курсах підвищення кваліфікації з 15.10.2012 р. по 21.12.2012 р.


При створенні розробки використано такі джерела:

  1. Roberto C. Benitez. Database Programming. OpenOffice.org Base & Basic. — 2008. ISBN 978–0–557–00758–5

  2. Book Code & Other Resources

  3. http://www.libreoffice.org

  4. OpenOffice.org 3.2 BASIC Guide

  5. https://wiki.documentfoundation.org/Macros

  6. OpenOffice.org Macro Information by Andrew Pitonyak

  7. Andrew D. Pitonyak. OpenOffice.org Macros Explained. Third Edition. 2012

  8. http://www.openoffice.org

  9. http://wiki.openoffice.org/wiki

  10. StarOfficeTM 7.0 Office Suite. Basic Programmer's Guide

  11. David Goldberg. What Every Computer Scientist Should Know About Floating-Point Arithmetic. — Association for Computing Machinery, Inc. — 1991. — 264 p.