prof. Nunzio Brugaletta | Programmazione e linguaggio C |
L’elaborazione ciclica è spesso utilizzata per l’aggiornamento di totalizzatori o contatori. Per chiarire meglio il concetto di totalizzatore, si pensi alle azioni eseguite dal cassiere di un supermercato quando si presenta un cliente con il proprio carrello pieno di merce. Il cassiere effettua una elaborazione ciclica sulla merce acquistata: ogni oggetto viene esaminato per acquisire il suo prezzo. Lo scopo della elaborazione è quello di cumulare i prezzi dei prodotti acquistati allo scopo di stabilire il totale che il cliente dovrà corrispondere.
Dal punto di vista informatico si tratta di utilizzare una variabile (nell’esempio potrebbe essere rappresentata dal totalizzatore di cassa) che viene aggiornata per ogni prezzo acquisito: ogni nuovo prezzo acquisito non deve sostituire il precedente ma aggiungersi ai prezzi già acquisiti precedentemente. Tale variabile:
dovrà essere azzerata quando si passa ad un nuovo cliente (ogni cliente dovrà corrispondere solamente il prezzo dei prodotti che lui acquista)
si aggiornerà per ogni prodotto esaminato (ogni nuovo prezzo acquisito verrà cumulato ai precedenti)
finito l’esame dei prodotti acquistati, la variabile, conterrà il valore totale da corrispondere.
La variabile di cui si parla nell’esempio è quella che, nel linguaggio della programmazione, viene definita un totalizzatore o accumulatore: cioè una variabile nella quale ogni nuovo valore non sostituisce ma si accumula a quelli già presenti in precedenza. Se la variabile si aggiorna sempre di una quantità costante (per esempio viene sempre aggiunta l’unità) viene chiamata contatore.
In generale si può dire che l’uso di un totalizzatore prevede i seguenti passi:
Inizializzazione totalizzatore Inizio ciclo aggiornamento totalizzatore ... Aggiornamento totalizzatore Fine ciclo Uso del totalizzatore
L’inizializzazione serve sia a dare senso all’istruzione di aggiornamento (cosa significherebbe la frase: aggiorna il valore esistente con il nuovo valore se non ci fosse un valore esistente?), sia a fare in modo che l’accumulatore stesso contenga un valore coerente con l’elaborazione da svolgere (nell’esempio di prima il nuovo cliente non può pagare prodotti acquistati dal cliente precedente: il totalizzatore deve essere azzerato, prima di cominciare l’elaborazione, affinché contenga un valore che rispecchi esattamente tutto ciò che è stato acquistato dal cliente esaminato).
L’aggiornamento viene effettuato all’interno di un ciclo. Se infatti si riflette sulla definizione stessa di totalizzatore, è facile prendere atto che avrebbe poco significato fuori da un ciclo: come si può cumulare valori se non si hanno una serie di valori?
Quando i valori da esaminare terminano, il totalizzatore conterrà il valore cercato. Nell’esempio di prima tutto ciò si tradurrebbe: finito l’esame dei prodotti acquistati, si potrà presentare al cliente il totale da corrispondere.
Si voglia, a titolo di esempio di utilizzo di un accumulatore, risolvere il seguente problema: data una sequenza di numeri positivi, se ne vuole calcolare la somma.
Inizializza SOMMA con valore 0 Ricevi NUMERO Mentre NUMERO > 0 Aggiorna SOMMA sommando NUMERO Ricevi NUMERO Fine-mentre Comunica SOMMA
Il totalizzatore SOMMA è inizializzato, prima del ciclo, al valore nullo poiché deve rispecchiare la somma dei numeri introdotti da input e, quindi, non essendo ancora stata effettuata alcuna elaborazione su alcun numero tale situazione viene espressa assegnando il valore neutro della somma.
L’output di SOMMA alla fine del ciclo indica il fatto che si può utilizzare (in questo caso per la conoscenza del valore contenuto) il totalizzatore quando il suo contenuto è coerente con il motivo della sua esistenza: SOMMA deve accumulare tutti i valori e ciò avverrà quando tutti i numeri da considerare saranno stati elaborati, cioè in uscita dal ciclo.
http://ennebi.solira.org | ennebi@solira.org |