Libro 1 – Esercitazione 1 – Quarto Anno

Esercitazione sugli algoritmi e la scomposizione di un problema in sotto problemi

Il problema

Immagina di voler realizzare un piccolo registratore di cassa, che prevede di calcolare il totale da pagare per ogni cliente per ogni carrello della spesa.
Ogni carrello prevede una serie di prodotti di cui sono noti: prezzo, quantità, descrizione e sconto applicato e di voler stampare l’intero scontrino con i relativi sconti a fianco di ogni prodotto.
La risoluzione di questo problema può avvenire in tanti modi differenti; il metodo più semplice è quello di suddividere il problema in sotto problemi. Ogni sotto problema, prevede lo svolgimento di un’attività specifica.

Primi Passi

Nella formulazione di una soluzione, occorre pensare a quali parti del problema è possibile associare un sotto problema, da cui appunto poi deriva un algoritmo.
Questa metodologia prevede poi di richiamare la soluzione del sotto problema quando è necessario lo svolgimento dell’attività prevista dal sotto problema.
Una proposta di soluzione è la seguente:

  1. Inizio
  2. Ripeti
  3. Inserimento dati
  4. Se sconto >0 allora
  5. Calcolo dell sconto
  6. totale =totale+p*q
  7. altrimenti
  8. totale = totale + (p-sconto)*q
  9. Stampa della riga dello scontrino
  10. Scrivi messaggio “il carrello è vuoto 1 -> si, 0 -> no”
  11. Leggi vuoto
  12. Finché carrello contiene prodotti
  13. Stampa del totale da pagare
  14. Fine

Alcune precisazioni sono necessarie: il programma termina quando nel carrello sono finiti i prodotti; inoltre lo sconto è applicabile se il prodotto è “scontato” altrimenti il prezzo unitario è pagato per intero. Poi nel calcolo del totale parziale occorre stampare tutti i dati di quel prodotto nel formato “id rigo descrizione prezzo quantità sconto totale parziale” ove l’id è il numero del rigo stampato (si conta da 1 al numero dei prodotti) per descrizione o nome prodotto), lo sconto appare sullo scontrino in valore di costo e non di percentuale.
Ad esempio se lo sconto è del 15 % su un prezzo di un prodotto pari a 30 € lo sconto applicato è € 7.5.
Nell’elenco delle operazioni, alcune rappresentate come “macro operazioni” sono introdotte delle funzioni che elaborano quelle macro operazioni e che restituiscono solo il risultato voluto.
Ad esempio la riga 5 + richiamato un sotto problema che formalmente calcolo la sconto su un singolo prodotto. Questa funzione che chiamiamo F prevede due simboli in input “_p” e “_sc” e ritorna come risultato la variabile “_sconto”.
La notazione con il prefisso “_” indica chiaramente che i dati sono generici e che non rappresentano necessariamente i dati del nostro problema, ma i dati di un generico problema di risolvere ove è previsto il calcolo dello sconto. Quelle variabili con il prefisso sono definite come “parametri formali” del sotto problema al quale corrisponde un sotto-algoritmo al quale corrisponde un sotto programma.
La riga 3 prevede l’inserimento dei dati e quindi questi dati saranno trasferiti alle variabili che appartengono al problema in un formato opportuno.
Tale sotto problema è chiamato “I” e prevede quattro parametri “_p”, “_sc”, “_q”, e “_descrizione”.
Nella riga 9 è definito un altro sotto problema per la stampa di una generica riga dello scontrino che prevede in ingresso i valori del numero di riga dello scontrino (quello definito con id), del prezzo unitario, dello sconto (in casso di assenza di sconto è ignorata la stampa di questo dato), della quantità e del totale parziale.
Tutto l’algoritmo è eseguito in una struttura ciclica condizionale (preferibilmente post condizionale) che ripete le operazioni finché nel carrello della spesa sono presenti prodotti.
Per gestire il ciclo conviene utilizzare una variabile di nome “vuoto”, tale variabile avrà il valore 1 se il carrello è vuoto, e 0 in caso contrario. L’azione di comunicare all’algoritmo se il carrello è “vuoto” è da demandare all’utente che mediante un input segnala che i prodotti sono terminati, e che è possibile calcolare il totale da pagare (righe 10,11.
L’algoritmo con la rappresentazione in flow chart è sotto riportato:

Nell’algoritmo principale lo pseudo-codice:

  1. Inizio
  2. tot =0
  3. vuoto =1
  4. id =1
  5. ripeti
  6. Inserimento(p,q,sc,descrizione)
  7. Se sc>0
  8. sconto=calcola(p,sc)
  9. tot=tot+(p-sconto)*q
  10. altrimenti
  11. tot=tot+p*q
  12. stampa(id,,p,q,sconto,descrizione)
  13. id=id+1
  14. Scrivi “Carrello vuoto ? 1-> no, 0->si “
  15. Leggi vuoto
  16. Finché vuoto=1
  17. scrivi “Devi pagare:”
  18. Scrivi tot
  19. Fine

Il sotto algoritmo “inserimento” è rappresentato sotto:

Algoritmo per l'inserimento dati in forma parametrica.

Lo pseudo-codice è:

  1. Inizio Inserimento(_p, _q, _sc, _descizione)
  2. Scrivi “Inserisci nell’ordine prezzo, quantità, sconto percentuale e descrizione
  3. Leggi _p
  4. Leggi _q
  5. Leggi _sc
  6. Leggi _descrizione

Il sotto algoritmo per il calcolo dello sconto è rappresentato di seguito:

Lo pseudo-codice è:

  1. Inizio Calcola(_p, _sc)
  2. _sconto = (_p * _sc)/100
  3. return _sconto
  4. Fine

Per completare il sotto algoritmo per la stampa secondo lo schema flow chart è:

Lo pseudo-codice è:

  1. Inizio Stampa(_id, _p, _q, _sconto, _descrizione)
  2. Scrivi _id , ” “, _descrizione
  3. Scrivi _p, ” “, _q, ” “, _sconto, ” “. _descrizione, ” “, (_p-_sconto)*_q
  4. Fine

La codifica in C++ sarà oggetto di una prossima esercitazione.