Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 10 Istruzioni Condizionali Carla Limongelli Novembre 2011 http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 1 Contenuti Classificazione delle istruzioni in Java Introduzione alle istruzioni di controllo Istruzione di selezione if-else Blocco (istruzione composta) http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 2 Prerequisiti Questo capitolo presuppone la conoscenza degli argomenti già trattati nelle precedenti lezioni di questo corso con particolare riferimento a: Sintassi e semantica dei linguaggi Metalinguaggi per la descrizione della sintassi (EBNF) Predicati http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 3 Una classificazione delle principali istruzioni di Java istruzione o dichiarazione dichiarazione variabile locale istruzione istruzione semplice istruzione espressione istruzione strutturata istruzione istruzione istruzione istruzione return break continue vuota blocco istruzione istruzione istruzione invocazione di incremento assegnazione di metodo o decremento istruzione ripetitiva istruzione creazione di oggetto istruzione if http://www.dia.uniroma3.it/~java/fondinf/ istruzione condizionale istruzione if-else Istruzioni condizionali istruzione while istruzione for istruzione do-while 4 Istruzioni strutturate o di controllo Ogni istruzione strutturata, pur essendo composta da più istruzioni, viene considerata sintatticamente una singola istruzione questo consente la composizione delle istruzioni Semantica delle istruzioni strutturate è definita con riferimento alle sue componenti • istruzioni e condizioni http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 5 Introduzione alla programmazione strutturata I linguaggi di programmazione, oltre alle istruzioni semplici, definiscono delle istruzioni strutturate o di controllo permettono di “controllare” il flusso di esecuzione di altre istruzioni Teorema di Iacopini Böhm Qualunque algoritmo può essere implementato utilizzando tre sole istruzioni (strutturate): sequenza selezione iterazione http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 6 Istruzione condizionale o di selezione Seleziona una determinata sequenza di istruzioni da eseguire sulla base di una condizione se (il pneumatico è sgonfio) allora se (è bucato) allora sostituiscilo altrimenti gonfialo In Java: istruzione if-else http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 7 Istruzione if-else: sintassi if ( <condizione> ) <istruzione-parte-if> [ else <istruzione-parte-else> ] Dove <condizione> ::= <espressione-booleana> <istruzione-parte-if> ::= <istruzione> <istruzione-parte-else> ::= <istruzione> <istruzione> ::= <istruzione-semplice> | <istruzione-strutturata> http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 8 Istruzione if-else: semantica ... valuta il valore vespressione della condizione il valore vespressione può essere true (la condizione si è verificata, è vera) oppure false (la condizione non si è verificata, è falsa) se il valore vespressione vale true, allora esegui istruzione-parte-if se invece il valore vespressione vale false, allora esegui istruzione-parte-else http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 9 ... semantica La semantica dell’istruzione if-else può essere descritta graficamente mediante il seguente diagramma di flusso true false condizione parte-if parte if parte-else istruzione if-else http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 10 Esempio ... calcola il minore tra due numeri interi a e b ... int minore; // il minore tra a e b condizione if (a < b) minore = a; else minore = b; http://www.dia.uniroma3.it/~java/fondinf/ istruzione che deve essere eseguita se la condizione è vera istruzione che deve essere eseguita se la condizione è falsa Istruzioni condizionali 11 Esercizi Maggiore tra tre numeri Verifica che un dato anno sia bisestile Soluzione delle equazioni della forma ax2 + bx +c = 0 http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 12 Sequenza Spesso, al verificarsi di una condizione bisogna eseguire una sequenza di istruzioni (e non una singola istruzione), altrimenti bisogna eseguire un’altra sequenza di istruzioni ... calcola il minore e il maggiore tra a e b ... if (a > b) minore = maggiore else minore = maggiore b; = a; a; = b; Come algoritmo è corretto, ma come porzione di codice Java no! http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 13 Blocco (istruzione composta) un blocco è un’istruzione strutturata è una sequenza di istruzioni (semplici o strutturate) che devono essere eseguite una dopo l’altra http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 14 Blocco: sintassi <blocco> ::= { {<istruzione>} } <istruzione> ::= <istruzione-semplice> | <istruzione-strutturata> http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 15 Uso di blocchi ... calcola il minore e il maggiore tra a e b ... if (a > b) { minore = b; maggiore = a; } else{ minore = a; maggiore = b; } Ora la porzione di codice implementa correttamente l’algoritmo http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 16 Blocco: semantica valuta le istruzioni che compongono il blocco, una alla volta e in sequenza, nell’ordine in cui sono scritte istruzione1 istruzione2 istruzionen blocco http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 17 Esercizio Che cosa stampa il seguente frammento di codice • quando ad n viene assegnato il valore 0? • quando ad n viene assegnato il valore 1? int n; n = ... ; if (n==0) { System.out.println("n vale zero"); n++; } else { System.out.println("n è diverso da zero"); n--; }; http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 18 Esercizio Scrivere un frammento di codice che incrementa la variabile zeri se la variabile numero vale zero • se numero non vale zero allora non bisogna fare niente ... se numero vale zero incrementa zeri ... if (numero==0) zeri++; http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 19 Esercizio … Si consideri il problema di calcolare il maggiore tra tre numeri interi a, b e c dati • una prima soluzione int maggiore; // il maggiore tra a, b e c int maggioreTraAeB; // il maggiore tra a e b /* calcola il maggiore tra a e b */ if (a>b) maggioreTraAeB = a; else maggioreTraAeB = b; /* calcola il maggiore tra a, b e c, * confrontando c con il maggiore tra a e b */ if (maggioreTraAeB > c) maggiore = maggioreTraAeB; else maggiore = c; http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 20 … continua Una soluzione alternativa int maggiore; if (a>b) // if (a>c) maggiore = else maggiore = else // if (b>c) maggiore = else maggiore = http://www.dia.uniroma3.it/~java/fondinf/ // il maggiore tra a, b e c il maggiore è a oppure c // il maggiore è a a; // il maggiore è c c; il maggiore è b oppure c // il maggiore è b b; // il maggiore è c c; Istruzioni condizionali 21 Il problema del triangolo Scrivere un frammento di codice che, dati tre numeri interi a, b e c che rappresentano le lunghezze dei lati di un triangolo, visualizza un messaggio che dice se il triangolo è equilatero, isoscele o scaleno • una attività preliminare – conta le coppie di lati uguali /* calcola il numero di coppie di lati uguali */ uguali = 0; /* confronta i lati */ if (a==b) uguali++; if (a==c) uguali++; if (b==c) uguali++; /* ora uguali può valere 0, 1 oppure 3 */ http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 22 Una “cascata” di istruzioni if-else /* visualizza il messaggio: * "scaleno" - se uguali vale 0 * "isoscele" - se uguali vale 1 * "equilatero" - se uguali vale 3 */ if (uguali==0) System.out.println("scaleno"); else if (uguali==1) System.out.println("isoscele"); else // uguali vale sicuramente 3 System.out.println("equilatero"); http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 23 Una indentazione migliore /* visualizza il messaggio: * "scaleno" - se uguali vale 0 * "isoscele" - se uguali vale 1 * "equilatero" - se uguali vale 3 */ if (uguali==0) System.out.println("scaleno"); else if (uguali==1) System.out.println("isoscele"); else // uguali vale sicuramente 3 System.out.println("equilatero"); questa modalità di scrittura dà l’apparenza di un’unica istruzione condizionale articolata in diverse alternative http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 24 Esempio Data l’età di una persona, visualizza il “tipo” di persona if (età<10) System.out.println("bambino"); else if (età<18) System.out.println("ragazzo"); else if (età<30) System.out.println("giovane"); else // età >= 30 System.out.println("adulto"); http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 25 Il problema dell’else mancante A volte è utile avere una istruzione condizionale nella parte else di un’altra istruzione condizionale • è meno utile e può essere fonte di errori usare una istruzione condizionale nella parte if di un’altra istruzione condizionale ... verifica se x è a sinistra/destra dell’intervallo [a,b] ... if (x>=a) // if-1 if (x>b) // if-2 System.out.println("destra"); else System.out.println("sinistra"); • è sbagliato – visualizza destra se x si trova a destra di b – visualizza sinistra se x si trova tra a e b – non visualizza niente se x si trova a sinistra di a http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 26 Il problema dell’else mancante Sintatticamente, una parte else appartiene all’ultima istruzione condizionale incontrata • ... verifica se x è a sinistra/destra dell’intervallo [a,b] ... if (x>=a) { if (x>b) System.out.println("destra"); } else System.out.println("sinistra"); La soluzione corretta? • usare un blocco http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 27 Maggiore tra tre numeri ... calcola il maggiore tra a, b e c ... int maggiore; if (a>b && a>c) maggiore = a; else if (b>c) maggiore = b; else maggiore = c; // il maggiore tra a, b e c // il maggiore è a // il maggiore è b // il maggiore è c ... il risultato è maggiore ... In una cascata di if-else è opportuno tenere in considerazione il fatto che una condizione viene valutata solo se tutte le precedenti sono risultate false http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 29 Il problema del triangolo /* calcola il tipo del triangolo * i cui lati sono a, b e c */ if (a==b && a==c) System.out.println("equilatero"); else if (a==b || a==c || b==c) System.out.println("isoscele"); else System.out.println("scaleno"); http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 30 Esercizi Dato un numero N, calcola il segno di N, che vale • 0 se N vale zero • 1 se N è positivo • -1 se N è negativo Completa il seguente frammento di codice /* calcola il tipo del triangolo * i cui lati sono a, b e c */ if ( ... ) System.out.println("scaleno"); else if ( ... ) System.out.println("equilatero"); else System.out.println("isoscele"); http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 31 Esercizio Tre numeri interi non sempre rappresentano i lati di un triangolo tre numeri interi rappresentano i lati di un triangolo se • sono tutti positivi, e • ciascuno dei numeri è minore della somma degli altri due numeri scrivere un frammento di codice che dati tre numeri interi, che dovrebbero rappresentare le lunghezze dei lati di un triangolo, visualizza un messaggio che dice se il triangolo è equilatero, isoscele o scaleno oppure che i tre numeri non rappresentano i lati di un triangolo http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 32 Errori comuni … Un errore comune nell’uso dell’istruzione composta • dimenticare di usarla Attenzione all’istruzione vuota • composta semplicemente da un punto e virgola ... se numero vale zero incrementa zeri ... if (numero==0); zeri++; • zeri viene incrementata sempre http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 33 … Errori comuni Scrivere le condizioni in una cascata di if-else senza tenere in considerazione il fallimento delle condizioni precedenti /* calcola il maggiore tra a, b e c */ if (a>b && a>c) maggiore = a; else if (b>a && b>c) maggiore = b; else if (c>a && c>b) maggiore = c; /* maggiore è il maggiore tra a, b e c (???) */ che succede se a, b e c sono uguali? http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 34 Cosa abbiamo imparato Sintassi e semantica delle istruzioni Condizionali (if-else) Blocco http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 35 Riferimenti al libro di testo Per lo studio di questi argomenti si fa riferimento al libro di testo, e in particolare al Capitolo 13 http://www.dia.uniroma3.it/~java/fondinf/ Istruzioni condizionali 36