Prova formativa su Array paralleli, operazioni CRUD, Menu, strutture selettive (IF/ELSE), Cicli (While, for, do...while), Operatori logici.

[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;
}