Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

VB_VBA

.pdf
Скачиваний:
22
Добавлен:
02.03.2016
Размер:
2.93 Mб
Скачать

150 Програмування мовою Visual Basic/VBA

Перевіримо роботу класу Ratio на прикладі обчислення ви-

 

 

a +

3

2

 

b

 

 

3

 

разу d =

5

 

 

 

, де a і b – раціональні числа.

 

a + 2

b

 

 

 

Public

Sub main()

Dim c

As New Ratio, d As New Ratio

Dim і

As Integer, j As Integer

і= InputBox("Уведіть чисельник") j = InputBox("Уведіть знаменник") a.CreateRational i, j

і= InputBox("Уведіть чисельник") j = InputBox("Уведіть знаменник") b.CreateRational i, j

c.ch = 3 : c.zn = 5 : Set c = a.Plus(c) d.ch = 2 : d.zn = 3 : Set d = b.Mult(d) Set c = c.Minus(d) : Set d = a.Plus(b)

Set d = d.Plus(b) : Set d = c.Divide(d) d.PrintRational

End Sub

8.8. Моделювання динамічних структур даних

Динамічні структури даних (списки, черги, стеки, дерева тощо) відіграють надзвичайно важливу роль у програмуванні. З метою побудови таких структур використовують посилання (вказівники), значеннями яких є адреси розташування у пам’яті інших елементів даних (змінних, масивів, об’єктів тощо). У VB/VBA існують посилання тільки на об’єкти, а тому для емуляції динамічних структур даних використовують модулі класів. Кожен елемент структури є подібним до іншого елемента, отож ці елементи є різними екземплярами класу.

Найпростіше динамічні структури даних створювати за допомогою двох модулів класу: один з них вказує на реальну структуру даних, а другий – на елемент цієї структури. Покажемо це на основі побудови стека, структури даних, у якій елементи даних заносять і видаляють тільки через вершину стека.

8. Класи та об’єкти

151

 

 

Клас StackItem – елементи стека

Option Explicit

Public Value As Variant ' Інформаційне поле

Public Nextltem As Stackltem ' Вказівник на наступний ' елемент стека

Private Sub Class_Initialize()

Set Nextltem = Nothing

End Sub

Private Sub Class_Terminate()

Set Nextltem = Nothing

End Sub

Клас Stack – стек

Option Explicit

' Клас Stack

Dim siTop As Stackltem

Public Function Pop() As Variant

' Отримання значення вершини стека з вилученням

If Not StackEmpty Then

Pop = siTop.Value : Set siTop = siTop.Nextltem

End If

End Function

Public Sub Push(ByVal varText As Variant)

' Додавання нового елемента на вершину стека.

Dim siNewTop As New Stackltem siNewTop.Value = varText

Set siNewTop.Nextltem = siTop : Set siTop = siNewTop

End Sub

Property Get StackTop() As Variant

' Отримання значення вершини стека без вилучення

If StackEmpty Then StackTop = Null

Else

StackTop = siTop.Value

End If

End Property

152 Програмування мовою Visual Basic/VBA

Property Get StackEmpty() As Boolean

StackEmpty=(siTop Is Nothing) ' Перевірка порожності

End Property

Private Sub Class_Initialize()

Set siTop = Nothing

End Sub

Private Sub Class_Terminatе()

Set siTop = Nothing

End Sub

Тестування класу Stack

Option Explicit

Dim stkTest As New Stack

Sub Main()

' Занесення елементів і виведення з вилученням stkTest.Push "Привіт!"

stkTest.Push "Маємо" stkTest.Push "стек" stkTest.Push "у" stkTest.Push "VB!"

Do While Not stkTest.StackEmpty Debug.Print stkTest.Pop()

Loop

'Занесення елементів і виведення без вилучення stkTest.Push 12.3

stkTest.Push 17.5

Debug.Print stkTest.StackTop ' 17,5 Debug.Print stkTest.StackTop ' 17,5

'Виведення елементів з вилученням

Debug.Print stkTest.Pop

' 17,5

Debug.Print stkTest.Pop

'

12.3

Debug.Print stkTest.Pop

'

Порожнє значення

End Sub

8. Класи та об’єкти

153

 

 

8.9. Колекції

Кажучи про об’єкти, зазначимо необхідність уміння працювати не тільки з окремими об’єктами, але й з групами цих об’єктів. Звісно, можна в багатьох випадках використати масив з метою зображення групи об’єктів. Однак для розв’язання багатьох задач необхідні дещо гнучкіші динамічні структури даних, що дають змогу організувати складні зв’язки між елементами таких структур. Приклади таких структур добре відомі. Серед них – списки лінійні та нелінійні, стеки, деки і черги, дерева бінарні і збалансовані. У сучасних мовах програмування деякі з цих структур стали такою ж частиною мови, як і масиви.

Реалізовується така динамічна структура здебільшого як клас-колекція. Найвдалішим прикладом є реалізація самої системи MS Office, яку розглядають як колекцію класів об’єктів. Майже для кожного класу об’єктів існує і клас, що містить колекцію цих об’єктів. Класи-колекції становлять майже половину класів MS Office.

Усі колекції подібні і мають деякий стандартний набір методів, що дає змогу видалити або додати новий елемент у колекцію, отримати елемент з колекції, знаючи його порядковий номер або ключ елемента. Деякі колекції мають специфічні властивості і поведінку, зумовлену специфікою самих елементів, що зберігаються в колекції. Частиною мови VB є клас Collection, який істотно полегшує роботу з динамічними структурами даних у багатьох типових ситуаціях.

Колекція у VB – впорядкована сукупність елементів, власне кажучи, різного типу. Цим колекція відрізняється від масиву, де об’єднано тільки однотипні елементи. Усі елементи проіндексовані, проте деякі можуть мати і ключ, пов’язаний з елементом. Розмір колекції заздалегідь не фіксується і може динамічно змінюватися. Будь-який окремий елемент колекції можна видалити, у цьому випадку не виникає “дір” – елементи перенумеровуються, і неперервність послідовності індексів не порушується. Однак помилку іноді спричинює саме те, що індекс, на відміну від ключа, не є постійною характеристикою елемента і може змінюватися під час роботи з

154

Програмування мовою Visual Basic/VBA

колекцією. Новий елемент можна додати у довільне місце колекції як перед, так і після будь-якого з елементів.

Клас Collection має властивість Count і 3 методи: Add, Item, Remove. Розглянемо їх детальніше.

Властивість Count повертає число елементів колекції. Доступна тільки для читання; тип значення, що повертається, – Long.

Метод Add(іtem, key, before, after) додає елементи до колекції. Перший параметр item є обов’язковим і задає елемент, що додається. Параметр key – не обов’язковий, він задається, коли елементу відповідає ключ. Два останні параметри уточнюють позицію вставки, задають індекс або ключ елемента, перед або після якого додається новий елемент. Можна задати тільки один з них. Якщо не задано жодного, елемент додається в кінець колекції. Усі параметри мають тип Variant.

Метод Remove(key) видаляє елементи колекції. Видаляється елемент із заданим ключем або індексом елемента. Після видалення відбувається перенумерація елементів і зменшується лічильник Count.

Метод Item(key) повертає значення елемента списку із заданим ключем або індексом елемента.

Зверніть увагу на потужність методів класу. Вони дають змогу реалізувати різні класичні динамічні структури. Звичайно ж, напрочуд легко реалізувати звичайний однозв’язний список з можливістю додавання елементів на початку чи наприкінці списку. Проте можна реалізувати і значно потужнішу структуру (словник), яка є пов’язаною сукупністю пар елементів. Перший елемент пари називають ключем, другий – інформаційним полем. Специфічністю словників є те, що, володіючи ключем елемента, можна отримати доступ до інформаційного поля. У класі Collection на ключ не накладається ніяких обмежень – це звичайний рядок. Зауважимо, що існує також альтернативний спосіб прямого доступу до елементів колекції за індексом, в якому ключем вважають порядковий номер елемента в колекції. Отже, колекція поєднує в собі достоїнства списків і масивів.

8. Класи та об’єкти

155

 

 

Наведемо тепер приклад програми, що детальніше продемонструє роботу з колекцією. Наша колекція налічуватиме дані двох типів: цілочисельні і рядки символів. Частина елементів матиме ключ, інша — тільки індекс. Елементи додаватимемо в задану позицію і вилучатимемо.

Sub Main()

' Так оголошуються об'єкти (змінні) типу Collection

Dim MyCollection As New Collection

Dim і As Integer, N As Long

With MyCollection

N =.Count : Debug.Print " Число елементів =", N

'Додавання елементів наприкінці списку

'Елементи мають індекси, але не мають ключа

.Add(2) : .Add(4) : .Add(6)

'Додавання непарних елементів на свої місця.

'before (перед 1-им елементом)

.Add "перший", "first", 1

' first –

ключ

' after (після другого)

' third –

ключ

.Add "третій", "third",, 2

' after (після четвертого)

' fifth –

ключ

.Add "п'ятий", "fifth",, 4

N =.Count

 

6-ти Add", N

Debug.Print "Кількість елементів після

Debug.Print "Елементи колекції:"

 

For і = 1 To MyCollection.Count

 

Debug.Print MyCollection(i)

Next

'Вилучення 4-го і 5-го елементів

.Remove 4 : .Remove" fifth" N =.Count

Debug.Print " Кількість елементів після двох Remove=", N Debug.Print "Елементи колекції:"

'І знов друк колекції, в якій тепер 4 елементи

156

Програмування мовою Visual Basic/VBA

For і = 1 То MyCollection.Count

Debug.Print MyCollection(і)

Next

End With

End Sub

Наведемо тепер результати налагоджувального друку:

Число елементів = О

Число елементів після 6-ти Add = 6

Елементи колекції: перший 2 третій 4 п'ятий 6 Число елементів після двох Remove = 4 Елементи колекції: перший 2 третій 6

1.Дайте означення класу.

2.Дайте означення об’єкта.

3.Що таке посилання на об’єкт?

4.Для чого використовують події класу?

5.Що таке інкапсуляція?

7.З якою метою використовують поля класу?

8.Що таке методи класу?

10.З якою метою використовують ключове слово Public?

11.З якою метою використовують ключове слово Static?

12.З якою метою використовують ключове слово Friend?

13.Дайте означення конструктора і деструктора.

14.Дайте означення властивості.

15.З якою метою використовують процедуру-властивість Let?

16.З якою метою використовують процедуру-властивість Get?

96. ЗЩоякоютакеметоюмодульвикласистовуютор? ь ключове словоамоперевірPrivate?

Запитання для ки

8. Класи та об’єкти

157

 

 

17.Для чого використовують процедуру-властивість Set?

18.Що таке колекція?

Завдання 8.1. Утворивши відповідний клас односпрямованого списку, розв’язати одну з наведених нижче задач:

А) студенти з номерами 1 – 5; Б) студенти з номерами 6 – 10; В) студенти з номерами 11–15.

Додатково кожен студент має запрограмувати ще одне завдання (номер додаткового завдання вибирати відповідно до номера студента у списку студентів підгрупи).

А. Скласти програму, яка містить поточну інформацію про замов-

лення на авіаквитки (пункт призначення, номер рейсу, прізвище та ініціали пасажира, дата вильоту). Про-

грама має забезпечувати: збереження усіх замовлень у вигляді списку; додавання та вилучення замовлень; виведення усіх замовлень на екран.

Додаткове завдання:

1)за номером рейсу і датою вильоту вивести список замовлень

звилученням їх зі списку;

2)упорядкувати список за зростанням дат, а кожну дату додатково впорядкувати за спаданням номерів рейсів;

3)упорядкувати список за спаданням кількості заявок на окремі рейси (для рейсу врахувати усі дати вильоту);

4)для конкретного рейсу вивести список заявок за зростанням дат без їхнього видалення зі списку;

5)упорядкувати список за зростанням номерів рейсів, а кожен

19.Коротко опишіть властивості та методи класу Collection.

Завдання для програмування

158

Програмування мовою Visual Basic/VBA

номер рейсу додатково впорядкувати за спаданням дат.

Б. Скласти програму, яка містить інформацію про анкетування населення. Анкета містить дані про респондента (вік: до 30/від

30 до 40/після 40, стать, освіта: початкова/се-

редня/вища) та відповідь на питання (так/ні). Програма має забезпечувати: збереження усіх анкет у вигляді списку; додавання та видалення анкет; виведення усіх анкет на екран.

Додаткове завдання:

6)встановити кількість мужчин, які мають понад 40 років і вищу освіту, що відповіли “так”;

7)встановити кількість жінок з середньою освітою, що відповіли “ні” і яким менше, ніж 40 років;

8)упорядкувати список за зростанням вікової групи, а для кожної вікової групи додатково впорядкувати його за статтю;

9)встановити кількість жінок, яким виповнилося понад 30 років і які мають початкову освіту та відповіли “так”;

10)встановити кількість мужчин, які мають менше 30-ти років, початкову освіту і відповіли “ні”.

В. Скласти програму, яка містить записи про відправлення поїздів

(станція відправлення, станція призначення, номер поїзда, час відправлення, час прибуття). Про-

грама має забезпечувати: збереження усіх записів у вигляді списку; додавання та видалення записів; виведення усіх записів на екран.

Додаткове завдання:

11)упорядкувати список за кількістю поїздів, які відправляються зі станції у другій половині доби;

12)за станцією призначення вивести дані про всі поїзди, які з неї відправляються;

13)вивести дані про усі поїзди, що перебувають у дорозі понад 12 годин;

14)за станцією відправлення вивести дані про всі поїзди, які до неї прибувають;

15)упорядкувати список за кількістю поїздів, які прибувають на станцію у першій половині доби.

8. Класи та об’єкти

159

 

 

Завдання 8.2. Створити і протестувати заданий клас.

1.Клас, який налічує опис типу вектора цілих чисел і процедури визначення: найменшого елемента; добутку значень усіх елементів вектора; середнього арифметичного значення серед ненульових елементів.

2.Клас, який налічує опис типу вектора цілих чисел і процедури визначення: найбільшого елемента; суми значень усіх елементів вектора; середнього арифметичного значення серед додатних елементів.

3.Клас, який налічує опис типу вектора дійсних чисел і процедури: заміни від’ємних значень вектора на нульові; зменшення додатних значень на задану величину; заміни знаків усіх елементів на протилежні.

4.Клас, який налічує опис двох типів векторів цілих чисел з різною кількістю елементів і процедури: об'єднання двох заданих векторів у третій сумарної довжини; додавання векторів; множення векторів.

5.Клас, який налічує опис типу “день_тижня” (пн, вт, ...), типу вектора з 365-ти елементів (дні невисокосного року) з елементами типу “день_тижня” та процедури: заповнення вектора назвами дня тижня; визначення найпершого понеділка року; обчислення кількості певних днів тижня (понеділків, вівторків і т.д. ) протягом року.

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

7.Клас, який налічує опис типу вектора, елементами якого є символи та процедури: утворення вектора з окремих символів, що читаються з клавіатури, доповнення новими символами (без пропусків) у зворотному порядку у тому самому векторі; друкування такого вектора.

8.Клас, який налічує опис типу вектора дійсних чисел і процедури: формування (читання) елементів вектора з клавіатури;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]