- •З курсу “Об’єктно- орієнтоване програмування”
- •Методичні вказівки до лабораторних робіт з курсу “Об’єктно-орієнтоване програмування”
- •Вступ 5 Правила техніки безпеки при виконанні лабораторних робіт 6
- •Правила техніки безпеки при виконанні лабораторних робіт
- •Лабораторна робота №1
- •Короткі теоретичні відомості
- •Мета роботи: реалізувати декілька класів та здійснити їх композицію Короткі теоретичні відомості
- •Список рекомендованої літератури
- •Лабораторна робота № 3
- •Короткі теоретичні відомості
- •Оформлення звіту:
- •Контрольні питання
- •Лістинг 2.4. Конструктори і параметри
- •Порядок виконання роботи
- •Оформлення звіту:
- •Список рекомендованої літератури
- •Лабораторна робота № 4
- •Короткі теоретичні відомості
- •Оформлення звіту:
- •Контрольні питання
- •Список рекомендованої літератури
- •Лабораторна робота № 5
- •Порядок виконання роботи
- •Контрольні питання
- •Список рекомендованої літератури
Порядок виконання роботи
Cтворити базу даних.
Реалізувати таблиці БД з визначеними типами полів.
Заповнити таблиці даним.
Всі вище перераховані операції повинні бути відображені у звіті.
Оформлення звіту:
Титульний лист.
Мета роботи.
Порядок виконання.
Код програми та screen-shot, що відображають результати роботи програми.
Висновки.
Контрольні питання
Застосування конструкторів класу.
Поняття деструктора.
Перевантажені конструктори
Особливості використання СКБД FireBird.
Список рекомендованої літератури
Львов М.С., Співаковський О.В. Основи алгоритмізації та програмування. Навч. посібник. - Херсон: Айлант. 2000. -214 с.
Бадд Т. Обьектно-ориентированное программирование в действии / пер. С англ. - СПб.Литер, 1997.- 464 с. ил.
Буч Г. Обьектно-ориентированньїй анализ и проектирование с примерами приложений на C++, 2-ое изд./пер. с англ.- М.: «Издательство Бином», СПб.:«Невский диалект», 1998 - 560 с, ил..
Лабораторна робота № 4
ВІРТУАЛЬНІ ТА INLINE-ФУНКЦІЇ
Мета роботи: навчитись застосовувати на практиці віртуальні та inline-функції.
Короткі теоретичні відомості
Скріплення — це зіставлення виклику функції з тілом. Для звичайних методів скріплення виконується на етапі трансляції до запуску програми. Таке скріплення називають «раннім», або статичним. При наслідуванні звичайного методу його поведінка не міняється в спадкоємцеві. Проте буває необхідно, щоб поведінка деяких методів базового класу і класів-спадкоємців відрізнялися. Щоб добитися різної поведінки залежно від типу, необхідно оголосити функцию-метод віртуальною; у С++ це робиться за допомогою ключового слова virtual. Віртуальні функції в сукупності з принципом підстановки забезпечують механізм «пізнього» (відкладеного) або динамічного скріплення, яке працює під час виконання програми (лістинг 3.3).
Лістинг 3.3. Віртуальні методи
Клас, в якому визначені віртуальні функції (хоч би одна), називається поліморфним класом.
Ключове слово Virtual можна писати тільки в базовому класі — це достатньо зробити в оголошенні функції. Навіть якщо визначення писати без слова Virtual, функція все одно вважатиметься віртуальною. Правила опису і використання віртуальних функцій-методів наступні:
Віртуальна функція може бути тільки методом класу.
Будь-яку перенавантажувану операцію-метод класу можна зробити віртуальною, наприклад операцію привласнення або операцію перетворення типу.
Віртуальна функція успадковується.
Віртуальна функція може бути константною.
Якщо в базовому класі визначена віртуальна функція, то метод похідного класу з таким же ім'ям і прототипом (включаючи і тип повертаючого значення, і константна методу) автоматично є віртуальним (слово Virtual вказувати необов'язково) і заміщає функцию-метод базового класу.
Статичні методи не можуть бути віртуальними.
Конструктори не можуть бути віртуальними.
Деструктори можуть (частіше — винні) бути віртуальними — це гарантує коректне звільнення пам'яті через вказівник базового класу.
Всередині конструкторів і деструкцій динамічне скріплення не працює, хоча виклик віртуальних функцій не заборонений. У конструкторах і Деструкторх завжди викликається «рідна» функція класу.
Віртуальні функції-методи можна перенавантажувати і перевизначати (у спадкоємцях) з іншим списком аргументів. Якщо віртуальна функція перевизначена з іншим списком аргументів, вона заміщає (приховує) батьківські методи. Константний метод вважається відмінним від неконстантного методу з таким же прототипом (лістинг 3.4).
Лістинг 3.4. Перевантаження і перевизначення віртуальних методів
Через вказівник базового класу не можна викликати нові віртуальні методи, визначені тільки в похідному класі. Якщо це необхідно, потрібне явне приведення типу:
((Derive *)pb)->f1);
Батьківські методи можна зробити доступними в класі-спадкоємцеві за допомогою using-оголошення.
class Derive: public Base { public
Virtual int т(int) const
{ cout « "Derived::f(int) "« endl;
return 0; }
using Base::f: // дозвіл використовувати приховані базові методи
}
Дозволяється при перевизначенні віртуальної функції змінити тільки тип значення, що повертається, якщо це вказівник або посилання.
Віртуальну функцію можна викликати невіртуально, якщо вказати квалифікатор класу:
Base *с1 = new Derive;// адресується об'єкт похідного класу
с1->print: // виклик методу-спадкоємця
с1->Base: :print;// явно викликається базовий метод
Такий статичний виклик буває потрібний, коли в базовому класі реалізуються загальні дії, які повинні виконуватися у всіх класах-спадкоємцях. За наявності хоч би однієї віртуальної функції розмір класу без полів рівний 4 — це розмір указателя1. Кількість віртуальних функцій ролі не грає — розмір класу залишається рівний 4.
class One
{ Virtual void f(void { };
class Two
{ Virtual void f(void)
{ Virtual void g(void) { };
// ...
cout. « sizeof"( One)« endl;// розмір = 4
cout. « sizeof (Two) « endl;// розмір = 4
Чисті віртуальні функції і абстрактні класи
Віртуальна функція, що не має визначення тіла, називається чистою (клуні) і оголошується таким чином: VIгт:иа! тип ім'я(параметри)= 0;
Передбачається, що дана функція буде реалізована в класах-спадкоємцях. Клас, в якому є хоч одна чиста віртуальна функція, називається абстрактним класом. Об'єкти абстрактного класу створювати заборонено — навіть Операцією new. І при передачі параметра у функцію неможливо передати об'єкт абстрактного класу по значенню. Проте вказівники (і посилання) визначати можна (пригадаєте оголошення класу).
При наслідуванні абстрактність зберtimeться: якщо клас-спадкоємець не реалізує успадковану чисту віртуальну функцію, то він теж є абстрактним. У С++ абстрактний клас визначає поняifя інтерфейсу. Наслідування від абстрактного класу — це Наслідування інтерфейсу.
Віртуальні деструктори
Деструктор класу може бути оголошена віртуальним (лістинг 3.5). Коли Деструктор базового класу віртуальна, то і деструкції всіх спадкоємців такі ж. Це необхідно, якщо доступ до динамічного об'єкту похідного класу виконується через вказівник базового класу. В цьому випадку при знищенні об'єкту через вказівник базового класу викликається Деструктор похідного класу, а він викликає деструкцію базового класу. Якщо Деструктор базового класу не віртуальна, то при знищенні об'єкту похідного класу через вказівник базового класу викликається Деструктор тільки базового класу.
Лістинг 3.5. Віртуального деструктора
Деструктор може бути оголошений як чистий: virtual –Vbase()= 0;
Клас, в якому визначена чистий віртуальний Деструктор, є абстрактним, і створювати об'єкти цього класу заборонено. Проте клас-спадкоємець не є абстрактним класом, оскільки Деструктор не успадковується, і в спадкоємцеві за відсутності явно певної деструкції він створюється автоматично. При оголошенні чисто віртуальної деструкції потрібно написати і його визначення.
class Abstract // абстрактний клас
{ public;
Virtual ~ Abstract ()=0;// чистий віртуальний деструктор
}:
Abstract::~Abstract {}// визначення чистого деструктора
{ соиt « " Abstract "« endl; } // спадкоємець - не абстрактний клас
class Not Abstract
public Abstract; { };
Визначати можна не тільки чисті деструктори, але і чисті віртуальні методи. Клас, для якого це визначення написане, як і раніше є абстрактним класом. На відміну від чистих віртуальних деструкторів, навіть визначена в базовому класі чиста віртуальна функція успадковується як чиста, тому похідний клас теж буде абстрактним за відсутності власного визначення.
class Base// абстрактний клас
{ public:
Virtual void f() = 0 // чистий віртуальний метод
}:
void Base::f()// визначення чистого методу
{ cout « "Base::Т( )"« endl; }
class Derive: public Base// теж абстрактний клас
{ }:
У визначенні чистого віртуального методу базового класу задасться загальний код, який можуть використовувати класи-спадкоємці в своїх реалізаціях цієї функції. При цьому чистий метод базового класу викликається статично з префіксом класу.
Завдання
Створити клас BitString для роботи з бітовими рядками не більше ніж з 100 біт. Бітовий рядок повинен бути представлений масивом типу unsigned char, кожен елемент якого приймає значення 0 або 1. Реальний розмір масиву задається як аргумент конструктора ініціалізації. Повинні бути реалізовані всі традиційні операції для роботи з бітовими рядками: and, оr, хоr, nоt. Реалізувати зсув вліво і зсув в право на задану кількість бітів.
Створити клас Decimal для роботи з беззнаковими цілими десятковими числами, використовуючи для представлення числа масив з 100 елементів типу unsigned char, кожний з яких є десятковою цифрою. Молодша цифра має менший індекс (одиниці — в нульовому елементі масиву). Реальний розмір масиву задається як аргумент конструктора ініціалізації. Реалізувати арифметичні операції, аналогічні вбудованим для цілих в С++, і операції порівняння.
Створити клас Нех для роботи з беззнаковими цілими шестнадцатеричными числами, використовуючи для представлення числа масив з 100 елементів типу unsigned char, кожний з яких є шестнадцятковим числом. Молодша цифра має менший індекс. Реальний розмір масиву задається як аргумент конструктора ініціалізації. Реалізувати арифметичні операції, аналогічні вбудованим для цілих в С++, та операції порівняня.
Створити клас Money для роботи з грошовими сумами (завдання 1.24). Сума повинна бути представлена масивом, кожен елемент якого — десяткова цифра. Максимальна довжина масиву — 100 цифр, реальна довжина задається конструктором. Молодший індекс відповідає молодшій цифрі грошової суми. Молодші дві цифри — копійки.
Створити клас Polinom для роботи з многочленами до 100-го ступеня. Коефіцієнти повинні бути представлені масивом з 100 елементів-коефіцієнтів. Молодший ступінь має менший індекс (нульовий ступінь — нульовий індекс). Розмір масиву задається як аргумент конструктора ініціалізації. Реалізувати арифметичні операції і операції порівняння, обчислення значення полінома для заданого значення х, диференціювання, інтеграцію.
Створити клас Faction для роботи з беззнаковими дробовими десятковими числами. Число повинне бути представлене двома масивами типу unsigned char: ціла і дробова частина, кожен елемент — десяткова цифра. Для цілої частини молодша цифра має менший індекс, для дробової частини старша цифра має менший індекс (десяті — в нульовому елементі, соті — в першому, і т. д.). Реальний розмір масивів задається як аргумент конструктора ініціалізації. Реалізувати арифметичні операції складання, віднімання і множення, і операції порівняння.
Реалізувати клас Rational (завдання 1.18), використовуючи два масиви з 100 елементів типу unsigned char для представлення чисельника і знаменника. Кожен елемент є десятковою цифрою. Молодша цифра має менший індекс (одиниці — в нульовому елементі масиву). Реальний розмір масиву задається як аргумент конструктора ініціалізації.
Реалізувати клас Money (завдання 1.33), використовуючи для уявлення суми Point масив структур. Структура має два поля: номінал купюри і кількість купюр даного номіналу. Номінали представити як тип nominal, що перераховує. Елемент масиву структур з меншим індексом містить менший номінал.
Реалізувати клас Data (завдання 1.29), використовуючи для представлення місяців масив структур. Структура має два поля: назва місяця (рядок), кількість днів в місяці. Індексом в масиві місяців є перераховуючий тип month. Реалізувати два варіанти класу: із звичайним масивом і статичним масивом місяців.
Картка іноземного слова є структурою, що містить іноземне слово і його переклад. Для моделювання електронного словника іноземних слів реалізувати клас Dictionary. Даний клас має поле-назву словника і містить масив структур WordCard, що є картками іноземного слова. Назва словника задається при створенні нового словника, але повинна бути надана можливість його зміни під час роботи. Картки додаються в словник і віддаляються з нього. Реалізувати пошук певного слова як окремий метод. Аргументом операції індексування повинне бути іноземне слово. У словнику не повинно бути карток-дублів. Реалізувати операції об'єднання, перетину і віднімання словників. При реалізації повинен створюватися новий словник, а початкові словники не повинні змінюватися. При об'єднанні новий словник повинен містити без повторень всі слова, що містяться в обох словниках-операндах. При перетині новий словник повинен складатися тільки з тих слів, які є в обох словниках-операндах. При відніманні новий словник повинен містити слова першого словника-операнда, відсутні в іншому.
Одне тестове питання є структурою Таsк з наступними полями: питання, п'ять варіантів відповіді, номер правильної відповіді, бали за правильну відповідь, що нараховуються. Для моделювання набору тестових питань реалізувати клас TestContent, що містить масив тестових питань. Реалізувати методи додавання і видалення тестових питань, а також метод доступу до тестового завдання по його порядковому номеру в списку. У масиві не повинно бути питань, що повторюються. Реалізувати операцію злиття двох тестових наборів, операцію перетину і обчислення різниці (див. завдання 10). Додатково реалізувати операцію генерації конкретного об'єкту Test об'ємом не більш K питань з об'єкту типy TestContent.
Картка особи містить прізвище і дату народження. Реалізувати клас Person для роботи з картотекою персоналій. Клас повинен містити масив карток осіб. Реалізувати методи додавання і видалення карток осіб, а також метод доступу до картки по прізвищу. Прізвища в масиві повинні бути унікальні. Реалізувати операції об'єднання двох картотек, операцію перетину і обчислення різниці (див. завдання 10). Реалізувати метод, що видає по прізвищу знак зодіаку. Для цього в класі повинен бути оголошений масив структур Zodiac з полями: назва знаку зодіаку, дата початку і дата закінчення періоду. Індексом в масиві повинен бути тип перечислення Zodiac. Реалізувати два варіанти класу: із звичайним масивом і статичним масивом Zodiac.
Товарний чек містить список товарів, куплених покупцем в магазині. Один елемент списку є парою: товар-сума. Товар — це клас Goods з полями коду і найменування товару, ціни за одиницю товару, кількості одиниць товару, що купуються. У класі повинні бути реалізовані методи доступу до полів для отримання і зміни інформації, а також метод обчислення суми оплати за товар. Для моделювання товарного чека реалізувати клас Receipt, полями якого є номер товарного чека, дата і час його створення, список товарів, що купуються. У класі Receipt реалізувати методи додавання, зміни і видалення запису про товар, що купується, метод пошуку інформації про певний вид товару за його кодом, а також метод підрахунку загальної суми, на яку були здійснені покупки. Методи додавання і зміни приймають як аргумент об'єкт класу Goods. Метод пошуку повертає об'єкт класу Goods як результат.
Інформаційний запис про книгу в бібліотеці містить наступні поля: автор, назва, рік видання, видавництво, ціна. Для моделювання облікової картки абонента реалізувати клас Subscriber, що містить прізвище абонента, його бібліотечний номер і список узятих в бібліотеці книг. Один елемент списку складається з інформаційного запису про книгу, дати видачі, необхідної дати повернення і ознаки повернення. Реалізувати методи додавання книг в список і видалення книг з нього; метод пошуку книг, що підлягають поверненню; методи пошуку по авторові, видавництву і року видання; метод обчислення вартості що всіх підлягають поверненню книг. Реалізувати операцію злиття двох облікових карток, операцію перетину і обчислення різниці (див. завдання 10). Реалізувати операцію генерації конкретного об'єкту Debt (борг), що містить список книг, що підлягають поверненню з об'єкту типу Subscriber.
Інформаційний запис про файл в каталозі містить поля: ім'я файлу, розширення, дата і час створення, атрибути «тільки для читання», «прихованний», «системный», розмір файлу на диску. Для моделювання каталога реалізувати клас Directory, що містить назву батьківського каталога, кількість файлів в каталозі, список файлів в каталозі. Один елемент списку включає інформаційний запис про файл, дату останньої зміни, ознаку виділення і ознаку видалення. Реалізувати методи додавання файлів в каталог і видалення файлів з нього; метод пошуку файлу по імені, по розширенню, по даті створення; метод обчислення повного об'єму каталога. Реалізувати операцію об'єднання і операцію перетину каталогів (див. завдання 10). Реалізувати операцію генерації конкретного об'єкту Group (група), що містить список файлів, з об'єкту типу Directory. Повинна бути можливість вибирати групу файлів за ознакою видалення, по атрибутах, по даті створення (до.или після), за об'ємом (менше або більше).
Використовуючи клас Bill (завдання 1.56), реалізувати клас ListPayer. Клас містить список платників за телефонні послуги, дату створення списку, номер списку. Поля одного елементу списку — це: платник (клас Bill), ознака оплати, дата платежу, сума платежу. Реалізувати методи додавання платників в список і видалення їх з нього; метод пошуку платника по номеру телефону і по прізвищу, по даті платежу. Метод обчислення повної вартості платежів всього списку. Реалізувати операцію об'єднання і операцію перетину списків (див. завдання 10). Реалізувати операцію генерації конкретного об'єкту Group (група), що містить список платників, з об'єкту типу ListPayer. Повинна бути можливість вибирати групу платників за ознакою оплати, по атрибутах, по. даті платежу, по номеру телефону.
17. Учбовий план спеціальності є списком дисциплін, які студент повинен вивчити за час навчання. Одна дисципліна є структурою з полями: номер дисципліни в плані, тип дисципліни (федеральна, регіональна, по вибору), назва дисципліни, семестр, в якому дисципліна вивчається, вид підсумкового контролю (залік або іспит), загальна кількість годин, необхідна для вивчення дисципліни, кількість аудиторного годин, який складається з лекційного годин і годин практики. Реалізувати клас PlanEducation для моделювання учбового плану спеціальності. Клас повинен містити код і назву спеціальності, дату твердження, загальну кількість годин спеціальності за стандартом і список дисциплін. Один елемент списку дисциплін повинен містити запис про дисципліну, кількість годин для самостійної роботи (різниця між загальною кількістю годин і аудиторним годинником), ознака наявності курсової роботи, що виконується по даній дисципліні. Реалізувати методи додавання і видалення дисциплін; метод пошуку дисципліни по семестру, за типом дисципліни, по вигляду підсумкового контролю; метод обчислення сумарної кількості годин всіх дисциплін; метод обчислення кількості іспитів і заліків по семестрах. Реалізувати операцію об'єднання, операцію віднімання учбових планів і операцію перетину учбових планів (див. завдання 10). Реалізувати операцію генерації конкретного об'єкту Group (група дисциплін), що містить список дисциплін, з об'єкту типа PlanEducation. Повинна бути можливість вибирати групу дисциплін за типом, по семестру, по вигляду підсумкового контролю, по наявності курсової роботи. Повинен здійснюватися контроль за сумарною кількістю годин, за кількістю іспитів в семестрі (не більшеп'яти і не меншого трьох).
Навантаження викладача за навчальний рік є списком дисциплін, що викладаються ними протягом року. Одна дисципліна представляється інформаційною структурою з полями: назва дисципліни, семестр проведення, кількість студентів, кількість годин аудиторних лекцій, кількість аудиторного годин практики, вид контролю (залік або іспит). Реалізувати клас WorkTeacher, що моделює бланк призначеною викладачеві навантаження. Клас містить прізвище викладача, дату твердження, список дисциплін, що викладаються, об'єм повного навантаження в годиннику і в ставках. Дисципліни в списку не повинні повторюватися. Об'єм в ставках обчислюється як приватне від ділення об'єму в годиннику на середню річну ставку, однакову для всіх викладачів кафедри. Елемент списку дисциплін, що викладаються, містить дисципліну, кількість годин, що виділяється на залік (0,35 г на одного студента) або іспит (0,5 г на студента), суму годин по дисципліні. Реалізувати додавання і видалення дисциплін; обчислення сумарного навантаження на годин і ставок. Повинен здійснюватися контроль за перевищенням навантаження більше півтора ставки.
Створити клас Octal для роботи з беззнаковими цілими восьмеричными числами, використовуючи для представлення числа масив з 100 елементів типу unsigned char, кожен елемент якого є вісімковою цифрою. Молодша цифра має менший індекс (одиниці — в нульовому елементі масиву). Реальний розмір масиву задається як аргумент конструктора ініціалізації. Реалізувати арифметичні операції, аналогічні вбудованим для цілих в С++, і операції порівняння.
Створити клас String для роботи з рядками, аналогічними рядкам Turbo Раsса1 (рядок представляється як масив 255 байт, довжина — в першому байті). Максимальний розмір рядка повинен задаватися. Обов'язково повинні бути реалізовані: визначення довжини рядка, пошук підрядка в рядку, видалення підрядка з рядка, вставка підрядка в рядок, зчеплення двох рядків.
Один запис в списку запланованих справ є структурою DailyItem, яка містить час початку і закінчення роботи, опис плану робіт на день. Реалізувати методи додавання, видалення і зміни планованої роботи. При додаванні перевіряти коректність тимчасових рамок (вони не повинні перетинатися з вже запланованими заходами). Реалізувати метод пошуку вільного проміжку часу. Умову пошуку задає розмір шуканого інтервалу, а також тимчасові рамки, в які він повинен потрапляти. Метод пошуку повертає структуру DailyItem з порожнім описом виду робіт. Реалізувати операцію генерації об'єкту Redo (ще раз), що містить список справ, не виконаних протягом дня, з об'єкту
Прайс-лист комп'ютерної фірми включає список моделей комп'ютерів, що продаються. Одна позиція списку (Model) містить марку комп'ютера, тип процесора, частоту роботи процесора, об'єм пам'яті, об'єм жорсткого диска, об'єм пам'яті відеокарти, ціну комп'ютера в умовних одиницях і кількість екземплярів, що є в наявності. Реалізувати клас PriceList, полями якого є дата його створення, номінал умовної одиниці в гривнях і список моделей комп'ютерів, що продаються. У списку не повинно бути двох моделей однакової марки. У класі PriceList реалізувати методи додавання, зміни і видалення запису про модель, метод пошуку інформації про модель по марці комп'ютера, за об'ємом пам'яті, диска і відео карти (рівно або не меншезаданого), а також метод підрахунку загальної суми. Реалізувати методи об'єднання і перетину прайс-листів (див. завдання 10). Методи додавання і зміни приймають як вхідний параметроб'єкт класу Моdе1. Метод пошуку повертає об'єкт класу Моdе1 як результат.
Реалізувати клас set (множина) не більше ніж з 256 елементів-символів. Рішення повинне забезпечувати включення елементу в множину, виключення елементу з множини, об'єднання, перетин і різницю множин, обчислення кількості елементів в множині, перевірку присутності елементу в множині, перевірку включення однієї множини в інше.
