Fondamenti di informatica Oggetti e Java Luca Cabibbo Istruzioni condizionali e blocco Capitolo 13 febbraio 2004 1 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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 2 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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 ... 3 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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 4 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Diagramma di flusso per l’istruzione if-else true condizione parte if false parte else istruzione if-else 5 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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 } 6 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Uso di blocchi ... calcola il minore e il maggiore tra a e b ... if (a > b) { minore = maggiore } else { minore = maggiore } b; = a; a; = b; ... i risultati sono minore e maggiore ... 7 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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 istruzione1 istruzione2 istruzionen blocco 8 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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++; 9 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Istruzione if if ( espressione ) istruzione Semantica valuta la condizione se la condizione è vera, allora esegui l’istruzione parte if 10 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Diagramma di flusso per l’istruzione if true condizione false parte if istruzione if 11 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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; else maggiore = c; ... il risultato è maggiore ... 12 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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; else // il maggiore è c maggiore = c; ... il risultato è maggiore ... 13 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Cascata di istruzioni if-else 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 14 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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) uguali++; if (b==c) uguali++; /* ora uguali può valere 0, 1 oppure 3 */ 15 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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"); 16 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Diagramma di flusso true false condizione1 false true condizione2 alternativa1 alternativa2 alternativaelse cascata di if-else 17 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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"); 18 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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"); 19 è sbagliato Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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? 20 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Uso di predicati complessi Le condizioni delle istruzioni condizionali possono essere anche molto complesse operatori relazionali e/o operatori logici 21 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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 ... 22 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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"); 23 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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 24 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl 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 (???) */ 25 Istruzioni condizionali e blocco Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl