Fondamenti di Informatica Istruzioni Condizionali

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