
- •§ 1. Поняття про інформаційне моделювання
- •Опорний конспект
- •§ 2. Етапи розв’язання задач на комп’ютері
- •§ 3. Середовища розробки проектів
- •§ 4. Властивості елементів керування
- •§ 1. Поняття про інформаційне моделювання 2
- •Контрольна робота № 1
- •§ 5. Створення проектів
- •§ 6. Основні поняття мови програмування
- •9. Процедура кнопки «Обчислити» для задачі про калькулятор.
- •§ 7. Алгоритм та його властивості
- •Запитання
- •§ 8. Різновиди алгоритмів
- •Запитання
- •§ 9. Типи даних
- •§ 10. Лінійні програми
- •Запитання та вправи
- •Контрольна робота № 2
- •§11. Введення даних і виведення результатів
- •§ 12. Текстові файли даних
- •§ 13. Програми з розгалуженням
- •§ 1. Поняття про інформаційне моделювання 2
- •Запитання
- •§ 14. Елементи керування прапорці і перемикачі
- •§ 15. Алгоритмічна конструкція вибір
- •Контрольна робота № 3
- •§ 16*. Списки
- •§ 17. Підпрограми. Функції користувача
- •§ 18. Підпрограми. Процедури користувача
- •§ 19. Цикли. Цикл з параметром
- •§ 20. Задачі пошуку даних. Цикл «доки»
- •§ 21. Застосування циклів
- •Контрольна робота № 4
- •Розділ 2. Складені структури даних
- •§ 22. Одновимірні масиви. Створення масивів
- •§ 23. Пошук даних в одновимірному масиві
- •1. Пошук даних у масиві за заданим критерієм.
- •5. Проект «На метеостанції». Застосування масивів і процедур користувача у vb.
- •§ 24. Впорядкування одновимірного масиву
- •§ 1. Поняття про інформаційне моделювання 2
- •4. Моделювання предметних областей за допомогою масивів.
- •§ 25. Двовимірні масиви. Створення масивів
- •§ 26*. Опрацювання двовимірних масивів
- •1. Елементи керування DataGridView (vb) та DataGrid (vba).
- •Контрольна робота № 5
- •§ 27. Опрацювання текстових даних
- •§ 28. Структури даних (записи)
- •§ 1. Поняття про інформаційне моделювання 2
- •§ 29. Файли даних прямого доступу
- •5. Vb. Команди для роботи з файлами даних прямого доступу.
- •§ 30. Застосування файлів даних послідовного доступу
- •§ 31. Графіка у vb
- •§ 32. Поняття про об’єктно-орієнтоване програмування
- •Розділ 3. Задачі
- •Складніші задачі*
- •Розділ 4. Vba у програмах пакету ms office
- •§ 33. Застосування vba у ms word
- •§ 34. Vba у програмі ms excell
- •§ 35. Задача про облік товарів на складі
- •§ 36. Розв’язування математичних задач
- •§ 37. Робота 3 базами даних
- •Список літератури
- •§ 1. Поняття про інформаційне моделювання 2
§ 32. Поняття про об’єктно-орієнтоване програмування
У цьому параграфі розглянемо основні поняття об’єктно-орієнтованого програмування (ООП): клас об’єктів користувача, інкапсуляція, успадкування, поліморфізм, конструктор, деструктор.
1. Поняття про різні стилі програмування. У попередніх параграфах ми розв’язували задачі шляхом створення проектів засобами візуального середовища. На стадії проектування форми користувач оперував стандартними об’єктами (елементами керування) і посилався на них у своїх кодах. Він використовував об’єкти лише для створення графічного інтерфейсу проекту.
Коли користувач вставляв на форму кнопку чи інший елемент керування, змінював їхні властивості у конструкторі, середовище розробки відстежувало кожну його дію і автоматично створювало код інтерфейсної частини проекту. Цей код є зразком об’єктно-орієнтованого програмування. Він зазвичай захований від користувача, але його можна переглянути, відредагувати і навіть створити «вручну», відкривши інтерфейсну частину проекту.
Ми створювали програми без інтерфейсу, тобто без форми і візуальних елементів. Такі програми відповідають стилю процедурно-орієнтованого програмування (ПОП). Коди обробників подій (коди кнопок тощо) у візуальному середовищі також створювали у цьому стилі.
Об’єктно-орієнтоване програмування (ООП) —- це більш загальний підхід до розв’язування задач передусім на стадії моделювання. Розглядають об’єктно-орієнтоване моделювання (аналіз) і об’єктно-орієнтоване проектування тощо.
Моделювання є найважливішим етапом. Моделюють цілі предметні області. В ООП декомпозицію задач реалізують не створенням окремих процедур, а створенням класів. Класи споріднених об’єктів групують у бібліотеки. Приклад бібліотеки класів — .NET Framework Class Library від Microsoft. Класи з цієї бібліотеки ми і використовували для розв’язування поточних задач.
ООП полягає не лише у використанні існуючих, а у створенні власних класів об’єктів та бібліотек класів, а також в їх застосуванні для розробки різних проектів зі створенням графічного інтерфейсу чи без нього.
2. Інкапсуляція. Одним з найважливіших принципів ООП є інкапсуляція: описування в одній структурній одиниці, яку називають класом, властивостей об’єктів та їхніх методів. Загальний опис класу такий (він нагадує опис структури, але містить ще оголошення методів):
Class <назва класу> <оголошення полів (властивостей)> <оголошення методів> End Class |
Метод — це код розв’язування деякої задачі чи її частини.
Отже, опис класу фактично містить код розв’язування деякої задачі чи підзадачі.
Твердження. Будь-яку з раніше написаних програм у стилі ПОП можна формально переписати у стилі ООП.
Покажемо, як це зробити.
Задача 1. Відомо рік народження студента і середній бал за минулу сесію. Вивести, який вік студента і повідомлення, чи отримуватиме він стипендію (нехай умовою надання стипендії є середній бал більший-рівний, ніж 71 (зі 100)).
Розв’язування. Клас student змоделюємо трьома властивостями: прізвище (name), рік народження (year), бал (bal), а також двома методами: визначення віку (age) і створення повідомлення (tell) з такими значеннями: "Стипендія є" або "Стипендії немає".
Class student
Public name As String
Public year As Integer
Public bal As Integer
Sub age(ByRef vik As Integer)
vik = 2012-year 'якщо тепер 2012 рік
End Sub
Sub tell(ByRef p As String)
If bal >= 71 Then
p = "Стипендія є"
Else
p = "Стипендії немає"
End if
End Sub
End Class
Слово Public оголошує загальнодоступне (незахищене) поле класу, а Dim чи Private — приватні (захищені) поля класу. Поле і властивість — це синоніми.
Складемо головний код користувача без інтерфейсної частини. Цей код використовує клас student:
Sub Main()
Dim vik As Integer Dim p As String
Dim studl As student 'Оголошення намірів створити об’єкт
studl = New student 'Створення об’єкта командою New
studl.name-’Квакін” 'Заповнення полів
studl.year = 1995
studl.bal = 80
studl .age(vik) 'Звертання до методів за результатами
studl .tell(p)
Debug.WriteLine(stud1.name) 'Виведення результатів у VB
Debug.WriteLine(vik)
Debug.WriteLine(p)
End Sub
Усі команди знайомі. Розглянемо їх. Команда Dim studl As student оголошує про намір створити об’єкт типу student. Комп’ютер на цьому етапі з’ясовує, що таке об’єкт student, чи є доступ до класу student і чи він правильно описаний.
Команда studl = New student звертається до конструктора класу і резервує для об’єкта відповідні ділянки в оперативній пам’яті. Тільки тепер «народився» об’єкт (об’єкт створено). Але він порожній і не містить конкретних даних. Наступні три команди заповнюють поля об’єкта. Цей процес називають ініціалізацією об’єкта. Далі у коді звертаються до методів об’єкта, отримують потрібні результати і виводять їх у вікно інтерпретації.
Завдання 1. Виконайте код і переконайтеся, що результати будуть такі:
Квакін
17
Стипендія є.
Завдання 2. Створіть графічний інтерфейс для задачі 1.
Завдання 3. Модифікуйте будь-який код розв’язування задачі про трикутник у стилі ООП.
3. Конструктор і деструктор. Конструктор — це процедура, яка призначена для ініціалізації (надання значень полям) об’єкта. У вищенаведеному коді команда New зверталася до стандартного (неявного) безпараметричного конструктора класу.
В ООП прийнято явно описувати конструктор класу в конструкції опису класу. Це дає змогу уникати ініціалізації об’єктів шляхом прямого звертання до їхніх полів так:
studl .name = "Квакін"
stud1.year= 1995
studl .bal = 80 'Це вважається поганим тоном в ООП
Конструктор класу student для задачі 1 запишемо після описів властивостей класу. Він може мати такий, наприклад, вигляд:
Sub New(aa As String, bb As Integer, cc As Integer)
Me.name = aa 'Полям об’єкта
Me.year = bb 'надаємо відповідні значення
Me.bal = cc
End Sub
Конструкторів може бути декілька, які відрізняються сигнатурами — списками формальних параметрів. У конструкторі можна передбачити аналіз вхідних даних (aa, bb, сс) на правильність і виведення у разі потреби попередження про їх некоректність чи невідповідність змісту задачі.
Створивши конструктор, користувач може замінити п’ять команд головного коду такою одною:
Dim studl As student = New student(“Квакін”, 1995, 80).
Якщо треба розглянути дані про багатьох студентів, то їх можна занести в пам’ять у масив об’єктів (і опрацювати послідовно на звичайному комп’ютері чи паралельно на багатопроцесорному).
Ці об’єкти займатимуть значні обсяги оперативної пам’яті, що може сповільнити роботу комп’ютера. Пам’ять варто вивільнити від зайвих (уже опрацьованих) об’єктів. Для цього призначені методи-деструктори Finilize або Dispose. Звільнити пам’ять від даних про студента Квакіна можна за допомогою деструктора Finilize так: studl.Finilize.
Як і у випадку конструктора, процедуру деструктора
Sub Finilize()... End Sub
рекомендують описувати явно в описі класу. Можна залишати її порожньою або у разі потреби передбачити виведення в ній деякого повідомлення про виконану роботу, занесення результатів у файл, виведення даних на екран тощо.
Завдання 4. Модифікуйте вищенаведений код, застосувавши явний опис конструктора і деструктора.
4. Успадкування і поліморфізм. У задачах, що розглядалися раніше, можна було виокремити й описати один клас об’єктів: клас студентів, клас трикутників, клас автомобілів тощо. Насправді реальну предметну область моделюють за допомогою декількох, а інколи й багатьох класів. Між класами можуть бути налагоджені ієрархічні зв’язки на зразок «батьки»-«нащадки». Класи-нащадки, крім власних, можуть використовувати властивості й методи батьків.
Успадкування — це другий важливий принцип ООП, який дає змогу використовувати спільні властивості і методи класів.
Завдяки успадкуванню код опису класу-нащадка стає компактнішим. Успадкування реалізують командою Inherits <назва батьківського класу>, яку записують під заголовком класу-нащадка.
Розглянемо поняття поліморфізму. Різні класи можуть мати методи з однаковими назвами, але з різним функціюванням (наповненням). Нехай а і b — це об’єкти різних класів, що мають метод method1. Тоді в головному коді команди a.methodl і b.method1 викличуть різні методи, хоча назви методів однакові. Це називається поліморфізмом. Поліморфізм дає змогу подібні за призначенням, але різні за кодами методи в різних класах називати однаковими назвами, що, зокрема, забезпечує зменшення загальної кількості назв і процедур. А це важливо у великих проектах.
Нащадки можуть мати власні методи, а також використовувати методи батьків. Якщо нащадок має метод з такою ж назвою, що й назва методу у батьківському класі, то заголовок методу нащадка слід описати зі службовим словом Overrides.
5. Ієрархія класів. Побудуємо нескладну ієрархію класів: батьківський клас і два його нащадки. Для цього розглянемо задачу 2.
Задача 2. Дослідити, який місячний фонд зарплати і місячний фонд для виплати стипендій має мати деякий навчальний заклад, якщо стипендію 800 грн виплачують студентам, коли кількість балів більша-рівна 71, а зарплату викладачам виплачують, наприклад, відповідно до трьох посадових окладів: 1-й — 2000 грн, 2-й — 2500 грн, 3-й — 3000 грн. Потрібно також отримати довідку про середній вік студентів і викладачів. Дані про студентів і викладачів є у файлі даних.
Моделювання. Створимо клас person з такими властивостями: прізвище (name), рік народження (year), явно описаним конструктором з двома параметрами і методом age для визначення віку особи.
Створимо клас-нащадок student з успадкованими від person двома властивостями (прізвище і рік народження), власною третьою властивістю (bal), з конструктором New, який основується на конструкторі батьківського класу MyBase.new, доповнений командою задания третьої властивості Ьаі і володіє методом salary для визначення суми місячного доходу.
Створимо клас-нащадок teacher з успадкованими від person двома властивостями, власною третьою властивістю (position), що визначає тип окладу (1, 2 чи 3), з конструктором New, який основується на конструкторі батьківського класу MyBase.new, доповнений командою задания третьої властивості position і володіє методом salary для визначення суми місячного доходу.
UML-діаграма класів, що відображає взаємозв’язок між класами, зображена на рис. 2.9.
Рис. 2.9. UML-діаграма класів для задачі 2
Розглянемо спрощену постановку задачі 2 з метою дослідження даних лише одного студента і одного викладача. Побудуємо проект з таким інтерфейсом: розташуємо на формі «Останній проект» вісім написів і кнопку. Підпишемо написи «Студент», «Вік», «Сума», І «Викладач», як показано на рис. 2.10, а інші чотири (в коді вони мають номери 1, 2, 3 і 4) використаємо для виведення результатів пошуку потрібних даних. Виведемо у написи 1 і 2 вік і розмір стипендії студента, що залежить від кількості балів, а в інші два написи (3 і 4) — вік і місячний оклад викладача, що залежить від типу окладу. Вхідні дані на формі не задаємо. Задамо їх (довільно) у коді як фактичні параметри для конструкторів об’єктів (вважатимемо, що дані взято з файлу даних). Кнопка «Вивести дані» запускає процес розв’язування задачі й виведення результатів.
Рис. 2.10. Результат виконання останнього проекту
Програмування. Розгляньте код проекту, що складається з коду кнопки і кодів трьох класів. Коди класів записують під заголовком класу форми Forml перед кодом кнопки.
Public Class Forml
Class person
Public name As String
Public year As Integer
Public Sub New(ByVal aa As String, ByVal bb As Single)
Me.name = aa
Me.year = bb
End Sub 'кінець конструктора
Public Sub age(ByRef z)
z = 2012 – year
End Sub 'кінець методу
End Class 'кінець класу person
Class student
Inherits person 'наслідування
Dim bal As Integer 'власна властивість нащадка
Public Sub New(ByVal aa As String, ByVal bb As Single,_
ByVal cc As Single)
MyBase.new(aa, bb)
Me.bal = cc
End Sub
Sub salary(ByRef sum) 'метод нащадка
If bal >= 71 Then sum = 800 Else sum = 0
End Sub
End Class
Class teacher
Inherits person
Dim position As Integer
Public Sub New(ByVal aa As String, ByVal bb As Single, _
ByVal cc As Single)
MyBase.new(aa, bb)
Me.position = cc
End Sub
Sub salary(ByRef sum)
Select Case position
Case 1 : sum = 2000
Case 2 : sum = 2500
Case 3 : sum = 3000
End Select
End Sub
End Class
' А це код кнопки:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'Створюємо два об’єкти з даними про двох осіб
Dim studl As student = New studentfKBaKiH", 1995, 80)
Dim teach 1 As teacher = New teacher("BecT", 1965, 2)
Dim p As Single
'Отримуємо шукані результати і виводимо їх
studl.age(p): Label1.Text = p
studl.salary(p): Label2.Text = p
teachl.age(p): Label3.Text = p
teach1.salary(p): Label4.Text = p
End Sub 'кінець коду кнопки
End Class 'кінець класу Forml
Зауваження. Властивості батьківського класу описані як Public (незахищені), оскільки до них мають отримувати доступ об’єкти двох інших класів. Властивості bal і position є приватною власністю відповідних класів, тому їх описують зі словом Dim, що рівносильне Private. Рекомендуємо ознайомитися з методами Get і Set, які дають змогу конструювати захищені поля класу.
Завдання 1. Виконайте проект і переконайтеся, що результат буде такий, як на рис. 2.10.
Завдання 2. Модифікуйте проект, щоб вхідні дані про студента і викладача можна було вводити з форми.
Завдання 3. Модифікуйте проект, щоб всі вхідні дані можна було вводити з файлу даних.
Завдання 4*. Розв’яжіть задачу 2 для десяти студентів і п’яти викладачів, ввівши дані з двох файлів даних у масиви об’єктів.
Висновок. Переваги ієрархії класів і ООП виявляються на великих задачах. ООП сьогодні — це потужний механізм моделювання предметних областей за допомогою класів користувача, які містять описи властивостей об’єктів і їхні методи (розв’язки-заготовки різноманітних завдань).
Вправи
Оформіть у стилі формального ООП розв’язування задачі про площу поверхні та об’єм кулі. Для цього створіть власний клас «Куля» з властивістю г (радіус) і двома методами: один — для обчислення площі, другий — для обчислення об’єму. В головному коді сконструюйте об’єкт, ініціалізуйте його і зверніться до його методів за результатами.
Оформіть у стилі ООП розв’язування задачі про трикутник чи іншої задачі з розділу 1.
Побудуйте клас «Студенти» з такими властивостями: прізвище, ім’я, балі, бал2, балЗ, бал4, бал5 у стобальній системі з п’яти іспитів і з двома методами: для визначення середнього бала студента; для визначення, чи отримуватиме студент стипендію. Умова отримання стипендії така: середній бал >71.
Побудуйте клас «Студенти2», застосувавши успадкування від класу «Студенти». Новий клас має містити додатково такі властивості: місто, звідки прибув студент на навчання; номер телефону батьків. Створити масив з десяти об’єктів класу «Студенти2», ввівши потрібні дані з файлу даних. Створити список прізвищ студентів і телефонів батьків, яким має зателефонувати секретар деканату, якщо студент отримав з трьох предметів менше, ніж 50 балів, і може бути виключений.
5*. Створіть клас «Співробітники» з такими властивостями: прізвище, ім’я, оклад, а також з методом обчислення податку, наприклад, 15% від окладу. Створіть масив з десяти об’єктів класу «Співробітники», визначіть фонд зарплатні підприємства і суму сплачених податків за всіх співробітників.
6*. Створіть масив з десяти об’єктів класу «Студенти», ввівши потрібні дані з файлу даних і створіть список з прізвищами студентів, які матимуть стипендію.
7*. Зайдіть в автомобільний салон і розгляньте прайс-лист. Засобами ООП змоделюйте задачу визначення вартості автомобіля залежно від його комплектації. Застосуйте три класи. Батьківський клас має містити описи мінімальної стандартної комплектації, наприклад, салон (тканина, велюр, шкіра), двигун (1.6, 1.8, 2.0), тип кузова (седан, хечбек, спорт). Другий клас має описувати автомобілі з розширеною комплектацією, наприклад, з такими додатковими атрибутами: електропакет (так, ні), люк (так, ні), коробка передач (механіка, авто, комбі). Третій клас має описувати автомобілі з найбільш повною комплектацією, наприклад, скло нічного бачення (так, ні), 3D-акустика (так, ні), непробивна гума (так, ні) тощо. Створіть програму, яка формує замовлення на машину і підраховує її вартість.