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
}