Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / oop-2025 / week13 / index.du
blob: 7a9d9206197bd7fa3c3ffa11a9920f6788261dc8 (plain) (blame)
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
# Задачи - ООП, Седмица 13, 20.05.2026

'define expected-reading 3 min
'define created 20 May 2026
'define edited 20 May 2026
[$pagenav]

## За решаване

### Задача 1

Реализирайте абстрактен клас [`Numeric`], който съдържа чисто виртуални функции:
.bulleted
- [`operator+`]
- унарен [`operator-`]

И имплементира член-функциите:
.bulleted
- бинарен [`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`].
Трябва да съхраните всички потребители в [=полиморфен=] масив с елементи от тип [`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`].
Сравненията между масиви са спрямо бройката елементи.