diff options
1 files changed, 113 insertions, 0 deletions
| -rw-r--r-- | src/teaching/oop-2025/week09/index.du | 113 |
diff --git a/src/teaching/oop-2025/week09/index.du b/src/teaching/oop-2025/week09/index.du new file mode 100644 index 0000000..677accd --- /dev/null +++ b/src/teaching/oop-2025/week09/index.du @@ -0,0 +1,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"`]. + +Ако ни се подаде низ с по-голям размер от очаквания, трябва да съхраним само броя знаци, които очакваме. +Ако ни се подаде низ, който не очакваме, трябва да го игнорираме. |