Programmazione Procedurale in Linguaggio C++ Strutture di Controllo Parte 2 Istruzioni Condizionali versione 2.0 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca – [email protected] – Università della Basilicata Strutture di Controllo: Istruzioni Condizionali >> Sommario Sommario Introduzione Istruzione if-then-else Istruzione if-then Istruzioni Condizionali Nidificate Esercizio: Riconoscimento di Triangoli G. Mecca - Programmazione Procedurale in Linguaggio C++ 2 Strutture di Controllo: Istruzioni Condizionali >> Introduzione Introduzione Istruzione if-then-else esecuzione di blocco di codice oppure di un’altro a seconda che una condizione sia vera o falsa Istruzione if-then esecuzione di un blocco di codice se la condizione è vera altrimenti nessun effetto G. Mecca - Programmazione Procedurale in Linguaggio C++ 3 Strutture di Controllo: Istruzioni Condizionali >> Istruzione if-then-else Istruzione if-then-else Sintassi: if (<condizione>) <blocco1> else <blocco2> Dove <condizione> è una espressione con valore booleano <blocco1> e <blocco2> blocchi di istruzioni G. Mecca - Programmazione Procedurale in Linguaggio C++ 4 Strutture di Controllo: Istruzioni Condizionali >> Istruzione if-then-else Istruzione if-then-else Semantica viene valutato il valore della <condizione> se il valore dell’espressione è true si esegue <blocco1> se il valore dell’espressione è false si esegue <blocco2> in entrambi i casi l’esecuzione procede con l’istruzione immediatamente successiva G. Mecca - Programmazione Procedurale in Linguaggio C++ 5 Strutture di Controllo: Istruzioni Condizionali >> Istruzione if-then-else Esempio n.1 int a; istruzione precedente istruzione if-then-else istruzione successiva cin >> a; if ((a % 2) == 0) { cout << “il numero e’ pari”; } else { cout << “il numero e’ dispari”; } cout << “Fine”; G. Mecca - Programmazione Procedurale in Linguaggio C++ 6 Strutture di Controllo: Istruzioni Condizionali >> Istruzione if-then-else Esempio n.2 int a, b; cin >> a; cin >> b; if (a > b) { cout << “a maggiore di b ”; cout << “Valore di a:” << a; } else { cout << “a non e’ maggiore di b ”; cout << “Valore di b:” << b; } cout << “Fine”; G. Mecca - Programmazione Procedurale in Linguaggio C++ 7 Strutture di Controllo: Istruzioni Condizionali >> Istruzione if-then-else Esempio n.3 Caso a: Inserisci somma e num. es. 72 3 float sommaVoti, numeroEsami, Media: 24 media; -Fine2. cout << “Inserisci somma e Flusso di esecuzione: num. es.” << endl; 1-2-3-4-condizione-6-7-11 3. cin >> sommaVoti; Caso b: 4. cin >> numeroEsami; Inserisci somma e num. es. 5. if (numeroEsami>0) { 100 -3 6. media = sommaVoti/numeroEsami; 7. cout << “Media: ” << media; Errore 8. } else { -Fine9. cout << “Errore”; Flusso di esecuzione: 10. } 1-2-3-4-condizione-9-11 11. cout << “-Fine-”; 1. G. Mecca - Programmazione Procedurale in Linguaggio C++ 8 Strutture di Controllo: Istruzioni Condizionali >> Istruzione if-then Istruzione if-then Sintassi if (<condizione>) <blocco> Semantica viene valutata la condizione se la condizione è vera viene eseguito il blocco e poi si prosegue con l’istr. successiva se la condizione è falsa si prosegue direttamente con l’istruzione successiva G. Mecca - Programmazione Procedurale in Linguaggio C++ 9 Strutture di Controllo: Istruzioni Condizionali >> Istruzione if-then Istruzione if-then Esempio: int a; cout << “Immetti un numero positivo” << endl; cin >> a; se il valore di a è positivo if (a < 0 ) { non è necessario effettuare a = abs(a); alcuna operazione } cout << “Radice quadrata: “ << sqrt(a); G. Mecca - Programmazione Procedurale in Linguaggio C++ 10 Strutture di Controllo: Istruzioni Condizionali >> Nidificazione Istruzione Condizionali Nidificate Nidificazione le istruzioni che seguono l’if e/o l’else possono essere istruzioni qualsiasi in particolare, possono essere a loro volta istruzioni condizionali il processo può essere ripetuto a molti livelli Analogo è come se gli if interni facessero il “nido” in quelli esterni G. Mecca - Programmazione Procedurale in Linguaggio C++ 11 Strutture di Controllo: Istruzioni Condizionali >> Nidificazione Istruzione Condizionali Nidificate Come deve essere interpretata la semantica ? in modo del tutto ordinario ciascuna istruzione condizionale viene eseguita secondo la sua semantica bisogna solo fare attenzione al modo in cui vengono valutate le condizioni ed alla sequenza delle scelte G. Mecca - Programmazione Procedurale in Linguaggio C++ 12 Strutture di Controllo: Istruzioni Condizionali >> Nidificazione Istruzione Condizionali Nidificate int a, b, differenza; if esterno if interno cin >> a; cin >> b; if (a > b) { cout << “a maggiore di b” << endl; differenza = a - b; } else { if (b > a) { cout << “b e’ maggiore di a” << endl; } else { cout << “a e b sono uguali” << endl; } differenza = b - a; } cout << “Differenza: ” << differenza << endl; G. Mecca - Programmazione Procedurale in Linguaggio C++ 13 Strutture di Controllo: Istruzioni Condizionali >> Nidificazione Caso a: Istruzione Condizionali Nidificate 74 a maggiore di b Differenza: 3 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. int a, b, differenza; cin >> a; cin >> b; if (a > b) { cout << “a maggiore di b” << endl; differenza = a - b; } else { if (b > a) { cout << “b maggiore di a”; } else { cout << “a e b sono uguali”; } differenza = b - a; } cout << “Differenza: ” << differenza; G. Mecca - Programmazione Procedurale in Linguaggio C++ Flusso di esecuzione: 1-2-3-cond(T)-5-6-15 Caso b: 6 34 b maggiore di a Differenza: 28 Flusso di esecuzione: 1-2-3-cond(F)-7-cond(T)-9-13-15 Caso c: 77 a e b sono uguali Differenza: 0 Flusso di esecuzione: 1-2-3-cond(F)-7-cond(F)-1011-13-15 14 Strutture di Controllo: Istruzioni Condizionali >> Esercizio Esercizio: Riconoscimento di Triangoli Problema: date le lunghezze dei lati di un triangolo riconoscere e stampare di che tipo di triangolo si tratta (isoscele, equilatero o scaleno) Analisi delle Specifiche: dati in ingresso: le lunghezze a, b, c dei lati dati in uscita: uno dei seguenti messaggi “Triangolo equilatero” “Triangolo isoscele” “Triangolo scaleno” in generale bisogna anche eliminare le ambiguità (es: condizioni di errore) G. Mecca - Programmazione Procedurale in Linguaggio C++ 15 Strutture di Controllo: Istruzioni Condizionali >> Esercizio Esercizio: Riconoscimento di Triangoli Scelta dell’algoritmo I passo: strategia di rappresentazione dei dati II passo: strategia di operazioni Strategia di rappresentazione lunghezze dei lati a,b,c: variabili float a,b,c Strategia di operazioni acquisisco le lunghezze dei lati verifico se il tr. è equilatero; altrimenti verifico se il tr. è isoscele; altrimenti il tr. è scaleno >>> scrittura del programma G. Mecca - Programmazione Procedurale in Linguaggio C++ 16 Strutture di Controllo: Istruzioni Condizionali >> Esercizio Esercizio: Riconoscimento di Triangoli #include <iostream.h> void main(){ float a,b,c; cout << "Immetti i tre lati " << endl; cin >> a; cin >> b; cin >> c; if ((a==b) && (b==c)) { cout << "il triangolo e' equilatero" << endl; } else { if((a==b) || (a==c) || (b==c)) { cout << "il triangolo e' isoscele" << endl; } else { cout << "il triangolo e' scaleno" << endl; } } } G. Mecca - Programmazione Procedurale in Linguaggio C++ 17 Strutture di Controllo: Istruzioni Condizionali >> Esercizio Esercizio a Casa: Volo dello Shuttle Problema: uno shuttle decolla alle ore X, minuti Y, secondi Z del giorno 1 gennaio 2002 lo shuttle sta in volo X1 ore, Y1 minuti, Z1 secondi (per un totale di meno di 24 ore) e poi atterra dato l’orario di decollo X:Y:Z, e il tempo di volo X1:Y1:Z1, calcolare la data e l’ora di atterraggio Esempio decollo alle ore 18:40:10 del 1 gennaio 2002 tempo di volo pari a 20:40:15 atterraggio il 2 gennaio 2002 alle ore 15:20:25 G. Mecca - Programmazione Procedurale in Linguaggio C++ 18 Strutture di Controllo: Istruzioni Condizionali >> Esercizio Esercizio a Casa: Volo dello Shuttle Attenzione per ora per semplicità trascuriamo il controllo degli errori possiamo supporre che l’utente digiti dati corretti altrimenti il programma si allungherebbe eccessivamente Inoltre evitare il controllo delle date G. Mecca - Programmazione Procedurale in Linguaggio C++ 19 Strutture di Controllo: Istruzioni Condizionali >> Sommario Riassumendo Istruzioni Condizionali servono a controllare l’esecuzione dei blocchi del programma sulla base di condizioni condizione: espressione vera o falsa due forme: if-then-else, if-then Nidificazione attenzione ai riferimenti G. Mecca - Programmazione Procedurale in Linguaggio C++ 20 Strutture di Controllo >> Un Esempio Un Esempio: Media con For #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami, i; cout << "Quanti esami hai sostenuto ?" << cin >> numeroEsami; sommaVoti = 0.0; for (i=0; i<numeroEsami; i++) { cout << "Immetti il voto di un esame" cin >> voto; sommaVoti += voto; } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << } else { cout << "Non hai fornito nessun voto" } } G. Mecca - Programmazione Procedurale in Linguaggio C++ endl; << endl; endl; << endl; 21 Strutture di Controllo >> Un Esempio Un Esempio: Media con While #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami; bool continua; continua = true; numeroEsami = 0; sommaVoti = 0.0; while (continua == true) { cout << "Immetti il voto (0 per fermarti)" << endl; cin >> voto; if (voto == 0) { continua = false; } else { numeroEsami++; sommaVoti += voto; } } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; } else { cout << "Non hai fornito nessun voto" << endl; } } G. Mecca - Programmazione Procedurale in Linguaggio C++ 22 Ringraziamenti Ringraziamenti Parte del materiale di questa lezione è stato sviluppato con la collaborazione della Dott.ssa Maria Samela ([email protected]), a cui va il mio ringraziamento. G. Mecca - Programmazione Procedurale in Linguaggio C++ 23 Termini della Licenza Termini della Licenza This work is licensed under the Creative Commons AttributionShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. G. Mecca - Programmazione Procedurale in Linguaggio C++ 24