-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharray_utils.cpp
333 lines (295 loc) · 10.4 KB
/
array_utils.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
324
325
326
327
328
329
330
331
332
/**
* Purpose: basic utilities for arrays
* Author: Emanuele Rizzolo
* Class: 3XIN
* Date: 2022/11/27
* Note:
*/
#include <iostream>
#include <ctime>
using namespace std;
const bool DEBUG = true;
/**
* Si chiede di implementare le funzioni di seguito elencate,
* basandosi sullo schema della funzione forwardScan (o backWardScan se necessario).
* Aggiungere dei semplici test con array inizializzati nel codice.
*/
using type = int;
// basic scan prototypes with default parameter begin
void forwardScan(type a[], int end, int begin = 0); // scansione crescente da begin a end escluso: [begin, end)
void backwardScan(type a[], int end, int begin = 0); // scansione decrescente da end escluso a begin: [begin, end)
// applicazione delle precedenti scansioni per la visualizzazione di un array
void JSON(const type a[], int end, int begin = 0, ostream &out = cout); // output su out in formato JSON
// Utility functions
// Initializing
void fill(type a[], type value, int end, int begin = 0);
void iota(type a[], type value, int end, int begin = 0);
// Modifying
void add(type a[], type value, int end, int begin = 0);
// Searching
int firstIndexOf(type a[], type value, int end, int begin = 0);
int lastIndexOf(type a[], type value, int end, int begin = 0);
int count(type a[], type value, int end, int begin = 0);
type max(type a[], int end, int begin = 0);
type min(type a[], int end, int begin = 0);
void fillRandom(type a[], type min, type max, int end, int begin = 0);
bool isOrdered(type a[], int end, int begin = 0);
void orderArray(type a[], int end, int begin = 0);
// main function
int main(int argc, char *argv[])
{
srand(time(NULL));
const int SIZE = 10;
type primes[SIZE] {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; // 10 prime numbers
cout << "Here are some primes:" << endl;
JSON(primes, SIZE);
cout << endl;
cout<<endl<<"Is the array ordered?"<<endl;
bool result = isOrdered(primes, SIZE);
cout<<result<<endl;
cout << "Setting all elements to 11:" << endl;
fill(primes, 11, SIZE);
JSON(primes, SIZE);
cout << endl;
cout << "Counting value 11: " << count(primes, 11, SIZE) << endl;
cout << "Counting value 111: " << count(primes, 111, SIZE) << endl;
cout << "Setting all elements equals to their index:" << endl;
iota(primes, 0, SIZE);
JSON(primes, SIZE);
cout << endl;
cout << "Finding first 5: " << firstIndexOf(primes, 5, SIZE) << endl;
cout << "Finding last 5: " << lastIndexOf(primes, 5, SIZE) << endl;
cout << "Finding last 0: " << lastIndexOf(primes, 0, SIZE) << endl;
cout << "Finding last 50: " << lastIndexOf(primes, 50, SIZE) << endl;
cout << "Minimum element: " << min(primes, SIZE) << endl;
cout << "Maximum element: " << max(primes, SIZE) << endl;
cout << "Adding 3 to all elements:" << endl;
add(primes, 3, SIZE);
JSON(primes, SIZE);
cout << endl;
cout << "Setting all elements to random:" << endl;
fillRandom(primes, 1, 100, SIZE);
JSON(primes, SIZE);
cout<<endl<<"Is the array ordered?"<<endl;
result = isOrdered(primes, SIZE);
cout<<result<<endl;
cout<<"Ordered Array: "<<endl;
orderArray(primes,SIZE);
JSON(primes,SIZE);
cout << endl;
// and so on ....
// successful termination
return 0;
}
/// @brief Restituisce l'indice del primo elemento uguale a value in [begin, end), oppure end
/// @param a the array to scan
/// @param value the value to be found
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
/// @return il minimo indice per cui a[i] == value, oppure end
int firstIndexOf(type a[], type value, int end, int begin /* = 0 */)
{
// // con sentinella
// type saved = a[end - 1]; // salvo ultimo elemento
// a[end - 1] = value; // metto la sentinella
// while (a[begin] != value)
// {
// ++begin;
// }
// a[end - 1] = saved; // rimetto a posto
// if(a[begin] != value) { // ultimo controllo
// ++begin;
// }
while (begin < end && a[begin] != value)
{
++begin;
}
return begin;
}
/// @brief Restituisce l'indice dell'ultimo elemento uguale a value in [begin, end), oppure end
/// @param a the array to scan
/// @param value the value to be found
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
/// @return il massimo indice per cui a[i] == value, oppure end
int lastIndexOf(type a[], type value, int end, int begin /* = 0 */)
{
end--;
while (begin <= end && a[end] != value)
{
if (DEBUG) cout << "end =" << end << endl;
--end;
}
return end;
}
/// @brief Restituisce il minimo elemento in [begin, end)
/// Undefined behaviour se [begin, end) è vuoto
/// @param a the array to scan
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
/// @return il minimo elemento in [begin, end)
type min(type a[], int end, int begin /* = 0 */)
{
type result = a [begin];
for (int i = begin + 1; i < end; ++i)
{
if (a[i] < result)
result = a[i];
}
return result;
}
/// @brief Restituisce il massimo elemento in [begin, end)
/// Undefined behaviour se [begin, end) è vuoto
/// @param a the array to scan
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
/// @return il massimo elemento in [begin, end)
type max(type a[], int end, int begin /* = 0 */)
{
type result = a [begin];
for (int i = begin + 1; i < end; ++i)
{
if (a[i] > result)
result = a[i];
}
return result;
}
/// @brief Restituisce il numero di occorrenze di value in [begin, end)
/// @param a the array to scan
/// @param value the value to be counted
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
/// @return il numero di occorrenze di value in [begin, end)
int count(type a[], type value, int end, int begin /* = 0 */)
{
int result = 0;
for (int i = begin; i < end; ++i)
{
if (a[i] == value)
++result;
}
return result;
}
/// @brief Aggiunge value agli elementi in [begin, end)
/// @param a the array to change
/// @param value the value of the increment
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
void add(type a[], type value, int end, int begin /* = 0 */)
{
for (int i = begin; i < end; ++i)
{
a[i] += value;
}
}
/// @brief Imposta gli elementi in [begin, end) con valori crescenti a partire da value
/// @param a the array to change
/// @param value the starting value, incremented with ++value
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
void iota(type a[], type value, int end, int begin /* = 0 */)
{
for (int i = begin; i < end; ++i)
{
a[i] = value;
++value;
}
}
/// @brief Imposta gli elementi in [begin, end) al valore value
/// @param a the array to change
/// @param value the value to set in each element
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
void fill(type a[], type value, int end, int begin /* = 0 */)
{
for (int i = begin; i < end; ++i)
{
a[i] = value;
}
}
/// @brief Basic forward scan (with default limits)
/// scansione crescente da begin a end escluso: [begin, end)
/// @param a the array to scan
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
void forwardScan(type a[], int end, int begin /* = 0 */)
{
for (int i = begin; i < end; ++i)
{
// process a[i]
cout << "processing a[" << i << "]" << endl;
}
}
/// @brief Basic backward scan (with default limits)
/// scansione decrescente da end escluso a begin: [begin, end)
/// @param a the array to scan
/// @param end inizio (escluso) della scansione: a[end] non viene elaborato
/// @param begin fine (inclusa) della scansione: a[begin] e' l'ultimo elemento elaborato
void backwardScan(type a[], int end, int begin /* = 0 */)
{
for (int i = end; i-- > begin;)
{
// process a[i]
cout << "processing a[" << i << "]" << endl;
}
}
/// @brief Output su out in formato JSON da begin a end escluso: [begin, end)
/// @param a the array to output
/// @param end fine (esclusa) della scansione: a[end] non viene elaborato
/// @param begin inizio (incluso) della scansione: a[begin] e' il primo elemento elaborato
/// @param out the output stream to be used
void JSON(const type a[], int end, int begin /* = 0 */, ostream &out /* = cout */)
{
out << "[ ";
for (int i = begin; i < end; ++i)
{
if (i != begin)
out << ", ";
out << a[i];
}
out << " ]";
}
void fillRandom(type a[], type min, type max, int end, int begin /* = 0 */)
{
for (int i = begin; i < end; ++i)
{
a[i] = rand() %(max - min + 1) +min;
}
}
bool isOrdered(type a[], int end, int begin /* = 0 */)
{
// bool result = true;
//// for (int i = begin +1; i < end; ++i)
// for (int i = begin +1; i < end && result; ++i)
// {
// if (DEBUG)
// cout<<a[i]<<" "<<a[i-1]<<endl;
// if (a[i] < a[i-1])
// result = false;
// }
// return result;
for (int i = begin +1; i < end; ++i)
{
if (DEBUG)
cout<<a[i]<<" "<<a[i-1]<<endl;
if (a[i] < a[i-1])
return false;
}
return true;
}
void orderArray(type a[], int end, int begin /* = 0 */)
{
while(end > begin + 1)
{
for (int i = begin +1; i < end; ++i)
{
if (DEBUG)
cout<<a[i]<<" "<<a[i-1]<<endl;
if (a[i] < a[i-1])
{
int temp = a[i]; a[i] = a[i-1]; a[i-1] = temp;
}
}
end--;
}
}