Istruzioni condizionali e blocco Capitolo 13 febbraio 2004 Istruzioni condizionali e blocco
Introduzione alle istruzioni di controllo Tipologie di istruzioni istruzioni semplici istruzioni strutturate o di controllo istruzioni composte da più istruzioni e/o condizioni tre categorie di istruzioni strutturate blocco (o istruzione composta) istruzione condizionale istruzione ripetitiva Istruzioni condizionali e blocco
Istruzione condizionale if-else Scrivere un frammento di codice che calcola il minore tra due numeri interi dati ... calcola il minore tra due numeri interi a e b ... int minore; // il minore tra a e b if (a<b) minore = a; else minore = b; ... il risultato è minore ... Istruzioni condizionali e blocco
Istruzioni condizionali e blocco Istruzione if-else if ( espressione ) istruzione-parte-if else istruzione-parte-else espressione è la condizione dell’if-else deve essere di tipo boolean istruzione-parte-if è la parte if dell’istruzione if-else istruzione-parte-else è la parte else dell’istruzione if-else Semantica valuta il valore vespressione della condizione se il valore vespressione vale true, allora esegui l’istruzione parte if se invece il valore vespressione vale false, allora esegui l’istruzione parte else Istruzioni condizionali e blocco
Diagramma di flusso per l’istruzione if-else parte if parte else condizione true false istruzione if-else Istruzioni condizionali e blocco
Blocco (istruzione composta) Scrivere un frammento di codice che calcola il minore e il maggiore tra due numeri interi dati ... calcola il minore e il maggiore tra a e b ... if (a > b) minore = b; maggiore = a; else minore = a; maggiore = b; ... i risultati sono minore e maggiore ... questo frammento di codice non è corretto Per scrivere una sequenza di istruzioni dove è richiesta una singola istruzione, si deve usare un blocco un blocco (o istruzione composta) è una sequenza di istruzioni racchiuse tra parentesi graffe { e } Istruzioni condizionali e blocco
Istruzioni condizionali e blocco 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; } ... i risultati sono minore e maggiore ... Istruzioni condizionali e blocco
Semantica e diagramma di flusso per blocco { istruzione1 istruzione2 ... istruzionen } Semantica valuta le istruzioni che compongono il blocco, una alla volta e in sequenza, nell’ordine in cui sono scritte blocco istruzione1 istruzione2 istruzionen Istruzioni condizionali e blocco
Istruzione condizionale if 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++; Istruzioni condizionali e blocco
Istruzioni condizionali e blocco Istruzione if if ( espressione ) istruzione Semantica valuta la condizione se la condizione è vera, allora esegui l’istruzione parte if Istruzioni condizionali e blocco
Diagramma di flusso per l’istruzione if parte if true false istruzione if condizione Istruzioni condizionali e blocco
Istruzioni condizionali annidate Calcolare il maggiore tra tre numeri interi a, b e c dati una prima soluzione ... calcola il maggiore tra a, b e c ... 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, * confrontanto c con il maggiore tra a e b */ if (maggioreTraAeB > c) maggiore = maggioreTraAeB; maggiore = c; ... il risultato è maggiore ... Istruzioni condizionali e blocco
Istruzioni condizionali annidate Una soluzione alternativa ... calcola il maggiore tra a, b e c ... int maggiore; // il maggiore tra a, b e c if (a>b) // il maggiore è a oppure c if (a>c) // il maggiore è a maggiore = a; else // il maggiore è c maggiore = c; else // il maggiore è b oppure c if (b>c) // il maggiore è b maggiore = b; ... il risultato è maggiore ... Istruzioni condizionali e blocco
Cascata di istruzioni if-else consente di eseguire una istruzioni tra molte (N) sulla base di alcune condizioni (N-1) una modalità di composizione di istruzioni condizionali Istruzioni condizionali e blocco
Il problema del triangolo 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) if (b==c) /* ora uguali può valere 0, 1 oppure 3 */ Istruzioni condizionali e blocco
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"); Istruzioni condizionali e blocco
Istruzioni condizionali e blocco Diagramma di flusso alternativa1 condizione1 true false cascata di if-else alternativa2 condizione2 alternativaelse Istruzioni condizionali e blocco
Istruzioni condizionali e blocco Esempi 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"); Cascata di if-else senza l’ultima istruzione parte else if (lati==3) System.out.println("triangolo"); else if (lati==4) System.out.println("quadrato"); else if (lati==5) System.out.println("pentagono"); Istruzioni condizionali e blocco
Il problema dell’else mancante Se è 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 Istruzioni condizionali e blocco
Il problema dell’else mancante Una parte else appartiene all’ultima istruzione condizionale incontrata l’indentazione corretta ... 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"); Quale è la soluzione corretta? Istruzioni condizionali e blocco
Uso di predicati complessi Le condizioni delle istruzioni condizionali possono essere anche molto complesse operatori relazionali e/o operatori logici Istruzioni condizionali e blocco
Maggiore tra tre numeri ... calcola il maggiore tra a, b e c ... int maggiore; // il maggiore tra a, b e c if (a>b && a>c) // il maggiore è a maggiore = a; else if (b>c) // il maggiore è b maggiore = b; else // il maggiore è c maggiore = c; ... il risultato è maggiore ... Istruzioni condizionali e blocco
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"); Istruzioni condizionali e blocco
Istruzioni condizionali e blocco Linee guida Linee guida per selezionare l’istruzione di controllo più adeguata a un caso in esame se devono essere eseguite delle istruzioni in sequenza va usata una istruzione composta (blocco) se deve essere eseguita una istruzione al verificarsi di una condizione, oppure non bisogna fare niente va usata l’istruzione condizionale if se deve essere eseguita una tra due istruzioni in alternativa sulla base dell’esito di una condizione va usata l’istruzione condizionale if-else se deve essere eseguita una tra tre o più istruzioni (in alternativa) sulla base dell’esito di più condizioni va usata una cascata di istruzioni if-else se, sulla base dell’esito di più condizioni, deve essere eseguita una tra due o più istruzioni (in alternativa) oppure niente va usata una cascata di istruzioni if-else senza parte else finale Istruzioni condizionali e blocco
Istruzioni condizionali e blocco Errori comuni Un errore comune nell’uso dell’istruzione composta dimenticare di usarla Attenzione all’istruzione vuota – composta da un punto e virgola ... se numero vale zero incrementa zeri ... if (numero==0); zeri++; 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 (???) */ Istruzioni condizionali e blocco