-
Notifications
You must be signed in to change notification settings - Fork 0
/
Zadanie8.cpp
323 lines (264 loc) · 11.9 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
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
/*
Meno a priezvisko: Peter Likavec
POKYNY:
(1) Implementujte funkcie tak, aby splnali popis pri ich deklaraciach.
(2) Cela implementacia musi byt v tomto jednom subore.
(3) Odovzdajte len tento zdrojovy subor (dopleny o riesenia).
(4) Program musi byt kompilovatelny.
(5) Globalne a staticke premenne su zakazane.
(6) 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).
(7) V pripade potreby mozete kod doplnit o dalsie pomocne funkcie alebo datove typy.
(8) Vase riesenie otestujte (vo funkcii 'main' a pomocou doplnenych pomocnych funkcii alebo datovych typov).
Testovaci kod ale nebude hodnoteny.
(9) 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".
Na vypocet sumy cisiel, 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 funkcia 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) {
double sum = 0;
if(data.size() == 0)
throw std::invalid_argument("inicializacny zoznam je prazdny");
else{
sum = std::accumulate(data.begin(),data.end(),0);
return sum/data.size();
}
}
//-------------------------------------------------------------------------------------------------
// 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 {
//it = std::find(data.begin(),data.end(),value;
auto it = std::find(data.begin(),data.end(),value);
if(it != data.end())
return it;
else
return data.cend(); // tento riadok zmente podla zadania, je tu len kvoli kompilacii
}
//-------------------------------------------------------------------------------------------------
// 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 {
auto it = std::find_if(data.begin(),data.end(),isInRange200to400);
if(it != data.end())
return it;
else
return data.cend(); // 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 predchadzajucej ulohy).
PARAMETER:
[in, out] data - zoznam, v ktorom funkcia nahradi vsetky hodnoty v rozsahu <200, 400>, hodnotou 5
*/
void replace200to400by5(list<int> & data) noexcept {
std::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 {
std::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.
Inak 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 predchadzajucej ulohe,
ale namiesto 'std::transform' pouzite "range-based for" cyklus, v ktorom budete volat 'incrementPointsIfItHelps'.
*/
void helpAfterExam2(list<int> & points) noexcept {
for(auto & student:points){
student = incrementPointsIfItHelps(student);
}
}
//-------------------------------------------------------------------------------------------------
// 8. ULOHA (0.4 bodu)
//-------------------------------------------------------------------------------------------------
/*
Funkcia vrati novy zoznam, v ktorom hodnota kazdeho prvku je dana suctom prvkov v 'data1' a 'data2'
s rovnakou poziciou.
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 {
list<int> newList (data1.size());
transform(data1.begin(),data1.end(),data2.begin(),newList.begin(),std::plus<int>());
return newList; // tento riadok zmente podla zadania, je tu len kvoli kompilacii
}
//-------------------------------------------------------------------------------------------------
// 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 {
std::sort(data.begin(),data.end(),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 {
std::sort(data.begin(),data.end());
std::reverse(data.begin(),data.end());
}
//-------------------------------------------------------------------------------------------------
// TESTOVANIE
//-------------------------------------------------------------------------------------------------
void vectorPrint(vector<int> & data) noexcept{
for(auto x:data)
cout << x << " ";
}
void listPrint(list<int> & data) noexcept{
for(auto x:data)
cout << x << " ";
}
// tu mozete doplnit pomocne testovacie funkcie a struktury
int main() {
vector<int> data = {7,5,6,92,1,3,5,4};
list<int> data2 = {1,2,3,4,5};
list<int> data3 = {1,2,3,4,5};
list<int> points = { 100, 90, 91, 92, 93, 53, 54, 55, 56, 57, 91, 92 };
//Uloha1
//cout << (average(data1));
//Uloha2
//Uloha3
//Uloha4
// replace200to400by5(data2);
// listPrint(data2);
//Uloha5
// incrementAll(data2);
// listPrint(data2);
//Uloha6
// helpAfterExam1(points);
// listPrint(points);
//Uloha7
// helpAfterExam2(points);
// listPrint(points);
//Uloha8
list<int> result = add(data2,data3);
listPrint(result);
//Uloha9
// sort1(data);
// vectorPrint(data);
//Uloha10
return 0;
}