Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_OOP_.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
514.56 Кб
Скачать

Мета роботи: реалізувати декілька класів та здійснити їх композицію Короткі теоретичні відомості

У С++ дозволено перенавантажувати вбудовані операції — це один з проявів поліморфізму. Перевантаження операцій не є обов'язковим в об'єктно-орієнтованому програмуванні — в мовах Java і С# вона відсутня. Проте наявність перевантаження операцій в С++ забезпечує додатковий рівень зручності при використанні нових типів даних.

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

Перевантаження операцій

При перевантаженні операції потрібно враховувати наступні обмеження.

  1. Заборонено перевантаження наступних операцій:

  • sizeof() — визначення розміру аргументу;

  • . (крапка) — селектор компоненту об'єкту;

  • ?: — умовна операція;

  • :: — вказівка області видимості;

  • .* — вибір компоненту класу через вказівник;

  • # і ## — операції препроцесора.

  1. Операції можна перенавантажувати тільки для нового типу даних — не можна перенавантажувати операцію для вбудованого типу. В С++ новий тип даних можна утворити за допомогою конструкцій enum, union, struct і с1аss.

  2. Не можна змінити пріоритет перенавантажуваної операції і кількість операндів. Унарна операція зобов'язана мати один операнд, бінарна — два операнди; не дозволяється використовувати параметри за замовчуванням. Єдина операція, яка не має фіксованої кількості операндів, — це операція виклику функції (). Операції «+», «-», «*», «&» допускається перенавантажувати як і унарні, так і бінарні.

  3. Операції можна перенавантажувати або як незалежні зовнішні функції (тільки такий спосіб перевантаження допустимий для enum), або як методи класу. Чотири операції:

  • присвоєння =;

  • виклику функції();

  • при індексування [];

  • при доступу до вказівника ->;

  • допускається перенавантажувати тільки як методи класу.

Ці операції в принципі не можна перенавантажувати для конструкції enum.

  1. Якщо операція перевантажується як метод класу, то лівим (або єдиним)аргументом обов'язково буде об'єкт класу, для якого перевантажується операція.

Прототип функції-операції виглядає таким чином:

тип орerator@(список параметрів):

де @ — символ операції. Слово орerator є зарезервованим словом і може використовуватися тільки у визначенні або у функціональній формі виклику операції.

Перевантаження операцій зовнішніми функціями

Прототип бінарної операції, що перенавантажується як зовнішня незалежна функція, виглядає так:

тип орerator @(параметр_1, параметр2);

Для забезпечення комутативної бінарної операції з параметрами різного типу, як правило, потрібно реалізувати дві функції-операції:

тип орerator@(паранетр_1. паранетр_2);

тип орerator@(параметр_2, параметр_1):

Хоч би один з параметрів повинен бути нового типу. Параметри можна передавати будь-яким допустимим способом. Звернення до операції виконується двома способами:

  • Інфіксна форма параметр_1 @ параметр 2

  • Функціональна форма орerator@(параметр_1, параметр_2)

Прототип унарної операції, перенавантажуваною незалежною зовнішньою функцією, відрізняється тільки кількістю параметрів:

тип орerator@(параметр);

Праметр повинен бути нового типу. Звертатися до переобтяженої операції слід так:

  • Інфіксна форма @ параметр

  • Функціональна форма орerator@(параметр)

Операції інкремента ++ і декремента - - мають дві форми: префіксну і постфіксну. У визначенні постфіксної форми операції повинен бути оголошений додатковий параметр типу int:

тип орerator @(параметр, int);

Цей параметр не повинен використовуватися в тілі функції. Інфіксна форма звернення до такої операції — параметр@; при функціональній формі звернення необхідно задавати другий фіктивний аргумент, наприклад

орerator @( параметр.0);

У лістингу 2.1 приведений приклад перевантаження операцій для перераховуючого типу.

Лістинг 2.1. Перевантаження операцій для перераховуючого типу

При перевантаженні операції зовнішньою для класу функцією поля повинні бути відкриті або клас повинен надавати методи get() і set() для отримання і зміни значень полів.

Приклад перевантаження операції зовнішньою функцією для класу показаний в лістингу 2.2.

Перевантаження операцій методами класу

У методів один параметр — поточний об'єкт — визначений за замовчуванням. Унарні операції виконуються для поточного об'єкту, який і є єдиним аргументом. Тому унарні операції, що перенавантажуються як методи класу, не мають параметрів. Прототип унарної операції, реалізованої як метод класу, виглядає так:

тип орerator @()

де @ — символ операції. Значення, що повертається, може бути будь-якого типу, у тому числі і визначуваного класу. Операція може повертати значення, посилання або вказівник на об'єкт. Дозволяється вказувати void на місці типу значення, що повертається.

Постфіксні операції інкремента і декремента є виключенням з цього правила. Щоб відрізнити постфіксну операцію від префіксної, в постфіксній формі задається фіктивний параметр типу inЬ, який реально не використовується.

Префіксна форма інкремента (і декремента) повинна мати прототип

тип& орerator @();

Постфіксна операція інкремента (і декремента) повинна мати прототип

тип орerator @(int);

Тип — це «імя_класу», в якому визначається операція.

Прототип бінарної операції має один аргумент і виглядає таким чином:

тип орerator@(параметр);

Параметри дозволяється передавати будь-яким зручним нам способом: по значенню, по посиланню або по вказівнику. Повертати метод-операцію теж може значення, вказівник або посилання на об'єкт, у тому числі і свого класу. Дозволяється вказувати void на місці типу значення, що повертається.

При реалізації методу-операції поза класом потрібний в заголовку звичайним способом вказувати префікс-ім'я класу:

тип клас: :орerator@()// унарна операція

тип клас::орerator@(параметр)// бінарна операція

Виклик унарної операції для об'єкту має форму

@обєкт

обєкт@

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

обєкт.орerator@()

Для постфіксної операції у функціональній формі виклику потрібно задавати фіктивний аргумент:

об'єкт. орerator@(0)

Функціональна форма виклику для бінарної операції, визначеної як метод класу, виглядає так:

об'єкт. орerator@( аргумент)

Інфіксна форма

об'єкт @ аргумент

є скороченням функціональної.

Операції привласнення є бінарними операціями, тому повинні мати один аргумент. Якщо операція присвоєння орerator= не реалізується явно, то вона створюється автоматично за замовчуванням. Для будь-якого класу автоматично створювана операція привласнення має прототип

клас& орerator(const клас &r)

Допускається реалізувати операцію привласнення з параметром і результатом не свого класу, що повертається; дозволяється передавати параметр будь-яким способом; повертати можна не посилання, а значення або вказівник — все залежить від потреб завдання.

Інші операції з привласненням автоматично не створюються. Функції-операції з привласненням зазвичай повинні повертати посилання на поточний об'єкт. Будь-який метод, що повертає неконстантне посилання, можна використовувати багато разів.

Мопеу& Мопеу::орerator+=(const Мопеу &b)

Повторне використання можна явним чином заборонити, якщо повертати константне посилання, наприклад

const Мопеу& Мопеу::орerator+=(const Мопеу &b)

Модифікатор const забороняє подальшу модифікацію результату.

Функції-друзі класу

Будь-яка зовнішня функція, визначена як «друг» класу, має необмежений доступ до будь-яких елементів класу, у тому числі і до закритих. Для того, щоб зовнішня функція стала іншому класу, необхідно в інтерфейсі класу задати її прототип, додавши попереду слово тмend()1, наприклад

friend Моnеу operator*(const; long double &а, const Мопеу &b);

При реалізації функції слово friend писати забороняється. Не вказується також і префікс класу.

Рекомендовані форми перевантаження операцій для класу приведені в табл. 2.1. Зокрема, операції введення/виведенняoperator » і operator « практично завжди реалізуються як зовнішні дружні функції. Наприклад, для класу Two з двома полями х і у цілого типу ці функції можуть виглядати так:

ostream& operator «(ostream& t, const Two &r) {

return (t) '(' « r.х « '.' « r.у « ')');}

istream& operator »{ istream & t, Two &г) {

р. » r.х » r; return t; }

Приклад перевантаження операцій методами класу і дружніми функціями показаний в лістингу 2.3.

Лістинг 2.3. Перевантаження операцій методами класу

Таблиця 2.1. Форма перевантаження операцій

Операція

Рекомендована форма перевантаження

Всі унарні операції

Метод класу

= [] 0 -> ->*

Обов'язково метод класу

+= -= /= %= &= |= ^= <<= >>=

Метод класу

Решта бінарних операцій

Зовнішня функція-друг

Завдання

В всіх завданнях, крім вказаних операцій, обов’язково повинні бути реалізовані наступні методи:

      • Метод ініціалізації Init;

      • Ввід з клавіатури Read;

      • Вивід на екран Display;

      • Перетворення в стрічку toString;

Всі завдання повинні бути реалізовані трьома способами:

      • Тип даних відображається структурою з обов’язковими полями, а операції реалізуються як зовнішні функції, які отримують об’єкти даного типу в якості аргументів;

      • Як класу з закритими аргументами, де операції реалізуються як методи класу;

      • Інкапсулювати поля класу в незалежній структурі, а також в ній реалізувати методи Init(), Read(), Display(), toString(); в головному класі повинно бути одне поле даних представлених об’єктом-структурою.

  1. Комплексне число представляється парою дійсних чисел (a, b), де а – дійсна частина, b – уявна частина. Обов’язково мають бути присутні такі операції:

      • Додавання add, (a, b)+(c, d) = (a+b, c+d);

      • Віднімання sub, (a, b)-(c, d) = (a-b, c-d);

      • Множення mul, (a, b)*(c, d) = (ac-bd, ad+bc);

      • Ділення div, (a, b)/(c, d) = (ac+bd, ad-bc) / (c­2 +d2);

      • Порівняння equ, (a, b)=(c, d), якщо (a=с) і (b=d);

      • Число зв’язку conj, conj (a, b)= (a,-b).

  1. Створити клас vector 3D, заданий трьома координатами. Обов’язково повинні бути реалізовані: додавання та віднімання векторів, скалярне відтворення векторів, множення на скаляр, порівняння векторів, обчислення довжини векторів і порівняння їх довжини.

  2. Створити клас ModelWindow для роботи з моделями екранних вікон. В якості полів задаються: заголовок вікна, координати верхнього лівого кута, розмір по горизонталі, розмір по вертикалі, колір вікна, стан « видиме / невидиме », стан « з рамкою / без рамки ». Координати та розміри вказуються цілими числами. Реалізувати операції: рух вікна по горизонталі, по вертикалі; зміна висоти і/або ширини вікна зміни кольору; зміна стану, запит стану. Операції пересування і зміни розміру повинні здійснювати перевірку на перетин межі екрану. Функція виводу на екран повинна індукувати стан полів об’єкти.

  3. Створити клас Money для роботи з грошовими сумами. Число має бути представлене двома полями: типу log для гривень і типу unsigned char – для копійок. Дробова частина (копійки) при виводі на екран повинна бути відділена від цілої комою. Реалізувати додавання, віднімання, ділення сум, ділень суми на дробове число, множення на дробове число і операції порівняння.

  4. Створити клас Trinagle для представлення трикутника. Поля даних повинні включати кути і сторони. Потрібно реалізувати операції: отримання і зміни полів даних, обчислення площі, обрахунок периметру, обчислення висот, а також визначення виду трикутника (рівносторонній, рівнобедрений або прямокутний).

  5. Створити клас Angle для роботи з кутами на площині, що задаються величиною в градусах і мінутах. Обов’язково повинні бути реалізовані: переведення в радіани, приведення до діапазону 0-360, збільшення і зменшення кута на задану величину, отримання синуса, порівняння кутів.

  6. Створити клас Point для роботи з точками на площині. Координати точки – Декартові. Обов’язково повинні бути реалізовані: переміщення точки о осі X, переміщення по осі Y, визначення відстані до початку координат, відстань між двома точками, перетворення в полярні координати, порівняння на співпадіння і неспівпадіння.

  7. Раціональний (нескорочуваний) дріб представляється парою цілих чисел (a, b), де a – чисельник, b – знаменник. Створити клас Rational для роботи з раціональними дробами. Обов’язково повинні бути реалізовані операції:

      • додавання add, (a, b) + (c, d) = (ad + bc, bd);

      • віднімання sub, (a, b) – (c, d) = (ad – bc, bd);

      • множення mul, (a, b) · (c, d) = (ac, bd);

      • ділення div, (a, b) / (c, d) = (ad, bc);

      • порівняння equal, greate, less.

  1. Повинна бути реалізована приватна функція скорочення дробу reduce, котра обов’язково викликається при виконанні арифметичних операцій.

  2. Створити клас Date для роботи з датами в форматі «рік.місяць.день». Дата представляється структурою з трьома полями типу unsigned int: для року, місяця и дня. Клас має включати не менше трьох функцій ініціалізації: числами, рядками вигляду «рік.місяць.день» (наприклад «2004.08.31») і датою. Обов’язковими операціями є: визначення дати через задану кількість днів, вирахування заданої кількості днів з дати, визначення високосності року, присвоєння і отримання окремих частин (рік, місяць, день), порівняння дат (дорівнює, до, після), визначення кількості днів між датами.

  3. Створити клас Time для роботи з часом в форматі «година:хвилина:секунда». Клас повинен включати не менше чотирьох функцій ініціалізації: числами, стрічкою (наприклад «23:59:59»), секундами та часом. Обов’язковими операціями будуть: обчислення різниці між двома моментами часу (в секундах), додавання часу і заданої кількості секунд, віднімання від часу заданої кількості секунд, порівняння моментів часу, перевід в секунди, перевід в хвилини (з заокругленням до цілої хвилини).

  4. Реалізувати клас FazzyNumber для роботи з не визначеними числами представлення яких задане трьома числами (x – e1,x,x+e2). Для чисел A = (A – a1, A, A + ar ) та B = (B – b1, B, B + br) арифметичні операції виконуються по наступним формулам:

      • Додавання A + B = (A + B – a1 – b1, A + B, A + B + ar + br);

      • Віднімання A – B = (A – B – a1 – b1, A – B, A – B + ar + br);

      • Множення A * B = (A * B –B * a1 – A * b1 + a1 * b1 , A * B, A * B +B * al + A * bl +al * bl);

      • Обернене число A = (1/(A + ar), 1/A, 1/(A + ar)), A > 0 ;

      • Ділення A / B = ((A – a1) / (B * br), A / B, ((A – ar) / (B * bl)), B > 0;

  1. Реалізувати клас Account, який являє собою банківський рахунок. В класі повинно бути чотири поля: призвіще власника, номер рахунку, процент начислення та сума начислення в грошових одиницях. При відкритті нового рахунку відбувається операція ініціалізації. Необхідно виконати наступні операції: зміна власника рахунку, зняття певної суми коштів з рахунку, покласти кошти на рахунок, нарахувати проценти, перевести суму в долари, перевести суму в євро, відобразити суму прописом (перетворити в чисельне).

  2. Номінали українських гривень можуть мати значення 1, 2, 5, 10, 20, 50, 100, 500, 1000, 5000. Копійки представити у вигляді 0.01(1 копійка), 0.05 (5 копійок), 0.1 (10 копійок), 0.5 (50 копійок). Створити клас Money для роботи з сумами. Сума повинна бути представлена полями-номіналами, значеннями яких повинні бути кількість купюр даного номіналу. Реалізувати додавання сум, віднімання сум, ділення суми, ділення суми на дробове число, множення суми на дробове число і операцію порівняння. Дробова частина (копійки) при виведенні на екран повинна відділятися комою від цілої частини.

  3. Реалізувати клас Bankomat, який буде моделювати роботу банкомата. В класі повинні бути присутні поля для зберігання ідентифікаційного номера банкомата, інформації про суму грошей, яка ще є в касі банкомату, мінімальної та максимальної сумах, які дозволяється зняти клієнтом в один день. Сума грошей представлена полями-номіналами 10-1000 (див. завдання 13). Реалізувати метод ініціалізації банкомату, метод загрузки купюр в банкомат і метод зняття конкретної суми грошей. Метод зняття коштів повинен виконувати перевірку на коректність суми, що знімається: вона не повинна бути меншою від мінімального значення і не перевищувати максимальне. Метод toString() повинен перетворювати в стрічку суму коштів, які є в касі банкомату.

  4. Створити клас Fraction для роботи з дробовими числами. Число має бути представлене двома полями: ціла частина – довге ціле зі знаком, дробова частина – коротке беззнакове ціле. Реалізувати арифметичні операції додавання, віднімання, множення та операції порівняння.

  5. Створити клас Goods (товар). В класі мають бути представлені поля: найменування товару, дата оформлення, ціна товару, кількість одиниць товару, номер накладної, за якою товар поступив на склад. Реалізувати методи зміни ціни товару, зміни кількості товару (збільшення і зменшення), обчислення вартості товару. Метод toString() має видавати вартість товару у вигляді стрічки.

  6. Створити клас BitString для роботи з 64-бітовими рядками. Бітова стрічка має бути представлена двома полями типу unsigned long. Мають бути реалізовані всі традиційні операції для роботи з бітами: and, or, xor, not. Реалізувати зсув вліво shiftLeft та зсув вправо shiftRight на задану кількість біт.

  7. Створити клас LongLong для роботи з цілими числами з 64 біт. Число має бути представлене полями: long – старша частина, unsigned long – молодша частина. Мають бути реалізовані арифметичні операції, що присутні в C++ (без присвоєння), і порівняння.

  8. Створити клас Paymaent (зарплата). В класі мають бути представлені наступні поля: прізвище-ім’я-по-батькові, ставка, рік прийняття на роботу, відсоток надбавки, подохідний податок, кількість відпрацьованих днів за місяць, кількість робочих днів в місяці, начислена та утримана суми. Реалізувати методи: обчислення нарахованої суми, обчислення утриманої суми, обчислення суми, що видається на руки, обчислення стажу. Стаж визначається як повна кількість років, що минули від року прийняття на роботу, до поточного року. Нарахування являє собою суму, нараховану за відпрацьовані дні, і надбавки, тобто долі від першої суми. Утримання є відчисленнями в пенсійний фонд (1 % від нарахованої суми) и подохідний податок. Подохідний податок складає 13 % від нарахованої суми без відрахувань до пенсійного фонду.

  9. Реалізувати клас Cursor. Полями є координати курсору по горизонталі та вертикалі – додатні цілі числа, вигляд курсору – горизонтальний або вертикальний, розмір курсору – ціле від 1 до 15.Реалізувати методи зміни координат курсору, метод гасіння і відновлення курсору.

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