Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / oop-2025 / week01 / index.du
blob: bdfa9b2ea76a33998598c0dace7c343140d074fd (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
# Задачи - ООП, Седмица 1, 18.02.2026

'define expected-reading 2 min
'define created 17 February 2026
'define edited 22 February 2026
[$pagenav]

.warn Както винаги, [=НЕ=] може да използвате външни библиотеки и (почти) всичко от стандартната библиотека!

.info [*(22.02.2026)*] По-подробни условия, оправени някои грешки в условията.

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

### Задача 1

Реализирайте следните функции:

```c++
// Създава нова динамично-заделена матрица
int** newMatrix(unsigned rows, unsigned cols);
// Изтрива динамично-заделена матрица
void deleteMatrix(int**& matrix, unsigned rows); // Запишете nullptr в matrix!
// Връща сумата на всички елементи в матрицата
int sumMatrix(const int** matrix, unsigned rows, unsigned cols);

Поставете техните имплементации във файл [`matrix.cpp`] и техните дефиниции в [`matrix.h`].
Естествено, главната функция [=трябва да се намира извън [`matrix.cpp`]!=]

От входа получавате размерите и стойностите на две матрици с цели числа.
Изкарайте разликата, между сумата на елементите на първата матрица и на втората матрица.

:table_2
|= Вход
|= Изход

|:
```
3 3
1 2 3
4 5 6
7 8 9
4 2
13 10
-6 -5
100 101
-30 -20

|: -118

.comment 45 - 163 = -118


### Задача 2

Реализирайте следните функции:

```c++
// Сума на стойностите в elements
int sum(const int* elements, unsigned length);
// Средно аритметично на стойностите в elements
double average(const int* elements, unsigned length);
// Най-голямата стойност в elements
int largest(const int* elements, unsigned length);
// Най-малката стойност в elements
int smallest(const int* elements, unsigned length);
// Връща индекса на първото срещане на elementToSearch
unsigned findIndex(const int* elements, unsigned length, int elementToSearch);

Поставете техните имплементации в [`arrmath.cpp`] и техните дефиниции в [`arrmath.h`].
Направете всички нужни проверки за коректност на аргументите на функциите!

От входа получавате цяло неотрицателно число [`N`] и след това [`N`] на брой цели числа.

Трябва да изкарате средното аритметично на всички елементи [*между*] най-малкия и най-големия (включително).
Ако най-големия и/или най-малкия се среща повече от един път, използвайте неговото първо срещане.

Използвайте максимално функциите от [`arrmath`]!

:table_2
|= Вход
|= Изход

|: 5 2 1 3 5 4
|: 3

|: 6 10 -2 7 0 0 1
|: 4

|: 8 1 1 1 1 10 10 10 10
|: 2.8


### Задача 3

Реализирайте следните функции във файлове [`stringHelpers.cpp`] и [`stringHelpers.h`]:

```c++
// Създава динамично-заделен низ по подадената дължина
char* newString(unsigned length);
// Създава динамично-заделен низ, копие на подадения низ
char* newString(const char* string);
// Слепява first и second, като поставя separator между тях (ако е валиден) и
// връща резултатния (динамичо-заделен) низ
char* concatStrings(const char* first, const char* second, const char* separator);
// Освобождава паметта на динамичо-заделен низ
void deleteString(char*& string); // Запишете nullptr в string!

Реализирайте следните функции във файлове [`ioHelpers.cpp`] и [`ioHelpers.h`]:

```c++
// Прочита от потребителския вход цяло число между min и max включително,
// като предоставя prompt преди въведената стойност
// При невалидна стойност, пита пак за вход
int readInteger(const char* prompt, int min, int max);
// Прочита от потребителския вход число с плаваща запетая между min и max включително,
// като предоставя prompt преди въведената стойност
// При невалидна стойност, пита пак за вход
double readDouble(const char* prompt, double min, double max);
// Прочита от потребителския вход един ред текст,
// като предоставя prompt преди въведената стойност
// При невалидна стойност, пита пак за вход
char* readString(const char* prompt);

За реализацията им използвайте [`stringHelpers`]!

Реализирате система за запазване на ученици.
Всеки ученик има две имена и оценка (по шестобалната система, между [`2.0`] и [`6.0`]).

Използвайки [`ioHelpers`], поискайте от потребителя брой ученици.
След това, за всеки ученик, поискайте неговото име, фамилия и оценка (поотделно).

За всеки ученик запазаете името му като един низ във формата [`"<ИМЕ> <ФАМИЛИЯ>"`].
Не запазвайте име и фамилия като отделни стойности!

Накрая изкарайте данните за всички ученици.

[=Смесен вход/изход:=] [*(удебеления текст е изкаран от програмата, останалото е въведено от потребителя)*]
```
[=Number of students:=] 4
[=First name:=] Ivan
[=Last name:=] Koprivan
[=Grade:=] 5.5
[=First name:=] Dimitar
[=Last name:=] Stoianov
[=Grade:=] 3.15
[=First name:=] Hari
[=Last name:=] Seldon
[=Grade:=] 6
[=First name:=] Richard
[=Last name:=] Stallman
[=Grade:=] 4.53
[=Ivan Koprivan has grade 5.5=]
[=Dimitar Stoianov has grade 3.15=]
[=Hari Seldon has grade 6=]
[=Richard Stallman has grade 4.53=]


## За самоподготовка

Пререшете следните задачи от УП [=без да гледате решенията=]:
.bulleted
- [url ../../upp-2025/week13/#-21 Седмица 13, Задача 21]
- [url ../../upp-2025/week10/#-7 Седмица 10, Задача 7]
- [url ../../upp-2025/week12/#-6 Седмица 12, Задача 6]