Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / oop-2025 / week09 / index.du
blob: 677accd71947b5f3ab5dda5d695175f6799b4a45 (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
# Задачи - ООП, Седмица 9, 15.04.2026

'define expected-reading 5 min
'define created 14 April 2026
'define edited 15 April 2026
[$pagenav]

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

### Задача 1

Реализирайте клас [`Locomotive`], който съдържа:
.bulleted
- идентификационен номер
- име на производител
- име на модел
- дата на производство
- дължина в милиметри
- брой цилиндри в двигателя
- дали поддържа връзка с втори локомотив, така че и двата да се управляват от един машинист (так. нар. [url https://en.wikipedia.org/wiki/Multiple_working multiple working])

За него реализирайте нужните селектори и мутатори.

Реализирайте и приятелска функция, чрез която съдържанието може да се прочете от поток и запише в поток.
Нека записването в поток да следва следния шаблон:

```
Train #9999
+ Model: ZZZ
+ Manufacturer: ZZZ
+ Year of manufacture: 2000
- Length: 9999mm
- Engine cyllinders: 9999
- Multiple working: Yes

### Задача 2

Реализирайте клас [`Vector`], който съхранява неограничено количество от числа с плаваща запетая.

Реализирайте оператори:
.bulleted
- [`+`], който покомпонентно събира елементи
- [`-`], който покомпонентно изважда елементи
- [`&`], който връща евклидовата дължина на вектора
- [`*`], който връща умножение на вектор и скалар
- [`*`], който връща точковото (покомпонентно) умножение на два вектора
- [`^`], който връща векторнотно умножение на векторите
- [`||`], който връща дали двата вектора са паралелни
- [`==`], който връща дали двата вектора са равни
- [`!=`], който връща дали двата вектора са различни

За всички тези оператори реализирайте съотвените оператори за присвояване ([`+=`], [`-=`], ...).
Ако единия вектор има повече елементи, нека те да се игнорират/оставят.

### Задача 3

Реализирайте клас [`String`], който съхранява низ с неограничен размер.
Имплементирайте следните оператори:
.bulleted
- [`+`], конкатенира (слепва) втория низ в края на първия
- [`==`], [`!=`], [`>`], [`>=`], [`<`], [`<=`], които сравняват двата низа (както [`strcmp`] ги сравнява)
- [`[]`], който връща буква по подаден индекс
- [`[]`], който връща подниза между два индекса (вкл.), разделени със запетая.
  Тоест [`text[3, 5]`] трябва да върне подниз с начало и край индекси 3 и 5.
  [*Упътване:*] използвайте помощен клас.
- [`<<`], който връща дали левия низ завършва със съдържанието на десния низ
- [`>>`], който връща дали десния низ започва със съдържанието на левия низ

### Задача 4

Реализирайте клас [`Rover`], който съхранява координатите на движещ се роувър.
В началото роувъра започва в координати [`(0,0)`] и сочи напред (към [`(0,1)`])

Реализирайте следните оператори:
.bulleted
- [`<`], роувъра от дясната страна на оператора се придвижва наляво с лявата страна на брой единици
- [`>`], роувъра от лявата страна на оператора се придвижва надясно с дясната страна на брой единици
- [`^`], роувъра от лявата страна на оператора се придвижва напред с дясната страна на брой единици
- [`<<`], роувъра от дясната страна на оператора се завърта обратно на часовниковата стрелка с лявата страна на брой градуси
- [`>>`], роувъра от лявата страна на оператора се завърта по часовниковата стрелка с дясната страна на брой градуси

Реализирайте и съответните оператори за вход/изход от/към поток.

### Задача 5

Реализирайте клас [`StringArray`], който съхранява неограничено (и оразмеряемо) количество низове.
Реализирайте нужните оператори и помощни класове, чрез които следния код е валиден:

```c++
StringArray s;
s[ Z(5) +++ 6 +++ 7 ] ("") ("Hello"|"World") [ Z(4) +++ 5 +++ 1 ] ("!") [ Z(2) ] ("Code"|"A"|"B")

В квадратните скоби се изреждат максимални размери на очаквани низове, разделени с [`+++`].
В кръглите скоби се подават низове, разделени с [`|`].
Класът [`Z`] е помощен, за експлицитно конвертиране на числата.

.question
Защо ни трябва експлицитното конвертиране?

Тоест,
.bulleted
- първо очакваме три низа, с максимални размери от 5, 6 и 7
- след това ни се подава един низ с размер 0
- след това ни се подават два низа, съответно с размери 5 и 5
- след това очакваме три низа, с максимални размери от 4, 5 и 1
- след това ни се подава един низ с размер 1
- след това допълнително очакваме един низ с размер 2
- след това ни се подават три низа, с размери 4, 1 и 1

Финално, в [`s`] трябва да имаме низовете [`"", "Hello", "World", "!", "Code", "A", "B"`].

Ако ни се подаде низ с по-голям размер от очаквания, трябва да съхраним само броя знаци, които очакваме.
Ако ни се подаде низ, който не очакваме, трябва да го игнорираме.