Задачи - ООП, Седмица 9, 15.04.2026
За решаване
Задача 1
Реализирайте клас Locomotive, който съдържа:
- идентификационен номер
- име на производител
- име на модел
- дата на производство
- дължина в милиметри
- брой цилиндри в двигателя
- дали поддържа връзка с втори локомотив, така че и двата да се управляват от един машинист (так. нар. multiple working)
За него реализирайте нужните селектори и мутатори.
Реализирайте и приятелска функция, чрез която съдържанието може да се прочете от поток и запише в поток. Нека записването в поток да следва следния шаблон:
Train #9999
+ Model: ZZZ
+ Manufacturer: ZZZ
+ Year of manufacture: 2000
- Length: 9999mm
- Engine cyllinders: 9999
- Multiple working: Yes
Задача 2
Реализирайте клас Vector, който съхранява неограничено количество от числа с плаваща запетая.
Реализирайте оператори:
-
+, който покомпонентно събира елементи -
-, който покомпонентно изважда елементи -
&, който връща евклидовата дължина на вектора -
*, който връща умножение на вектор и скалар -
*, който връща точковото (покомпонентно) умножение на два вектора -
^, който връща векторнотно умножение на векторите -
||, който връща дали двата вектора са паралелни -
==, който връща дали двата вектора са равни -
!=, който връща дали двата вектора са различни
За всички тези оператори реализирайте съотвените оператори за присвояване (+=, -=, ...).
Ако единия вектор има повече елементи, нека те да се игнорират/оставят.
Задача 3
Реализирайте клас String, който съхранява низ с неограничен размер.
Имплементирайте следните оператори:
-
+, конкатенира (слепва) втория низ в края на първия -
==,!=,>,>=,<,<=, които сравняват двата низа (кактоstrcmpги сравнява) -
[], който връща буква по подаден индекс -
[], който връща подниза между два индекса (вкл.), разделени със запетая. Тоестtext[3, 5]трябва да върне подниз с начало и край индекси 3 и 5. Упътване: използвайте помощен клас. -
<<, който връща дали левия низ завършва със съдържанието на десния низ -
>>, който връща дали десния низ започва със съдържанието на левия низ
Задача 4
Реализирайте клас Rover, който съхранява координатите на движещ се роувър.
В началото роувъра започва в координати (0,0) и сочи напред (към (0,1))
Реализирайте следните оператори:
-
<, роувъра от дясната страна на оператора се придвижва наляво с лявата страна на брой единици -
>, роувъра от лявата страна на оператора се придвижва надясно с дясната страна на брой единици -
^, роувъра от лявата страна на оператора се придвижва напред с дясната страна на брой единици -
<<, роувъра от дясната страна на оператора се завърта обратно на часовниковата стрелка с лявата страна на брой градуси -
>>, роувъра от лявата страна на оператора се завърта по часовниковата стрелка с дясната страна на брой градуси
Реализирайте и съответните оператори за вход/изход от/към поток.
Задача 5
Реализирайте клас StringArray, който съхранява неограничено (и оразмеряемо) количество низове.
Реализирайте нужните оператори и помощни класове, чрез които следния код е валиден:
StringArray s;
s[ Z(5) +++ 6 +++ 7 ] ("") ("Hello"|"World") [ Z(4) +++ 5 +++ 1 ] ("!") [ Z(2) ] ("Code"|"A"|"B")
В квадратните скоби се изреждат максимални размери на очаквани низове, разделени с +++.
В кръглите скоби се подават низове, разделени с |.
Класът Z е помощен, за експлицитно конвертиране на числата.
Тоест,
- първо очакваме три низа, с максимални размери от 5, 6 и 7
- след това ни се подава един низ с размер 0
- след това ни се подават два низа, съответно с размери 5 и 5
- след това очакваме три низа, с максимални размери от 4, 5 и 1
- след това ни се подава един низ с размер 1
- след това допълнително очакваме един низ с размер 2
- след това ни се подават три низа, с размери 4, 1 и 1
Финално, в s трябва да имаме низовете "", "Hello", "World", "!", "Code", "A", "B".
Ако ни се подаде низ с по-голям размер от очаквания, трябва да съхраним само броя знаци, които очакваме. Ако ни се подаде низ, който не очакваме, трябва да го игнорираме.
Защо ни трябва експлицитното конвертиране?