Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / oop-2025 / week08 / index.du
blob: 7286af7ead1e91ca2cf0d96ce0070d7296c03deb (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
'def title Задачи - ООП, Седмица 8, 08.04.2026
'def  desc Условията на задачите за упражнение.

# {title}

{pagenav 3 min;07 April 2026;08 April 2026}

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

### Задача 1

.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week08/Exercise01}

.warn
За всеки клас имплементирайте {b голяма петица!}
Всички методи трябва да достъпни и за константни обекти, когато е възможно.

Реализирайте система за менажиране на многостепенни ракети.
След изтрелване на ракетата, най-долната "степен" се активира.
При изразходване на горивото, тя се откача от другите степени и следващата степен се активира.

{img https://upload.wikimedia.org/wikipedia/commons/d/d6/Black_Brant.jpg}<br/>
{i В тази ракета, степените са оцветени по различен начин: бяло, червено и черно.}

Всяка степен си има:
.bulleted
- име, низ с максимална дължина от 100 символа
- височина в целочислени метри
- тежест в килограми
- тяга (lift force) в нютони
- време на горене в секунди

Една степен изразходва горивото си за "време на горене" секунди, като във всяка секунда прилага ускорение на себе си и товара с "тяга" нютони.
Може да зачитаме праволинейно ускорение и да не изчисляваме промяната на количеството гориво.
Това означава, че можем да използваме следните формули за дадена степен:

{img ./img/formulas.png}

Където:
.bulleted
- {` a} е ускорението,
- {` v{_ 0}} е началната скорост,
  за първата степен тя ще е 0,
  за втората тя ще е скоростта на първата степен,
  на третата ще е скоростта на втората степен и так. нат.
- {` x} е разстояние в метри.

Степените се комбинират в ракета.
Всяка ракета си има име и неограничен брой степени.

За една ракета имплементирайте методи, чрез които се намира:
.bulleted
- общата тежест на ракетата
- общата височина на ракетата
- финалната скорост на финалната степен
- общото разстояние което ракетата може да измине, в километри
- общото време в което ракетата ще гори

Допълнително, имплементирайте методи {` Export} и {` Import}, чрез които всички данни на една ракета се запазват или вземат в/от двоичен файл.

Неограничено количество ракети и необвързани степени се съхраняват в хангари.
Имплементирайте методи за добавяне на степени в хангара и {i преместване} на степени в ракети.

Освен това имаме площадки от които ракети могат да се изтрелват.
Всяка площадка съдържа:
.bulleted
- име с максимална дължина от 250 символа
- максимална тежест на ракета, която поддържа
- максимална височина на ракета, която поддържа

Финално, имаме космическа агенция, която съдържа неограничен брой хангари и площадки.
Всички хангари в космическата агенция могат да се експортират и импортират в един двоичен файл и всички площадки в един текстови файл.

Реализирайте конзолен интерфейс, който поддържа командите:
.bulleted
- {` exit}, която приключва програмата
- {` new_hangar}, която по подадени данни добавя нов хангар
- {` new_launch_site}, която по подадени данни добавя нова площадка
- {` new_rocket_stage}, която по подадени данни добавя нова степен в избран хангар.
  Ако такъв не съществува, да се добави в последния добавен хангар.
- {` new_rocket}, която по подадени данни добавя нова ракета в хангар.
  Степените ѝ трябва да са "пренесени" от хангар(и), {b не} да се създадат наново.
- {` can_launch}, която по подадени данни за площадка и ракета, връща дали ракетата може да бъде изтреляна от площадката