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