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
|
'def title Задачи - ООП, Седмица 13, 20.05.2026
'def desc Условията на задачите за упражнение.
# {title}
{pagenav 3 min;20 May 2026;20 May 2026}
## За решаване
### Задача 1
Реализирайте абстрактен клас {` Numeric}, който съдържа чисто виртуални функции:
.bulleted
- {` operator+}
- унарен {` operator-}
- бинарен {` operator-}
- {` operator+=}
- {` operator-=}
Реализирайте негови наследници {` Integer} и {` Float}, които съответно имплементират операции върху {` int} и {` float} стойности.
### Задача 2
Реализирайте клас {` User}, който съхранява идентификационен номер и входен ПИН код.
Имплементирайте (виртуална) член-функция {` LogIn}, която връща дали подадения ѝ ПИН код съответства на запазения.
Реализирайте наследник {` Citizen}, който разширява функцията {` LogIn}, така че винаги да отказва числа, които имат повече от 4 цифри.
Реализирайте наследник (на {` User}) {` Clerk}, който допълнително съхранява статичен код.
{` LogIn} в този случай е успешен, когато {` ((ВХОДЕН_ПИН + СЪХРАНЕН_ПИН) * СТАТИЧЕН_КОД) % 115249 = 347}.
Пример за валидни стойности са 700 за съхранен пин, 3141 за входен пин и 47978 за статичен код.
Реализирайте наследник (на {` User}) {` System}, при който {` LogIn} е валидно, когато подадения пин е точен квадрат на съхранения пин.
От входа получавате неотрицателно цяло число {` N} и след това данни за {` N} на брой потребителя.
При всеки потребител се поисква буква, определяща неговия тип: {` c} за {` Citizen}, {` l} за {` Clerk} и {` s} за {` System}.
Трябва да съхраните всички потребители в {b полиморфен} масив с елементи от тип {` User*}.
След това от входа ще получавате идентификационен номер и пин код, и трябва да върнете дали подадените данни са валидни за влизане в акаунта.
### Задача 3
Реализирайте клас {` String}, който съхранява динамично-задлен низ.
Освен голяма петица, имплементирайте виртуален мутатор и константен селектор към низа.
Реализирайте клас {` Username}, наследник на {` String}, чиито мутатор приема единствено низове, които съдържат само главни и малки латински букви.
Реализирайте клас {` Match}, наследник на {` String}, който съхранява допълнителен динамично-заделен низ {` pattern} и бройка {` matches}.
За {` pattern} има друг селектор и мутатор.
При всяка промяна на {` pattern} и оригиналния низ, {` matches} се обновява с бройката (потенциално препокриващи се) срещания на {` pattern} в низа.
### Задача 4
Реализирайте шаблонен клас {` Indexable}, който съхранява чисто-виртуален не-константен {` operator[]}, и имплементира константен {` operator[]}, базиран на не-константния.
Реализирайте клас {` Compareable}, който съхранява чисто-виртуални {` operator<} и {` operator==}, и имплементира останалите оператори за сравнение ({` <=}, {` >}, {` >=}, {` !=}), използвайки чисто-виртуалните.
Реализирайте клас {` Dynamic}, който въхранява чисто-виртуални не-публични методи {` free}, {` copyFrom} и {` init}, и имплементира компонентите от голямата петица, използвайки тези методи.
Реализирайте клас {` Vector}, който съхранява динамично-заделен масив от елементи и е наследник и на трите класа.
Сравненията между вектори са спрямо бройката елементи.
Реализирайте клас {` Integer}, който съхранява динамично-заделен {` int} и наследява {` Compareable} и {` Dynamic}.
Реализирайте шаблонен клас {` Array}, който съхранява статично-заделен масив, чиито елементи и тяхна бройка се подават като част от типа, и който наследява {` Indexable} и {` Compareable}.
Сравненията между масиви са спрямо бройката елементи.
|