Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / oop-2023 / week10 / index.du
blob: 1cc62a52890d313fb6433e2fec8c3dd4b57a4369 (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
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
'def title Задачи - ООП, Седмица 10, 25.04.2024
'def  desc Условия на задачите за упражнение

# {title}

\n

GitHub classroom: {url classroom.github.com/a/PbkITWhF;https://classroom.github.com/a/PbkITWhF}

## Преговорни

.warn Моля, не отделяйте на преговорните задачи повече от 30мин

### Задача 1 - Шаблони

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise01}

Реализирайте шаблонен клас {` Array}, който запазва динамично-заделен и оразмеряем масив от елементи с подаден тип.
Имплементирайте голяма четворка.

### Задача 2 - Оператори

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise02}

За предходния шаблонен клас имплементирайте оператори:

.unordered
- [], който връща референция към елемента на подадения индекс
- == и !=, които сравняват поелементно
- +, += които конкатенират (слепват) два масива

### Задача 3 - Грешки

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise03}

Имплементирайте функция, която приема име на текстов файл и изкарва на екрана първия ред от него.
Ако файлът не може да бъде отворен, хвърлете грешка - низ.
Ако във файлът няма други редове (няма знакът {` '\\n'}), тогава хвърлете грешка число - размерът на файла.

В главната функция, приемете името на файла от потребителския вход и извикайте функцията.
Ако файлът не може да бъде отворен, тогава изкарайте хвърлената грешка на терминала и приключете програмата (успешно).
Ако няма други редове в него, тогава изкарайте съобщението "In X characters, there is no newline!", където X е хвърленото число, и пробвайте да приемете пак име на файла от потребителския вход.

## Лесни

### Задача 4

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise04}

Реализирайте клас {` Time24}, който запазва час и минути (в 24-часов формат) в две отделни целичислени член-данни.
Имплементирайте член-функция {` Print24}, която изкарва часа на екрана в 24-часов формат.
Нека конструкторът му приема две целочислени променливи, една за часа и втора за минутите.

Реализирайте негов наследник {` Time12}, който имплементира метод {` Print12}, принтиращ часа в 12-часов формат.
Имплементирайте и негов конструктор, който приема две целочислени променливи (една за часа и една за минутите), заедно с булева променлива описваща дали часа е следобеден или не.

### Задача 5

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise05}

Реализирайте клас {` FN}, който запазва факултетен номер като неотрицателно цяло число от 5 цифри.
Реализирайте негов наследник {` ModernFN}, който запазва и начален (префиксен) низ, състоящ се от цифра, две букви и още две цифри.

Имплементирайте конструктори, като този на {` FN} приема число, докато този на {` ModernFN} приема низ, състоящ се от целия факултетен номер (и трябва да конвертирате последните 5 цифри към число).
Имплементирайте метод {` PrintOldFN} на класа {` FN} и метод {` PrintNewFN} на класа {` ModernFN}, които изкарват целия факултетен номер на съответния клас.

### Задача 6

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise06}

Реализирайте клас {` Grade}, който запазва оценка (от 2 до 6) като неотрицателна целочислена член-данна.
Реализирайте и негов наследник {` GradeWithName}, който запазва и името на оценката като низ с произволна дължина.

Конструктора на {` Grade} приема само числовата стойност, докато този на наследника приема и името на оценката.
Имплементирайте голяма петица на {` GradeWithName}.

### Задача 7

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise07}

Реализирайте клас {` String}, който запазва низ с произволна дължина.
Имплементирайте голяма петица и член-функция {` At}, която приема индекс и връща референция към буквата на този индекс (при невалиден индекс хвърляте грешка).

Реализирайте негов наследник {` FileString}, който запазва и името на текстов файл като низ с произволна дължина.
Ако е нужно, имплементирайте голяма петица.

Самия низ в {` FileString} е първия низ (начало първата буква и край {` '\\n'}) от файла с подадено име.

Имплементирайте метод {` ChangeAt}, който приема индекс и нова буква, променя буквата на дадения индекс с подадената и обновява файла със запазеното име.

### Задача 8

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise08}

Реализирайте клас {` User}, който запава име и парола като два низа с произволна дължина.
Реализирайте негов наследник {` Moderator}, който запазва и подпис, който също е низ с произволна дължина.
Реализирайте наследник {` Administrator} на {` Moderator}, който запазва и оразмеряващ се масив от цели числа.

Идеята е, че всяко действие от модератор или администратор се "подписва" публично (за да се знае, че той го е направил, дори да си смени името), а за администратор допълнително пазим масив от идентификатори на форуми, които администрира.

За всеки клас имплементирайте голяма петица и гетъри и сетъри за името и паролата, когато е нужно.
За {` Moderator} имплементирайте гетър за подписа, но без сетър.
За {` Administrator} имплементирайте методи за добавяне и премахване на идентификатор на форум.

### Задача 9

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise09}

Реализирайте клас {` CommunicationPacket}, който запазва начален и краен адрес като две неотрицателни цели числа, заедно с трето число за размера на данните.
В този клас никога няма данни, затова размера винаги е нула.

Реализирайте негови наследници {` StringPacket} и {` IntPacket}, където първия запазва и низ с произволна дължина (и дължината му е размера на данните) докато втория запазва и едно цяло число (и размера на {` int} е размера на данните).

Размерът не се подава на конструктори, а се изчислява в конструктори.
Имплементирайте голяма петица и конструктори с нужните параметри.

### Задача 10

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise10}

Реализирайте клас {` String}, който запазва низ с произволна дължина, и имплементира оператори ==, !=, + (който връща нов низ с конкатенацията на двата низа).

Реализирайте негов наследник {` ModifiableString}, който имплементира оператор[] (връщащ референция към буквата на дадения индекс) и оператор+=.

Реализирайте наследник на {` ModifiableString}, {` ShowableString}, който имплементира оператори << и >>.
Реализирайте наследник на {` ModifiableString}, {` SaveableString}, който имплементира методи write и read, приемащи име на двоичен файл и записващи или четещи низа от този файл.

За всички класове имплементирайте голяма петица, когато е нужно.

## Трудни

### Задача 11

Реализирайте шаблонен клас {` Array}, който запазва оразмеряем масив с елементи от подаден тип.
Имплементирайте оператор== и оператор!=, заедно с метод {` isEmpty}.
Концептуално идеята е, че този масив не може да се променя след като му се въведат стойностите от конструктора.

Реализирайте негов наследник {` PrintableArray}, който имплементира оператори << и >>.
Реализирайте наследник {` SaveableArray} на {` Array}, който имплементира методи write и read, приемащи име на файл и булева стойност дали е двоичен или не, и съответно прочитат или запазват елементите от този масив във файла.

Реализирайте трети наследник, {` ModifiableArray}, на {` Array}, в който са имплементирани член-функции:

.unordered
- {` push}, която приема елемент и го вмъква в (десния) края на масива
- {` pop}, който премахва елемент от (десния) края на масива
- {` last}, който връща последния елемент от масива

Може да се налага масива да се оразмерява.
Като подсказка, имплементирайте си метод, наличен за класа и наследници, който вмъква елемент на произволен индекс.

Реализирайте наследник {` IndexableArray} на {` ModifiableArray}, който имплементира оператор[].
Ако индекса е след края, тогава "вмъквате" елементи по подразбиране между края и подадения индекс, и връщате елемента от сега новия край.
Реализирайте наследник {` FrontableArray} на {` ModifiableArray}, който имплементира методи {` pushf} и {` popf}, които работят като {` push} и {` pop}, но с елемента в началото на масива (първия елемент).