| prof. Nunzio Brugaletta |
C++:
programmazione e oggetti |
Gli algoritmi, a causa della loro generalità, lavorano utilizzando variabili. Non si conoscono, al momento della stesura dell’algoritmo stesso, i valori che possono assumere le variabili. Ciò se permette di scrivere algoritmi generali può comportare problemi per alcune istruzioni: si pensi al problema apparentemente banale del calcolo del quoziente di due numeri:
Ricevi DIVIDENDO e DIVISORE Assegna a QUOZIENTE valore DIVIDENDO/DIVISORE Comunica QUOZIENTE
Il quoziente può essere calcolato se DIVISORE contiene un valore diverso da 0, evento questo non noto al momento della stesura dell'algoritmo dipendendo, tale valore, dal numero proveniente da input. Inoltre è chiaro che, nella eventualità si presentasse il valore nullo, sarebbe priva di senso anche l’istruzione di output del valore di QUOZIENTE non essendoci nella variabile alcun valore.
È necessario introdurre, oltre alle istruzioni, degli strumenti che permettano di controllare l’esecuzione dell’algoritmo in conseguenza di eventi che si verificano in sede di esecuzione: le strutture di controllo. La programmazione strutturata (disciplina nata alla fine degli anni '60 per stabilire le regole per la scrittura di buoni algoritmi) impone l’uso di tre sole regole di composizione degli algoritmi:
la sequenza: è l’unica struttura di composizione che si è utilizzata finora. In poche parole questa struttura permette di specificare l’ordine con cui le istruzioni si susseguono: ogni istruzione produce un risultato perché inserita in un contesto che è quello determinato dalle istruzioni che la precedono. Nell’esempio di prima il calcolo di QUOZIENTE, per poter contenere il valore atteso, deve essere eseguito dopo gli input.
la selezione: questa struttura permette di scegliere tra due alternative la sequenza di esecuzione. È la struttura che permette, per esempio, di risolvere in modo completo il problema del calcolo del quoziente fra due numeri:
Ricevi DIVIDENDO e DIVISORE Se DIVISORE <> 0 Assegna a QUOZIENTE valore DIVIDENDO/DIVISORE Comunica QUOZIENTE Altrimenti Comunica ‘Operazione senza senso’ Fine-se
La condizione espressa nella struttura Se permette di scegliere, in relazione al valore di verità o falsità, quale elaborazione svolgere. La sequenza contenuta nella parte Altrimenti potrebbe mancare se si volesse soltanto un risultato laddove possibile: in tale caso se la condizione DIVISORE <> 0 risultasse non verificata, non si effettuerebbe alcuna elaborazione. L'esecuzione di questo algoritmo porterebbe l'esecutore, nel caso specifico il computer, a decidere cosa fare, quali istruzioni eseguire, in conseguenza dei dati che vengono introdotti. In sede di scrittura dell'algoritmo, non conoscendo i valori, si possono solo elencare le istruzioni da eseguire e fornire gli elementi (la condizione da verificare) per scegliere la corretta sequenza di elaborazione.
l’iterazione: la struttura iterativa permette di ripetere più volte la stessa sequenza di istruzioni finché non si verifica una determinata condizione. Chiaramente non avrebbe alcun senso ripetere sempre le stesse istruzioni se non cambiassero i valori a cui si applicano le operazioni specificate nella sequenza. Le elaborazioni previste nella sequenza iterata devono potersi applicare a variabili che cambiano il loro valore: vuoi per una assegnazione diversa per ogni iterazione, vuoi per un input. A titolo di esempio, è riportato un algoritmo che calcola e visualizza i quadrati di una serie di numeri positivi. Si tratta, in altri termini, di effettuare la stessa elaborazione (calcolo e visualizzazione del quadrato di un numero) effettuata su numeri diversi (quelli che arriveranno dall’input):
Ricevi NUMERO Mentre NUMERO > 0 Assegna a QUADRATO valore NUMERO*NUMERO Comunica QUADRATO Ricevi NUMERO Fine-mentre
Nel corpo della struttura iterativa (la parte compresa fra le parole Mentre e Fine-mentre) sono specificate le istruzioni per il calcolo del quadrato di un numero: l’iterazione permette di ripetere tale calcolo per tutti i numeri che verranno acquisiti tramite l’istruzione di input inserita nell’iterazione stessa che, non è superfluo sottolineare, fornisce un senso a tutta la struttura (i risultati, nonostante le stesse istruzioni, cambiano perché cambiano i valori). La condizione NUMERO>0 viene chiamata condizione di controllo del ciclo e specifica quando deve terminare l’elaborazione (il valore introdotto da input è non positivo): si ricorda che l’algoritmo deve essere finito e non si può iterare all’infinito. Il primo input fuori ciclo ha lo scopo di permettere l’impostazione della condizione di controllo sul ciclo stesso e stabilire, quindi, quando terminare le iterazioni.
In generale si può dire che la struttura di una elaborazione ciclica, controllata dal verificarsi di una condizione, assume il seguente aspetto:
Considera primo elemento Mentre elementi non finiti Elabora elemento Considera prossimo elemento Fine mentre
Le strutture di controllo devono essere pensate come schemi di composizione: una sequenza può contenere una iterazione che, a sua volta, contiene una selezione che a sua volta può contenere dell'altro e così via. Rappresentano in pratica i mattoncini elementari di una scatola di montaggio le cui diverse combinazioni permettono la costruzione di architetture di varia complessità.
| http://ennebi.solira.org |
ennebi@solira.org |