1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
# Задачи - ООП, Седмица 12, 09.05.2024
*Този файл е копие на задачите от: [syndamia.com/teaching/oop-2023/week12](https://syndamia.com/teaching/oop-2023/week12)*
### Задача 1
&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise1)
<!-- Multiple inheritance -->
Реализирайте клас `Publication`, който пази:
- низ от максимална дължина 1023, съхраняващ автори и
- втори низ с максимална дължина от 255, съхраняващ име на (научно) списание.
Реализирайте клас `TextDocument`, който пази неоразмеряем низ с текстово съдържание и неговия размер.
Реализирайте наследник на двата класа `ScientificPaper`, който допълнително пази и низ от максимално 511 знака, съдържащ име на научна дисциплина.
За всички класове реазлизирайте оператор <<.
### Задача 2
*Не говорим за нея, условието беше толкова сбъркано, че се наложи да я сваля*
### Задача 3
&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise3)
Реализирайте абстрактен клас `MobileDevice`, който запазва:
- телефонен номер като цяло неотрицателно число и
- масив с максимална дължина от 511 знака за текстово съобщение.
Допълнително нека:
- класът да задължава имплементацията на метод `Show`,
- да има член-функция `CanAccept`, която по подадено "хиперсъобщение" връща дали неговия номер съвпада с този на класа.
Под "хиперсъобщение" имаме предвид низ, който започва с телефонния номер, след това има шпация и след това е самото съобщение.
- да има член-функция `Accept`, която по подадено "хиперсъобщение" запазва текстовото съобщение.
Ако номерът не съответства тогава хвърля грешка.
Реализирайте негов наследник `Telephone`, за който `Show` изкарва съобщението на екрана.
Реализирайте втори негов наследник `Pager`[^pager], който съхранява име на файл (като динамично-заделен низ) и `Show` изкарва съобщението в съответния файл.
Разбира се, имплементирайте голяма петица.
Реализирайте клас `TelecommunicationCompany`, който съхранява динамично-заделен и оразмеряем масив от (указатели към) `MobileDevice`.
Имплементирайте всичко, **което е възможно**, от голяма петица.
### Задача 4
&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise4)
<!-- Multiple inheritance with mixed class types, polymorphic container, and copying -->
Реализирайте клас `Employee`, който запазва:
- заплата като число с плаваща запетая и
- производителост също като число с плаваща запетая.
Производителността е множител на заплатата, тоест ако има производителност 0.5 значи работи като човек на който му плащат с половината заплата.
Реализирайте абстрактен клас `Person`, който запазва:
- име като низ с произволна дължина и
- възраст като цяло неотрицателно число
Допълнително задължава реализацията на член-функция `Workload`, връщаща стойност с плаваща запетая.
Разбира се имплементирайте голяма петица.
Реализирайте наследник на двата класа на име `Developer`, който допълнително запазва:
- цяло неотрицателно число - брой проекти в които участва, и
- второ което е брой проекти на които ще се пуска нова версия.
Реализирайте оператори `++` и `--`, като префиксните променят броя проекти на които ще се пуска нова версия, докато постфиксните променя броя проекти в които участва.
За него `Workload` се определя като 1.1 по всеки проект и допълнително по 2.3 за всеки проект на който ще се пуска нова версия.
Реализирайте наследник на двата класа на име `Manager`, който допълнително запазва динамично-заделен и оразмеряем масив от `Person`, които менижира.
Имплементирайте голяма петица и:
- оператори `==` и `!=`, сравняващи хора по име
- член-функция `StartManaging`, която приема `Person` и го запазва, и
- член-функция `StopManaging`, която приема `Person` и го премахва от масива ако съществува в него.
`Workload` се определя като 0.6 на човек който менижира.
Финално реализирайте клас `Company`, който запазва масив от 128 указателя `Person` в компанията.
Имплементирайте негова член-функция:
- `PaymentDifference`, която връща с колко платената заплата на всички служители се отличава с тази според тяхната производителност
[^pager]: От времето без мобилни телефони, хората са си купували пейджъри, които ти пращат нотификация ако някой ти звънне и не вдигнеш. Пейджърите са "заключени" за определени региони, тоест някой ти се обажда, не вдигаш, и всички телекомуникционни кули в региона изпращат съобщение "на теб ти звънна този", и пейджъра като засече сигнала ти писука. Мисля че също можеш да пращаш кратки съобщения. Не е било хич сигурна система, все още се ползва от болници в някои държави.
|