Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching
diff options
context:
space:
mode:
Commit1bc3f4fa0e3d8f04323965790d34ab10a566a058 (patch)
Author
 Syndamia <kamen@syndamia.com>
2026-04-26 21:56:29 +0300
Committer
 Syndamia <kamen@syndamia.com>
2026-04-26 21:56:29 +0300
Files86bd27c8cfd768e88fa1c73f1972e49990c1848a /src/teaching
syndamia.com-1bc3f4fa0e3d8f04323965790d34ab10a566a058.tar
syndamia.com-1bc3f4fa0e3d8f04323965790d34ab10a566a058.tar.gz
syndamia.com-1bc3f4fa0e3d8f04323965790d34ab10a566a058.zip
Parentfabe7766a4a07887c58f684de119ca3f2130b978 (diff)
feat(teaching/oop-2025/w09): Add solutions
2 files changed, 30 insertions, 10 deletions
-rw-r--r--src/teaching/oop-2025/index.du1
-rw-r--r--src/teaching/oop-2025/week09/index.du39
diff --git a/src/teaching/oop-2025/index.du b/src/teaching/oop-2025/index.du
index 5988d77..696a20d 100644
--- a/src/teaching/oop-2025/index.du
+++ b/src/teaching/oop-2025/index.du
@@ -113,6 +113,7 @@
|:
|:
[url ./week09 Задачи]
+|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09 Решения]
|: 10
|: 22.04.2026
diff --git a/src/teaching/oop-2025/week09/index.du b/src/teaching/oop-2025/week09/index.du
index 677accd..df7eb1e 100644
--- a/src/teaching/oop-2025/week09/index.du
+++ b/src/teaching/oop-2025/week09/index.du
@@ -2,26 +2,31 @@
'define expected-reading 5 min
'define created 14 April 2026
-'define edited 15 April 2026
+'define edited 26 April 2026
[$pagenav]
## За решаване
### Задача 1
+.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise01 Решение]
+
+.note
+[*(26.04.2026)*] Променено от "дата на производство" в "година на производство"
+
Реализирайте клас [`Locomotive`], който съдържа:
.bulleted
- идентификационен номер
- име на производител
- име на модел
-- дата на производство
+- година на производство
- дължина в милиметри
- брой цилиндри в двигателя
- дали поддържа връзка с втори локомотив, така че и двата да се управляват от един машинист (так. нар. [url https://en.wikipedia.org/wiki/Multiple_working multiple working])
За него реализирайте нужните селектори и мутатори.
-Реализирайте и приятелска функция, чрез която съдържанието може да се прочете от поток и запише в поток.
+Реализирайте и приятелски функции, чрез която съдържанието може да се прочете от поток и запише в поток.
Нека записването в поток да следва следния шаблон:
```
@@ -35,6 +40,8 @@ Train #9999
### Задача 2
+.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise02 Решение]
+
Реализирайте клас [`Vector`], който съхранява неограничено количество от числа с плаваща запетая.
Реализирайте оператори:
@@ -54,6 +61,8 @@ Train #9999
### Задача 3
+.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise03 Решение]
+
Реализирайте клас [`String`], който съхранява низ с неограничен размер.
Имплементирайте следните оператори:
.bulleted
@@ -61,13 +70,15 @@ Train #9999
- [`==`], [`!=`], [`>`], [`>=`], [`<`], [`<=`], които сравняват двата низа (както [`strcmp`] ги сравнява)
- [`[]`], който връща буква по подаден индекс
- [`[]`], който връща подниза между два индекса (вкл.), разделени със запетая.
- Тоест [`text[3, 5]`] трябва да върне подниз с начало и край индекси 3 и 5.
- [*Упътване:*] използвайте помощен клас.
+ Тоест [`text[X(3), 5]`] трябва да върне подниз с начало и край индекси 3 и 5.
+ [`X`] е помощен клас, наименуван по ваш начин.
- [`<<`], който връща дали левия низ завършва със съдържанието на десния низ
- [`>>`], който връща дали десния низ започва със съдържанието на левия низ
### Задача 4
+.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise04 Решение]
+
Реализирайте клас [`Rover`], който съхранява координатите на движещ се роувър.
В началото роувъра започва в координати [`(0,0)`] и сочи напред (към [`(0,1)`])
@@ -83,31 +94,39 @@ Train #9999
### Задача 5
+.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise05 Решение]
+
Реализирайте клас [`StringArray`], който съхранява неограничено (и оразмеряемо) количество низове.
Реализирайте нужните оператори и помощни класове, чрез които следния код е валиден:
+.note
+[*(26.04.2026)*]
+Обновени конвертирания, така че примера да работи.
+Променени първите три размери.
+
```c++
StringArray s;
-s[ Z(5) +++ 6 +++ 7 ] ("") ("Hello"|"World") [ Z(4) +++ 5 +++ 1 ] ("!") [ Z(2) ] ("Code"|"A"|"B")
+s[ Z(7) +++ Z(4) +++ Z(3) ] ("") (X("Hello")|"World") [ Z(4) +++ Z(5) +++ Z(1) ] ("!") [ Z(2) ] (X("Code")|"A"|"B");
В квадратните скоби се изреждат максимални размери на очаквани низове, разделени с [`+++`].
В кръглите скоби се подават низове, разделени с [`|`].
-Класът [`Z`] е помощен, за експлицитно конвертиране на числата.
+Класовете [`Z`] и [`X`] са класове, наименувани по ваш начин.
.question
Защо ни трябва експлицитното конвертиране?
+Защо числата винаги ги конвертираме експлицитно, а низовете само веднъж (когато са изредени повече от един)?
Тоест,
.bulleted
-- първо очакваме три низа, с максимални размери от 5, 6 и 7
+- първо очакваме три низа, с максимални размери от 7, 4 и 3
- след това ни се подава един низ с размер 0
-- след това ни се подават два низа, съответно с размери 5 и 5
+- след това ни се подават два низа, съответно с размери 5 и 5 (скъсяваме ги)
- след това очакваме три низа, с максимални размери от 4, 5 и 1
- след това ни се подава един низ с размер 1
- след това допълнително очакваме един низ с размер 2
- след това ни се подават три низа, с размери 4, 1 и 1
-Финално, в [`s`] трябва да имаме низовете [`"", "Hello", "World", "!", "Code", "A", "B"`].
+Финално, в [`s`] трябва да имаме низовете [`"", "Hell", "Wor", "!", "Code", "A", "B"`].
Ако ни се подаде низ с по-голям размер от очаквания, трябва да съхраним само броя знаци, които очакваме.
Ако ни се подаде низ, който не очакваме, трябва да го игнорираме.