Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / oop-2023 / week1 / index.du
blob: 5dd5787dd10458bd14c75f3e02b3e1f37bb49581 (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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
'def title Задачи - ООП, Седмица 1, 22.02.2024
'def  desc Условия на задачите за упражнение

# {title}

\n

GitHub classroom: {url classroom.github.com/a/UPJOzHty;https://classroom.github.com/a/UPJOzHty}

## Задача 1

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise1.cpp}

Имплементирайте низ чрез структура.
В структурата трябва да запазвате указател към низа и неговата дължина.

Имплементирайте функция {` concatString}, която приема две структури от този тип и връща низ, пак в същата структура, който е конкатенация (слепване) на първите два низа.

.question Има ли значение дали типовете на аргументите, или на върнатата стойност, са референции или указатели (или нито едното)?

В самия код тествайте функциите (не е нужен потребителски вход).

## Задача 2

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise2.cpp}

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

Заделянето на динамична памет е бавна операция, затова винаги ще заделяме повече клетки, отколкото са ни нужни.

Имплементирайте функция {` resize}, която удвоява размера на масива (нека първоначалния размер на масива е 2), на подадена стойност от тип вашата структура.

Имплементирайте функция {` addToEnd}, която приема (инстанция на) структурата ви и вмъква елемент в първата незаета позиция.

В самия код тествайте функциите (не е нужен потребителски вход).

## Задача 3

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise3.cpp}

Разглеждате "пакети" (логове) информация от редица датчици.
Един пакет запазва времето, когато информацията е била отчетена от датчиците, и стойностите на всички датчици: температура, атмосферно налягане, влажност и надморска височина.
Всички типове данни са целочислени.

От входа получавате N, броя пакети, които трябва да запазите, и след това 5N на брой целочислени стойности.
Накрая получавате буква: {` t}, {` p}, {` h}, {` e}, всяка съответства на някоя отделна стойност от датчиците.

Трябва да изкарате на екрана всичките стойности от пакетите, подредени в нарастващ ред на времето, като всички след първата са разликите им спрямо първата.

{b Пример:}

:table
:2
|= Вход
|= Изход

|:
```
6
56 45 64 -8 98
14 40 -15 -18 -1
22 89 72 62 4
85 44 60 17 13
75 18 -12 48 21
27 10 94 -5 16
p

|: -15 87 109 79 3 75



## Задача 4

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp}

'footnote sabre Защото една от първите индустрии, които са се нуждаели от компютърни системи, била {url авиационната индустрия;https://en.wikipedia.org/wiki/Sabre_%28travel_reservation_system%29#History}.

Направете структура за съхранение на полети{sabre}.
Трябва да запазите имената на началния и крайния град като низове (допускаме, че няма шпации в имената на градовете), часът на излитане и на кацане в целочислен формат (като на циферблат на дигитален часовник, без разделителното двоеточие) и цената на полета в тип с плаваща запетая (в долари).

### а) въвеждане

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L15-L36}

От входа получавате N, това определя броя полети, които трябва да се добавят в системата.
Всеки полет е редица от 5 стойности, в реда в който са дефинирани.

{i Напомням, че това е нагласено да ползвате {` std::cin} вместо ръчно да обработвате целия ред.}

Изкарайте началните и крайните градове, както и цената на полетите, подредени в нарастващ ред на час на излитане.

{b Пример:}

:table
:2
|= Вход
|= Изход

|:
```
5
Berlin Paris 1105 1255 140
Sofia Paris 0915 1115 140
Paris NewYork 1225 1610 500
Sofia NewYork 0610 1345 800
Sofia Berlin 1020 1130 200

|:
```
Sofia NewYork 800
Sofia Paris 140
Sofia Berlin 200
Berlin Paris 140
Paris NewYork 500



### б) търсене

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L38-L247}

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

Прикачване между полети е позволено, така че под "вариант" трябва да изкарате всичките полети, които са решение.
За един полет е нужно да изкарате само началния град, крайния град, час на излитане и цена, като градовете трябва да са подредени в нарастващ ред на часа на излитане.

{b Пример:}

:table
:2
|= Вход
|= Изход

|:
```
5
Berlin Paris 1105 1255 140
Sofia Paris 0915 1115 140
Paris NewYork 1225 1610 500
Sofia NewYork 0610 1245 800
Sofia Berlin 1020 1130 200
Sofia NewYork

|:
```
Cheapest:
Sofia Paris 0915 140
Paris NewYork 1225 500
Quickest:
Sofia NewYork 0610 800



## Задача 5

.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise5.cpp}

Имате система за потребители, всеки потребител си има име и приятели (един приятел е {b указател към потребител}).

В началото се въвежда N, това е броят потребители в системата.
За един потребител, първо се въвежда на нов ред името му, след това броя на неговите приятели и накрая, на отделни редове, имената на всички тези приятели.

Накрая получавате едно име, това е началния потребител.
Трябва да намерите, започвайки от него, с колко други потребителя има някаква приятелска връзка (директна, приятел на приятел, приятел на приятел на приятел, ...).

{b Пример:}

:table
:2
|= Вход
|= Изход

|:
```
5
Георги
2
Асен Гьонов
Майстора
Асен Гьонов
2
Георги
др. Божидаров
Майстора
1
Георги
др. Божидаров
1
Асен Гьонов
Павел
0
Майстора

|: 3