prof. Nunzio Brugaletta | Programmazione e linguaggio C |
Come esempio si applicherà il procedimento descritto alla risoluzione del seguente problema:
In una località geografica sono state rilevate ogni 2 ore le temperature di una giornata. Si vuole conoscere la temperatura media, l’escursione termica e lo scostamento medio dalla media.
Si tratta di scrivere un programma che richiede alcune elaborazioni statistiche su una serie di valori. Si ricorda che la media aritmetica di una serie n di valori è data dal rapporto fra la somma dei valori della serie e il numero n stesso. L’escursione termica è in pratica il campo di variazione cioè la differenza fra il valore massimo e il valore minimo della serie di valori. Lo scostamento medio è la media dei valori assoluti degli scostamenti dalla media aritmetica, dove lo scostamento è la differenza fra il valore considerato della serie e la media aritmetica.
La prima stesura del programma potrebbe essere la seguente:
Inizio Acquisizione temperature rilevate Calcolo media e ricerca massimo e minimo Calcolo escursione termica Calcolo scostamento medio Comunicazione risultati Fine
In questa prima approssimazione si sono evidenziati i risultati intermedi da conseguire affinché il problema possa essere risolto. Non si parla di istruzioni eseguibili ma di stati di avanzamento del processo di elaborazione: per il momento non c’è niente di preciso ma il problema proposto è stato ricondotto a 5 problemi ognuno dei quali si occupa di una determinata elaborazione. Viene messa in evidenza la sequenza delle operazioni da effettuare: l’escursione termica si può, per esempio, calcolare solo dopo la ricerca del massimo e del minimo.
Si noti che ad ogni fase di lavoro è assegnato un compito specifico ed è quindi più facile la ricerca di un eventuale sottoprogramma errato: se lo scostamento medio è errato e la media risulta corretta è chiaro che, con molta probabilità, l’errore è localizzato nel penultimo sottoprogramma.
Il primo sottoprogramma possiamo già tradurlo in istruzioni eseguibili. È opportuno tenere presente che a questo livello il problema da risolvere riguarda solamente l’acquisizione delle temperature rilevate. Il resto del programma, a questo livello, non esiste.
Acquisizione temperature Inizio Per indice da 0 a 11 Ricevi temperatura rilevata Fine-per Fine
Passando al dettaglio del secondo sottoprogramma lo si può pensare composto da una fase di inizializzazione dell’accumulatore della somma dei termini della serie e delle variabili che conterranno il massimo ed il minimo della serie stessa. La seconda fase è il calcolo vero e proprio. Anche qui il problema è limitato solo alla parte specificata.
Calcolo media e ricerca massimo e minimo Inizio Inizializza Somma Valori Considera primo elemento serie come Massimo e Minimo Aggiorna Somma e cerca Massimo e Minimo Calcola Media Fine Aggiorna Somma e cerca Massimo, Minimo Inizio Per indice da 1 a 11 Aggiorna Somma con elemento considerato Se elemento<Minimo Sostituisci elemento a Minimo Altrimenti Se elemento>Massimo Sostituisci elemento a Massimo Fine-se Fine-se Fine-per Fine
Il terzo sottoprogramma è immediato:
Calcolo escursione termica Inizio Escursione = Massimo – Minimo Fine
Il quarto sottoprogramma, come il secondo, prevede una inizializzazione:
Calcolo scostamento medio Inizio Azzera Somma scostamenti Aggiorna Somma Calcola Media scostamenti Fine Aggiorna Somma scostamenti Inizio Per indice da 0 a 11 Se elemento>Media aritmetica Scostamento = elemento-Media Altrimenti Scostamento = Media-elemento Fine-se Aggiorna Somma scostamenti con scostamento Fine-per Fine
L’ultimo sottoprogramma è immediato:
Comunicazione risultati Inizio Comunica Media Comunica Escursione termica Comunica Scostamento medio Fine
Il programma a questo punto è interamente svolto. Ogni sottoprogramma ha riguardato un solo aspetto dell’elaborazione: ciò rende la stesura del programma più semplice ed inoltre la manutenzione del programma stesso diventa più semplice. Ogni sottoprogramma diventa più semplice da controllare rispetto al programma nel suo complesso.
Il programma è stato diviso praticamente in 7 parti. Ognuna può essere trattata, in sede di codifica, come un sottoprogramma a parte come anche si può decidere di lasciare ai sottoprogrammi, vedi seconda e quarta fase, il compito dell’elaborazione e lasciare le inizializzazioni nel programma principale (il primo che si è scritto, quello cioè dove è evidenziata tutta l’elaborazione da svolgere). Si può anche decidere, sempre nella seconda e quarta fase per esempio, di considerare le inizializzazioni parte integrante della elaborazioni stessa e quindi rispettare la prima suddivisione di massima del programma, saltando la seconda suddivisione.
Il processo di scomposizione successiva non è fissato in maniera univoca: dipende fortemente dalla soggettività del programmatore. Non ci sono regole sulla quantità di pezzi in cui scomporre il programma. Ci sono delle indicazioni di massima che suggeriscono di limitare il singolo segmento in maniera sufficiente a che il codice non superi di molto la pagina in modo da coprire, con lo sguardo, l'intero o quasi programma e limitare il singolo segmento a poche azioni di modo che sia più semplice isolare eventuali errori. Inoltre il sottoprogramma deve essere quanto più possibile isolato dal contesto in cui opera, cioè il sottoprogramma deve avere al suo interno tutto ciò di cui ha bisogno e non fare riferimento a dati particolari presenti nel programma principale. Ciò porta ad alcuni indubbi vantaggi:
Il sottoprogramma è facilmente esportabile. Se dalla scomposizione di altri programmi si vede che si ha necessità di utilizzare elaborazioni uguali si può ricopiare il sottoprogramma. È evidente che affinché ciò sia possibile è necessario che il sottoprogramma non faccia riferimento a contesti che in questo caso potrebbero essere diversi. Se, inoltre, il sottoprogramma effettua una sola operazione si potrà avere più opportunità di inserirlo in nuove elaborazioni.
La manutenzione del programma è semplificata dal fatto che, facendo il sottoprogramma una sola elaborazione e, avendo al suo interno tutto ciò che serve, se c’è un errore nella elaborazione questo è completamente isolato nel sottoprogramma stesso e, quindi, più facilmente rintracciabile.
Qualora si avesse necessità di modificare una parte del programma, ciò può avvenire facilmente: basta sostituire solamente il sottoprogramma che esegue l’elaborazione da modificare. Il resto del programma non viene interessato dalla modifica effettuata.
L’utilizzo di sottoprogrammi già pronti per la costruzione di un nuovo programma porta ad una metodologia di sviluppo dei programmi che viene comunemente chiamata bottom-up poiché rappresenta un modo di procedere opposto a quello descritto fino ad ora. Si parte da sottoprogrammi già esistenti che vengono assemblati assieme a nuovi per costruire la nuova elaborazione. In definitiva "… si può affermare che, nella costruzione di un nuovo algoritmo, è dominante il processo top-down, mentre nell’adattamento (a scopi diversi) di un programma già scritto, assume una maggiore importanza il metodo bottom-up." (N.Wirth)
http://ennebi.solira.org | ennebi@solira.org |