[SOL] C++ - Prova Formativa su Array
Esempio di funzionamento
/*
===== PARI E DISPARI =====
1. GENERA
2. SEPARA
3. RICOMPONI
4. STAMPA
0. ESCI
Scelta: 1
Quanti numeri (1-100)? 10
V generato
Scelta: 2
Pari: 4 Dispari: 6
Scelta: 3
V ricomposto
Scelta: 4
V (10 elementi): 70 79 38 43 28 9 58 91 11 31
P (4 elementi): 70 38 28 58
D (6 elementi): 79 43 9 91 11 31
Scelta: 0
Arrivederci!
*/
Codice sorgente
/*
SOLUZIONE - Verifica formativa "Pari e dispari"
*/
#include <iostream> // cin, cout
#include <ctime> // time: seme del generatore casuale
using namespace std;
int main() {
const int MAX = 100; // capacità massima degli array
int V[MAX], P[MAX], D[MAX]; // V = numeri, P = pari, D = dispari
int nV = 0, nP = 0, nD = 0; // quanti elementi contiene davvero ogni array
int scelta, N; // scelta del menu e numero di elementi da generare
srand(time(NULL)); // inizializzo il generatore UNA sola volta, all'avvio
do { // ripeto il menu finché l'utente non sceglie 0
cout << endl;
cout << "===== PARI E DISPARI =====" << endl;
cout << "1. GENERA" << endl;
cout << "2. SEPARA" << endl;
cout << "3. RICOMPONI" << endl;
cout << "4. STAMPA" << endl;
cout << "0. ESCI" << endl;
cout << "Scelta: ";
cin >> scelta;
switch (scelta) {
case 1: // GENERA: riempie V con N numeri casuali tra 1 e 99
do { // chiedo N finché non è valido
cout << "Quanti numeri (1-100)? ";
cin >> N;
if (N < 1 || N > MAX) cout << "Errore: valore non valido" << endl;
} while (N < 1 || N > MAX);
for (int i = 0; i < N; i++) V[i] = rand() % 99 + 1; // rand()%99 dà 0..98, +1 -> 1..99
nV = N; // V ora contiene N elementi
nP = nD = 0; // P e D non sono più coerenti: li svuoto
cout << "V generato" << endl;
break;
case 2: // SEPARA: copia i pari in P e i dispari in D (V resta invariato)
if (nV == 0) { cout << "Genera prima l'array V" << endl; break; } // niente da separare
nP = nD = 0; // riparto da zero: niente accumuli
for (int i = 0; i < nV; i++) // scorro V nell'ordine originale
if (V[i] % 2 == 0) {
P[nP] = V[i]; // pari: lo metto in coda a P
nP++;
}
else {
D[nD] = V[i]; // dispari: lo metto in coda a D
nD++;
}
cout << "Pari: " << nP << " Dispari: " << nD << endl;
break;
case 3: // RICOMPONI: ricostruisce V alternando P e D, cominciando da P
if (nP == 0 && nD == 0) { cout << "Esegui prima SEPARA" << endl; break; }
nV = 0; // riscrivo V da capo
for (int i = 0; i < nP || i < nD; i++) { // giro finché almeno un array ha elementi
if (i < nP) {
V[nV] = P[i]; // prima l'i-esimo pari (se esiste)
nV++;
}
if (i < nD) {
V[nV] = D[i]; // poi l'i-esimo dispari (se esiste)
nV++;
}
} // l'array più lungo "accoda" da solo i rimasti
cout << "V ricomposto" << endl;
break;
case 4: // STAMPA: mostra V, P e D con il numero di elementi
cout << "V (" << nV << " elementi): ";
if (nV == 0) cout << "array vuoto"; // nessun elemento
for (int i = 0; i < nV; i++) cout << V[i] << " "; // altrimenti li stampo separati da spazio
cout << endl;
cout << "P (" << nP << " elementi): ";
if (nP == 0) cout << "array vuoto";
for (int i = 0; i < nP; i++) cout << P[i] << " ";
cout << endl;
cout << "D (" << nD << " elementi): ";
if (nD == 0) cout << "array vuoto";
for (int i = 0; i < nD; i++) cout << D[i] << " ";
cout << endl;
break;
case 0: // ESCI: saluto e termino
cout << "Arrivederci!" << endl;
break;
default: // qualsiasi altro valore
cout << "Scelta non valida" << endl;
}
} while (scelta != 0);
return 0;
}