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