-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzadanie8.cpp
300 lines (243 loc) · 11.2 KB
/
zadanie8.cpp
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
/*
Meno a priezvisko:Michal_Hájek_104463
POKYNY:
(1) Subor premenujte na Priezvisko_Meno_ID_zadanie08.cpp (pouzite vase udaje bez diakritiky).
(2) Implementujte funkcie tak, aby splnali popis pri ich deklaraciach.
(3) Cela implementacia musi byt v tomto jednom subore.
(4) Odovzdajte len tento (spravne premenovany) zdrojovy subor.
(5) Program musi byt kompilovatelny.
(6) Globalne a staticke premenne su zakazane.
(7) V ziadnom pripade nemente deklaracie funkcii, ktore mate za ulohu naprogramovat
(nemente nazvy, navratove hodnoty ani typ a pocet parametrov v zadanych funkciach).
Nemente implementacie zadanych datovych typov, ani implementacie hotovych pomocnych funkcii
(ak nie je v zadani ulohy uvedene inak).
(8) V pripade potreby mozete kod doplnit o dalsie pomocne funkcie alebo struktury.
(9) Vase riesenie otestujte (vo funkcii 'main' a pomocou doplnenych pomocnych funkcii alebo struktur).
Testovaci kod ale nebude hodnoteny.
(10) Funkcia 'main' musi byt v zdrojovom kode posledna.
*/
#include <iostream>
#include <list>
#include <vector>
#include <numeric>
#include <algorithm>
#include <initializer_list>
using namespace std;
//-------------------------------------------------------------------------------------------------
// 1. ULOHA (0.4 bodu)
//-------------------------------------------------------------------------------------------------
/*
Funkcia vrati priemernu hodnotu prvkov vstupneho inicializacneho zoznamu.
Ak inicializacny zoznam neobsahuje ziadne prvky, tak vyhodi vynimku typu 'std::invalid_argument',
ktorej metoda 'what' vrati textovy retazec: "inicializacny zoznam je prazdny".
V Implementacii pouzite 'std::accumulate'.
PARAMETER:
[in] data - zoznam prvkov
NAVRATOVA HODNOTA:
Priemerna hodnota prvkov vstupneho inicializacneho zoznamu
VYNIMKA:
Ak je inicializacny zoznam prazdny, tak vyhodi vynimku typu 'std::invalid_argument',
ktorej metoda 'what' vrati vysvetlujuci popis: "inicializacny zoznam je prazdny" (dodrzte presne tento textovy retazec! (ctrl+c, ctrl+v))
*/
double average(const initializer_list<int> &data) {
if (data.size() == 0)
{
std::invalid_argument chyba=std::invalid_argument("inicializacny zoznam je prazdny");
throw chyba;
}
double sum;
sum = accumulate(data.begin(), data.end(), 0);
double priemer = sum / data.size();
return priemer; // tento riadok zmente podla zadania, je tu len kvoli kompilacii
}
//-------------------------------------------------------------------------------------------------
// 2. ULOHA (0.4 bodu)
//-------------------------------------------------------------------------------------------------
/*
Funkcia vrati iterator na 1. prvok zoznamu 'data' obsahujuci hodnotu 'value'.
Pozor na pripad, ked 'data' obsahuje viac prvkov s hodnotou 'value'.
V implementacii pouzite 'std::find'.
PARAMETRE:
[in] data - zoznam, v ktorom funkcia hlada 1. vyskyt hodnoty 'value'
[in] value - hodnota hladaneho prvku
NAVRATOVA HODNOTA:
Ak 'data' obsahuje prvok s hodnotou 'value', tak vrati konstantny iterator na 1. takyto prvok.
Inak vrati iterator za posledny prvok 'data' (iterator 'data.cend()')
*/
list<int>::const_iterator findValue(const list<int> &data, int value) noexcept {
list<int>::const_iterator iterator;
iterator = find(data.begin(), data.end(), value);
if (iterator == data.end() && data.back() != value)
return data.cend();
return iterator;
}
//-------------------------------------------------------------------------------------------------
// 3. ULOHA (0.4 bodu)
//-------------------------------------------------------------------------------------------------
/*
Funkcia vrati iterator na 1. prvok, ktoreho hodnota je v rozsahu <200, 400> (vratane 200 a 400).
V implementacii pouzite funkciu 'std::find_if'.
Pri jej volani pouzite ako jeden z argumentov funkciu 'isInRange200to400'.
PARAMETER:
[in] data - zoznam, v ktorom sa hlada 1. vyskyt hodnoty v rozsahu <200, 400>
NAVRATOVA HODNOTA:
Ak 'data' obsahuje prvok/prvky v rozsahu <200,400>, tak vrati iterator na 1. takyto prvok.
Inak vrati iterator za posledny prvok (iterator 'data.cend()').
*/
bool isInRange200to400(const int element) noexcept {
return element >= 200 && element <= 400;
}
list<int>::const_iterator findInRange200to400(const list<int> &data) noexcept {
list<int>::const_iterator iterator;
iterator = find_if(data.begin(), data.end(), isInRange200to400);
if (iterator == data.end() && isInRange200to400(data.back()))
return data.cend();
return iterator; // tento riadok zmente podla zadania, je tu len kvoli kompilacii
}
//-------------------------------------------------------------------------------------------------
// 4. ULOHA (0.4 bodu)
//-------------------------------------------------------------------------------------------------
/*
Funkcia v zozname 'data' nahradi vsetky hodnoty v rozsahu <200, 400> (vratane 200 a 400), hodnotou 5.
V implementacii pouzite funkciu 'std::replace_if'.
Pri jej volani pouzite ako jeden z argumentov funkciu 'isInRange200to400' (definovanu v zadani predchadzajuceho prikladu).
PARAMETER:
[in, out] data - zoznam, v ktorom funkcia nahradi vsetky hodnoty v rozsahu <200, 400>, hodnotou 5
*/
void replace200to400by5(list<int> &data) noexcept {
replace_if(data.begin(), data.end(), isInRange200to400, 5);
}
//-------------------------------------------------------------------------------------------------
// 5. ULOHA (0.4 bodu)
//-------------------------------------------------------------------------------------------------
/*
Funkcia zvysi hodnotu kazdeho prvku vstupneho zoznamu o 1 (ku kazdej hodnote pripocita 1).
V implementacii pouzite funkciu 'std::transform'.
Pri jej volani pouzite ako jeden z argumentov funkciu 'increment'.
PARAMETER:
[in, out] data - zoznam, v ktorom funkcia zvysi hodnotu kazdeho prvku o 1
*/
int increment(int element) noexcept {
return element + 1;
}
void incrementAll(list<int> &data) noexcept {
transform(data.begin(), data.end(), data.begin(), increment);
}
//-------------------------------------------------------------------------------------------------
// 6. ULOHA (0.4 bodu)
//----------------------------------------------------------------------------------------------
/*
Vstupny zoznam obsahuje celkovy pocet bodov z predmetu, pre kazdeho studenta.
Ak je pocet bodov teste pod hranicou na lepsiu znamku (do lepsej znamky chyba 1 bod),
tak funkcia zvysi pocet bodov o 1.
Ak do lepsej znamky chyba viac bodov, tak funkcia nezmeni pocet bodov.
V implementacii pouzite funkciu 'std::transform'.
Pri jej volani pouzite ako jeden z argumentov funkciu 'incrementPointsIfItHelps'.
PARAMETER:
[in, out] points - celkovy pocet bodov z predmetu pre kazdeho studenta
(niektore mozu byt po vykonani funkcie inkrementovane)
PRIKLAD:
vstup: { 100, 90, 91, 92, 93, 53, 54, 55, 56, 57, 91, 92 }
vystup: { 100, 90, 92, 92, 93, 53, 54, 56, 56, 57, 92, 92 }
^ ^ ^
*/
int incrementPointsIfItHelps(int points) noexcept {
switch (points) {
case 91 :
return 92;
case 82:
return 83;
case 73:
return 74;
case 64:
return 65;
case 55:
return 56;
default:
return points;
}
}
void helpAfterExam1(list<int> &points) noexcept {
transform(points.begin(), points.end(), points.begin(), incrementPointsIfItHelps);
}
//-------------------------------------------------------------------------------------------------
// 7. ULOHA (0.4 bodu)
//----------------------------------------------------------------------------------------------
/*
Implementujte rovnaku funkcionalitu ako v predchadzajucom priklade,
ale namiesto 'std::transform' pouzite "range-based for" cyklus, v ktorom budete volat 'incrementPointsIfItHelps'.
*/
void helpAfterExam2(list<int> &points) noexcept {
list<int>::iterator j = points.begin();
for (int i :points) {
*j = incrementPointsIfItHelps(i);
j++;
}
}
//-------------------------------------------------------------------------------------------------
// 8. ULOHA (0.4 bodu)
//-------------------------------------------------------------------------------------------------
/*
Funkcia vrati novy zoznam, v ktorom hodnota kazdeho prvku je dana suctom prvkov 'data1' a 'data2'
s rovnakou poziciou v danom zozname.
V implementacii pouzite 'std::transform'.
Pri jej volani pouzite ako jeden z argumentov 'std::plus<int>()'.
PARAMETRE:
[in] data1 - obsahuje scitance
[in] data2 - obsahuje scitance
NAVRATOVA HODNOTA:
Zoznam, v ktorom hodnota kazdeho prvku je suctom prvkov v 'data1' a 'data2' s rovnakou poziciou.
VSTUPNA PODMIENKA:
'data1' a 'data2' maju rovnaky pocet prvkov
VYSTUPNA PODMENKA:
Nech 'output' je vystupny zoznam.
Pocet prvkov 'output' je rovnaky ako pocet prvkov 'data1' a 'data2'.
Pre kazde i take, ze i >= 0 && i < data1.size() plati: output[i] = data1[i] + data2[i].
*/
list<int> add( const list<int> &data1, const list<int> &data2) noexcept {
std::list<int> first(data1);
transform(first.begin(), first.end(), data2.begin(), first.begin(), std::plus<int>());
return first;
}
//-------------------------------------------------------------------------------------------------
// 9. ULOHA (0.4 bodu)
//-------------------------------------------------------------------------------------------------
/*
Funkcia usporiada prvky vektora od najvacsieho po najmensi.
V implementacii pouzite 'std::sort' alebo 'std::stable_sort' s parametrom 'std::greater<int>()'.
PARAMETER:
[in, out] data - vektor, ktory funkcia usporiada
*/
void sort1(vector<int> &data) noexcept {
sort(data.begin(),data.end(),std::greater<int>());
}
//-------------------------------------------------------------------------------------------------
// 10. ULOHA (0.4 bodu)
//-------------------------------------------------------------------------------------------------
/*
Funkcia usporiada prvky vektora od najvacsieho po najmensi.
V implementacii pouzite 'std::sort' alebo 'std::stable_sort' s reverznymi iteratormi.
PARAMETER:
[in, out] data - vektor, ktory funkcia usporiada
*/
void sort2(vector<int> &data) noexcept {
sort(data.rbegin(),data.rend(),std::less<int>());
}
//-------------------------------------------------------------------------------------------------
// TESTOVANIE
//-------------------------------------------------------------------------------------------------
int main() {
// vstup: { 100, 90, 91, 92, 93, 53, 54, 55, 56, 57, 91, 92 }
// vystup: { 100, 90, 92, 92, 93, 53, 54, 56, 56, 57, 92, 92 }
// list<int> znamocky = {100, 90, 91, 92, 93, 53, 54, 55, 56, 57, 91, 92};
//
// list<int> znamocky2 = {100, 90, 91, 92, 93, 53, 54, 55, 56, 57, 91, 92};
// // helpAfterExam2(znamocky);
// list<int> r = add(znamocky,znamocky2);
// std::vector<int> myvector;
// for (int i=5; i>1; i--) myvector.push_back(i);
// sort2(myvector);
//
// cout << "done";
return 0;
}