-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmultiples.cpp
352 lines (324 loc) · 11.6 KB
/
multiples.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
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
/**
* Purpose: test 2023-01-14
* Author: Emanuele Rizzolo
* Class: 3XIN
* Date: 2023/01/21
* Note:
*/
#include <iostream>
#include <ctime>
#include <limits>
using namespace std;
const bool DEBUG = true;
/**
Multipli (multiples)
Si realizzi una funzione con il prototipo:
void multiples(int a[], int base, int dim);
che assegni agli elementi dell’array a con indice da 0 a dim – 1 i valori dei
successivi multipli interi del valore base in modo tale che a[indice] risulti pari a
base * indice.
Ad es. dato l’array dichiarato come
int multipli[10];
dopo la chiamata alla funzione powers seguente
multiples(multipli, 2, 10);
l’array multipli deve risultare uguale a quello così inizializzato
int mult[10] {0, 2, 4, 6, 8, 10, 12, 14, 16, 18};
ovvero contenere i valori dei primi 10 multipli di 2, in ordine crescente.
Realizzare un’applicazione che consenta all’utente di verificare la correttezza
della funzione, immettendo da tastiera il valore della base ed il numero di
elementi dell’array e visualizzando il contenuto dell’array ottenuto.
Assunzione: -100 <= base <= 100, 1 <= numero elementi <= 10.
Formato di input: leggere da tastiera (con controllo di validità) il valore della
base ed il valore del numero elementi.
*/
// basic scan prototypes with default parameter begin
void forwardScan(int a[], int end, int begin = 0); // scansione crescente da begin a end escluso: [begin, end)
void backwardScan(int 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 int a[], int end, int begin = 0, ostream &out = cout); // output su out in formato JSON
// Utility functions
// Initializing
void fill(int a[], int value, int end, int begin = 0);
void iota(int a[], int value, int end, int begin = 0);
// Modifying
void add(int a[], int value, int end, int begin = 0);
// Searching
int firstIndexOf(int a[], int value, int end, int begin = 0);
int lastIndexOf(int a[], int value, int end, int begin = 0);
int count(int a[], int value, int end, int begin = 0);
int max(int a[], int end, int begin = 0);
int min(int a[], int end, int begin = 0);
void fillRandom(int a[], int min, int max, int end, int begin = 0);
bool isOrdered(int a[], int end, int begin = 0);
void orderArray(int a[], int end, int begin = 0);
long long int getIntInRange(const char *prompt, long long int min, long long int max);
void multiples(int a[], int base, int dim);
// main function
int main(int argc, char *argv[])
{
int base = getIntInRange("Base: ", -100, 100);
int elementi = getIntInRange("Numero di elementi: ", 0, 10);
// cout << base << " " << elementi << endl;
int resti[elementi];
multiples(resti, base, elementi);
JSON(resti, elementi);
// 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(int a[], int value, int end, int begin /* = 0 */)
{
// // con sentinella
// int 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(int a[], int 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)
int min(int a[], int end, int begin /* = 0 */)
{
int 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)
int max(int a[], int end, int begin /* = 0 */)
{
int 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(int a[], int 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(int a[], int 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(int a[], int 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(int a[], int 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(int 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(int 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 int 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(int a[], int min, int max, int end, int begin /* = 0 */)
{
for (int i = begin; i < end; ++i)
{
a[i] = rand() % (max - min + 1) + min;
}
}
bool isOrdered(int 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(int 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--;
}
}
/// @brief Acquisisce un intero nell'intervallo [min, max] da tastiera
/// @param prompt messaggio per l'utente
/// @param min minimo valore accettabile
/// @param max massimo valore accettabile
/// @return il valore letto da tastiera
long long int getIntInRange(const char *prompt, long long int min, long long int max)
{
long long int result = 0; // assegno un valore non valido
bool valid;
do
{
cout << prompt;
cin >> result;
valid = (!cin.fail()) && (min <= result) && (result <= max);
if (!valid)
{
cerr << "Enter a number in [" << min << ", " << max << "]" << endl;
cin.clear(); // unset failbit
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // skip bad input
}
} while (!valid);
return result;
}
void multiples2(int a[], int base, int dim)
{
a[0] = 0; // entro i limiti ???
a[1] = base; // entro i limiti ???
for (int i = 2; i < dim; ++i)
{
a[i] = a[i - 1] + base;
}
}
void multiples(int a[], int base, int dim)
{
int mult = 0;
for (int i = 0; i < dim; ++i)
{
// a[i] = i * base;
a[i] = mult;
mult += base;
}
}