★★★ Magazzino Gestire il magazzino di un negozio con quattro array paralleli (al massimo 50 prodotti): codice, descrizione, quantità e prezzo. Il menu deve permettere di: 1. NUOVO PRODOTTO: inserire un prodotto; il codice deve essere univoco. 2. CARICO: leggere codice e quantità e aumentare la giacenza. 3. SCARICO: leggere codice e quantità e diminuire la giacenza, solo se la merce è sufficiente. 4. SOTTOSCORTA: leggere una soglia e visualizzare i prodotti con quantità inferiore. 5. VALORE: visualizzare il valore complessivo del magazzino (Σ quantità × prezzo). 6. ELENCO: visualizzare tutti i prodotti. 0. ESCI: terminare il programma. Rif. File: 4bis - Esercizi Array con menu.pdf

Esercizio nr. 17 (Magazzino)

1. L'idea: quattro array paralleli

Ogni prodotto ha quattro informazioni: codice, descrizione, quantità e prezzo. Invece di un'unica struttura usiamo quattro array distinti, uno per ciascuna informazione.

La regola fondamentale è questa: lo stesso indice i indica lo stesso prodotto in tutti gli array.

i codice[i] descrizione[i] quantita[i] prezzo[i]
0 10 Penna blu 5 1.5
1 20 Quaderno 2 3.0
2 … … … …

Il prodotto in posizione 1 è quindi: codice 20, "Quaderno", 2 pezzi, 3 euro. Gli array sono "paralleli" perché vanno sempre aggiornati insieme, nella stessa posizione.

Codice completo

#include <iostream>              // per cin e cout (input/output)
#include <string>                // per il tipo string
using namespace std;             // evita di scrivere std:: davanti a cin, cout, string...

const int MAX = 50;              // dimensione fisica: al massimo 50 prodotti

int main()
{
    int codice[MAX];             // array parallelo 1: codice del prodotto
    string descrizione[MAX];     // array parallelo 2: descrizione (una sola parola)
    int quantita[MAX];           // array parallelo 3: pezzi in magazzino (interi)
    double prezzo[MAX];          // array parallelo 4: prezzo (con decimali)

    int n = 0;                   // dimensione logica: prodotti inseriti davvero (all'inizio 0)
    int scelta;                  // voce del menu scelta dall'utente

    do                           // il menu appare almeno una volta
    {
        cout << endl;
        cout << "=== MAGAZZINO ===" << endl;   // stampa del menu
        cout << "1 - Nuovo prodotto" << endl;
        cout << "2 - Carico" << endl;
        cout << "3 - Scarico" << endl;
        cout << "4 - Sottoscorta" << endl;
        cout << "5 - Valore" << endl;
        cout << "6 - Elenco" << endl;
        cout << "0 - Esci" << endl;
        cout << "Scelta: ";
        cin >> scelta;           // legge la scelta

        switch (scelta)          // esegue il blocco corrispondente alla scelta
        {
        case 1:                  // NUOVO PRODOTTO
        {                        // graffe: servono perche' dichiariamo variabili nel case
            if (n == MAX)        // controllo 1: c'e' ancora spazio?
            {
                cout << "Magazzino pieno!" << endl;
                break;           // esce dallo switch senza inserire nulla
            }
            int c;               // codice letto dall'utente
            cout << "Codice: ";
            cin >> c;

            int pos = -1;        // -1 = "non trovato" (nessun array ha indice -1)
            for (int i = 0; i < n; i++)      // scorre solo i prodotti presenti (fino a n, non MAX)
            {
                if (codice[i] == c)          // codice gia' presente?
                {
                    pos = i;                 // memorizza la posizione trovata
                }
            }

            if (pos != -1)       // controllo 2: il codice deve essere univoco
            {
                cout << "Codice gia' esistente!" << endl;
            }
            else
            {
                codice[n] = c;                       // salva il codice nella prima posizione libera (n)
                cout << "Descrizione (una parola): ";
                cin >> descrizione[n];               // legge una sola parola (si ferma allo spazio)
                cout << "Quantita': ";
                cin >> quantita[n];                  // stessa posizione n in tutti gli array
                cout << "Prezzo: ";
                cin >> prezzo[n];
                n++;                                 // ora c'e' un prodotto in piu'
                cout << "Prodotto inserito." << endl;
            }
            break;               // evita di cadere nel case successivo
        }

        case 2:                  // CARICO
        {
            int c, q;            // c = codice, q = quantita' da aggiungere
            cout << "Codice: ";
            cin >> c;

            int pos = -1;        // stessa ricerca per codice
            for (int i = 0; i < n; i++)
            {
                if (codice[i] == c)
                {
                    pos = i;
                }
            }

            if (pos == -1)       // nessun prodotto con quel codice
            {
                cout << "Prodotto non trovato." << endl;
            }
            else
            {
                cout << "Quantita' da caricare: ";
                cin >> q;
                quantita[pos] = quantita[pos] + q;   // SOMMA alla giacenza
                cout << "Nuova giacenza: " << quantita[pos] << endl;
            }
            break;
        }

        case 3:                  // SCARICO
        {
            int c, q;            // q = quantita' da togliere
            cout << "Codice: ";
            cin >> c;

            int pos = -1;        // stessa ricerca per codice
            for (int i = 0; i < n; i++)
            {
                if (codice[i] == c)
                {
                    pos = i;
                }
            }

            if (pos == -1)
            {
                cout << "Prodotto non trovato." << endl;
            }
            else
            {
                cout << "Quantita' da scaricare: ";
                cin >> q;
                if (q <= quantita[pos])              // controllo: merce sufficiente?
                {
                    quantita[pos] = quantita[pos] - q;   // SOTTRAE dalla giacenza
                    cout << "Nuova giacenza: " << quantita[pos] << endl;
                }
                else                                 // cosi' la giacenza non diventa mai negativa
                {
                    cout << "Merce insufficiente! Disponibili: " << quantita[pos] << endl;
                }
            }
            break;
        }

        case 4:                  // SOTTOSCORTA
        {
            int soglia;          // sotto questo valore il prodotto e' "in sottoscorta"
            cout << "Soglia: ";
            cin >> soglia;

            int trovati = 0;     // contatore dei prodotti stampati
            for (int i = 0; i < n; i++)
            {
                if (quantita[i] < soglia)            // quantita' INFERIORE alla soglia
                {
                    cout << codice[i] << " - " << descrizione[i]
                         << " - quantita': " << quantita[i] << endl;   // stampa il prodotto
                    trovati++;                       // ne abbiamo trovato uno in piu'
                }
            }
            if (trovati == 0)    // nessuno stampato: avvisa l'utente
            {
                cout << "Nessun prodotto sotto la soglia." << endl;
            }
            break;
        }

        case 5:                  // VALORE (accumulatore)
        {
            double totale = 0;   // parte da 0 PRIMA del ciclo
            for (int i = 0; i < n; i++)
            {
                totale = totale + quantita[i] * prezzo[i];   // aggiunge il valore di ogni prodotto
            }
            cout << "Valore complessivo del magazzino: " << totale << " euro" << endl;
            break;
        }

        case 6:                  // ELENCO (stampa degli array)
        {
            if (n == 0)          // magazzino vuoto
            {
                cout << "Nessun prodotto in magazzino." << endl;
            }
            else
            {
                for (int i = 0; i < n; i++)          // da 0 a n-1
                {
                    cout << codice[i] << " - " << descrizione[i] << " - "
                         << quantita[i] << " - " << prezzo[i] << " euro" << endl;   // 4 dati sulla stessa riga
                }
            }
            break;
        }

        case 0:                  // ESCI
            cout << "Arrivederci!" << endl;   // scelta vale 0: il while sotto diventa falso
            break;

        default:                 // qualsiasi numero non presente nel menu
            cout << "Scelta non valida." << endl;
        }

    } while (scelta != 0);       // ripete il menu finche' l'utente non sceglie 0

    return 0;                    // fine del programma
}