Introduzione Strutture di Controllo per strutture condizionali e cicliche Quando si affronta la programmazione si devono indicare al computer delle istruzioni da eseguire. Se il computer potesse comprendere il linguaggio naturale, sarebbe facile chiedere: di eseguire un'istruzione condizionale: se questo è vero, fai una cosa, altrimenti fai quest'altra cosa; di eseguire un'istruzione iterativa: ripeti questo per 100 volte; di eseguire una sequenza di istruzioni: fai prima questo, poi fai questo e poi quest'altro. Si tratta di istruzioni per noi molto semplici da comprendere, ma che devono essere espresse in modo da poter essere comprese dal computer. Ognuna delle precedenti istruzioni è un esempio di: una condizione, un'iterazione e una sequenza. Teorema Böhm-Jacopini Questo teorema afferma che qualsiasi algoritmo può essere descritto utilizzando solo tre tipi di strutture: la sequenziale, la condizionale e l'iterativa. Gli esempi appena visti erano proprio di queste strutture: I programmi che seguiranno sono privi di altre funzioni oltre al main() per metteree in evidenza solo queste tre strutture. Al loro fianco sarà presente un diagramma di flusso che usa gli stessi colori per mettere in evidenza le tre strutture. Le tre strutture possono anche essere combinate insieme tra di loro: si può inserire una struttura sequenziale all'interno di una condizionale(figura 1), oppure una struttura condizionale dentro una struttura iterativa (Figura 2).
In C++ l'inserimento di una struttura dentro un'altra si ottiene aumentando l'indentazione, cioè spostando un testo di quattro spazi più a destra, ad esempio: struttura-interna struttura-interna struttura-piu'-interna Traduzione Poiché queste tre strutture sono indispensabili per descrivere tutti gli algoritmi, ogni linguaggio di programmazione consente di tradurle come istruzioni. Nei prossimi esempi si vedrà che La struttura sequenziale si traduce in C++ scrivendo una sequenza di istruzioni, in fila e ben allineate verticalmente, con la stessa indentazione: istruz.1
istruz.5 La struttura condizionale si traduce in C++ usando un'istruzione if ed eventualmente else (attenzionee all'indentazione di alcune righe) if ( ) else Struttura sequenziale Un programma può eseguire una lista sequenziale di istruzioni Esempio che calcola l'area di un cerchio chiedere in input un valore per il raggio calcola l'area di un cerchio (formula) visualizzare in output l'area var. di input tipo var. di output tipo var. di lavoroo tipo raggio num. virgola area num. virgola area num. virgola La struttura sequenziale si traduce in C++ con una lista ben allineata, perché in C++ l'indentazione viene usata proprio per segnare la struttura della sequenza istruz.1
istruz.5 Struttura condizionale Un programma può eseguire istruzioni diverse in base al verificarsi di una condizione Esempio che visualizza la maggiore età chiedere in input il valore dell'anno di nascita calcolare l'età attuale se età < 18 allora visualizzare in output: sei minorenne altrimenti visualizzare in output: sei maggiorenne costanti valore var. di input tipo var. di output tipo var. di lavoro annoattuale 2012 annonascita intero - - - La struttura condizionale si traduce in C++ indicando la condizione dentro il rombo dentro un'istruzione if che contiene la condizione logica da verificare. Dopo si scrive l'istruzione (o le istruzioni) da eseguire nel caso vero. Poi, nell'eventualità che vi siano istruzioni nel caso falso, si scrive else e dopo le sue eventuali istruzioni. tipo - if (condizione) // se la condizione è vera fai quello che sta tra parentesi graffe { } else // altrimenti fai quello che sta tra le parentesi graffe dopo l else { }
Struttura condizionale nidificata Esempio che visualizza il minimo di tre numeri chiedere in input 3 valori numerici interi (primo,secondo,terzo) se primo < secondo allora: Se primo < terzo Inizio allora il minimo è primo altrimenti il minimo è terzo altrimenti: Se secondo < terzo num1,num2,num3 allora il minimo è secondo altrimenti il minimo è terzo visualizzare minimo Inserisci 3 numeri Leggi num1, num2, num3 No num1<num2 Si num1<num3 num2<num3 num1 num3 num2 num3 fine
Struttura iterativa (ciclica) La struttura iterativa può essere studiata come composta da diversi elementi (che possono anche coincidere tra loro): 1. un'eventuale variabile contatore (per numerare e contare quante sono le ripetizioni effettuate) 2. un'eventuale variabile totalizzatore (per accumulare l'eventuale risultato di tutte le operazioni ripetute) 3. la valutazione di un'espressione logica di uscita o condizione di uscita (per terminare in qualche modo la ripetizione) 4. un'eventuale istruzione che modifica la variabile contenuta nella condizione di uscita (ad esempio l'incremento del contatore) A seconda della posizione occupata dalla condizione di uscita all'interno della ripetizione, la struttura iterativa può essere di due tipi: precondizionale postcondizionale In pratica, nel tipo precondizionale, quando la condizione di uscita non è verificata, la ripetizione non viene mai eseguita, mentre nella postcondizionale la ripetizione viene eseguita sempre almeno una volta. In entrambi i casi si esce dal ciclo di ripetizione quando la condizione diventa falsa. Struttura iterativa postcondizionale Anche se in teoria esiste, si possono scrivere programmi senza usarla, quindi per ora viene omessa Struttura iterativa precondizionale Precondizionale significa che la condizione di uscita precede la ripetizione, quindi, in questo caso, potrebbe accadere che, se la condizione non è verificata, la ripetizione non sia mai eseguita La struttura iterativa precondizionale in C++ si può realizzare in due modi: per tradurre un diagramma di flusso si presta molto bene la struttura while, mentre si può usare for nel caso in cui la ripetizione riguardi una sequenza predefinita (come una sequenza di passi numerati o come una lista ordinata di elementi). while (controllo ) { istruzione 1; istruzione n; } //mentre il controllo è vero fai ciò che si trova tra le parentesi graffe La condizione di uscita del rombo deve essere indicata dentro il while. L'eventuale inizializzazione del contatore va indicata prima del while. Le istruzioni da ripetere, così come l'istruzione che modificano il valore del contatore, vanno indicate subito dopo il while indentate dentro le parentesi graffe.