Corso di Informatica
(Programmazione)
Lezione 10 (12 novembre 2008)
Programmazione in Java:
espressioni booleane e
controllo del flusso (selezione)
1
Il tipo boolean
Il tipo boolean è in Java un tipo
primitivo che che può assumere
esclusivamente due valori: true e false
Esempio:
boolean b;
b=true;
System.out.println(b);
b=false;
System.out.println(b);
2
Espressione booleana
Un’espressione booleana è una combinazione di
operandi (variabili e valori), operatori
aritmetici, operatori relazionali, operatori logici
e parentesi tonde.
Un’espressione booleana restituisce in Java un
valore di tipo boolean e può essere pertanto
assegnata ad una variabile di tipo boolean
Esempio:
boolean b;
int x=10;
b=(x > 5); // b contiene il valore true
3
Operatori relazionali
Operatore
Descrizione
Uso
Restituisce true se…
==
Uguale a
op1 == op2
op1 è uguale a op2
!=
Diverso da
op1 != op2
op1 è diverso da op2
<
Minore di
op1 < op2
op1 è minore di op2
>
Maggiore di
op1 > op2
op1 è maggiore di op2
<=
Minore o
uguale a
op1 <= op2
op1 è minore o uguale a di
op2
>=
Maggiore o
uguale a
op1 >= op2
op1 è maggiore o uguale a
di op2
Gli operatori relazionali confrontano due operandi numerici e ne
determinano la relazione restituendo un valore di tipo boolean
4
Operatori relazionali (esempi)
Esempio 1:
int x=3;
int y=4;
boolean b;
b=(x<=y);
System.out.println(b);
La stampa è true
5
Operatori relazionali (esempi)
Esempio 2:
int x=3;
int y=4;
boolean b;
b=(x==y);
System.out.println(b);
La stampa è false
6
Operatori relazionali (esempi)
Esempio 3:
int x=3;
int y=4;
boolean b;
b=(x!=y);
System.out.println(b);
La stampa è true
7
Operatori logici
Operatore
Descrizione
Uso
Restituisce true se…
&&
AND
abbreviato
op1 && op2
op1 e op2 valgono entrambi
true
&
AND
op1 & op2
op1 e op2 valgono entrambi
true
||
OR abbreviato
op1 || op2
almeno uno tra op1 e op2 è
true
|
OR
op1 | op2
almeno uno tra op1 e op2 è
true
!
NOT
!op1
op1 è false
Gli operatori logici operano su operandi booleani (espressione
booleana, variabile booleana o valore booleano esplicito)
8
Operatori logici (esempio)
Esempio:
int x=3;
int y=4;
boolean b;
b=(x!=0 && x>y);
System.out.println(b);
La stampa è false
9
Operatori logici
La forma abbreviata degli operatori di AND e
OR differisce dalla forma normale per il fatto
che se una valutazione fallisce, le successive
valutazioni non vengono eseguite. Ad esempio:
int x=3;
int y=0;
boolean b;
b=(y!=0 && x>y);
L’espressione x>y non viene valutata in quanto y!=0 è
false e basta già per dire che l’intera espressione
assegnata a b è false.
10
Operatori logici
...oppure:
int x=3;
int y=0;
boolean b;
b=(y==0 || x>y);
L’espressione x>y non viene valutata in quanto y==0 è true
e basta già per dire che l’intera espressione assegnata a b è
true.
Attenzione! Non è detto che l’ordine di valutazione sia quello di codifica
dell’espressione… Quindi bisogna andare cauti con istruzioni che
potrebbero generare errori in runtime
11
Precedenza degli operatori
Operatori elencati per precedenza
decrescente:
 pre-incremento ++, pre-decremento --,
negazione aritmetica -
 post-incremento ++ e post-decremento -- e
negazione logica !
 moltiplicazione *, divisione / e modulo %
 somma + e sottrazione –
 minore <, maggiore >, minore o uguale <=,
maggiore o uguale >=
12
Precedenza degli operatori
...
 uguale a ==, diverso da !=
 AND &
 OR |
 AND &&
 OR ||
 assegnamenti: =, +=, -=, *=, /=, %=
13
Controllo del flusso
Il controllo del flusso è l’esecuzione ordinata di una
sequenza di istruzioni. Il controllo del flusso (che
vediamo…) può essere:
 sequenziale
esegue le istruzioni una alla volta nell’ordine in cui
sono state scritte
 selezione
esegue le istruzioni scelte tra almeno due possibilità
 iterazione
esegue ripetutamente delle istruzioni finchè si
verifica una certa condizione
14
Selezione
I costrutti di selezione (che vediamo…) sono:
 if (selezione a una via)
 if-else (selezione a due vie)
Nel costrutto di selezione viene effettuato un
test (definito da un’espressione booleana che
restituisce true o false). Se il test è positivo
(true) “si fa qualcosa” altrimenti “non si fa
nulla” nella selezione a una via, o “si fa qualcosa
d’altro” nella selezione a due vie.
15
Selezione a una via
La selezione a una via permette di eseguire un blocco di
istruzioni oppure di saltarlo
if(<boolEXPR>){
<BLOCK>;
}
<instruction_afterIF>;
...
dove <boolEXPR> è l’espressione booleana che valutata decide
se eseguire o meno il blocco di istruzioni definito da <BLOCK>.
Se <boolEXPR> restituisce true, <BLOCK> viene eseguito, il
controllo diventa in seguito sequenziale e viene eseguita
l’istruzione successiva <instruction_afterIF>. Se <boolEXPR>
restituisce false, <BLOCK> viene saltato e viene subito
eseguita l’istruzione successiva <instruction_afterIF>.
16
Selezione a una via (esempi)
Esempio 1:
int x=3;
if(x > 2){
x++;
}
System.out.println(“x=“+x);
La stampa è “x=4”
17
Selezione a una via (esempi)
Esempio 2:
int x=3;
if(x < 3){
x++;
}
System.out.println(“x=“+x);
La stampa è “x=3”
18
Selezione a due vie
La selezione a due vie permette di effettuare una scelta
tra due blocchi di istruzioni
if(<boolEXPR>){
<BLOCK1>;
}
else{
<BLOCK2>
}
<instruction_afterIF>;
...
dove <boolEXPR> è l’espressione booleana che valutata
decide se eseguire <BLOCK1> oppure <BLOCK2>. Se
<boolEXPR> restituisce true, viene eseguito <BLOCK1>, ...
19
Selezione a due vie
... il controllo diventa in seguito sequenziale e viene
eseguita l’istruzione successiva <instruction_afterIF>. Se
invece <boolEXPR> restituisce false, viene eseguito
<BLOCK2>, il controllo diventa in seguito sequenziale e viene
sempre eseguita l’istruzione <instruction_afterIF>.
20
Selezione a due vie (esempio)
Esempio:
int x=3, y=4, min;
if(x < y){
min=x;
}
else{
min=y;
}
System.out.println(“Minimo=“+min);
La stampa è “Minimo=3”
21
Selezione
Nel caso in cui i blocchi di istruzioni dei
costrutti di selezione (a una e a due vie) siano
composti da una sola istruzione, le parentesi
graffe di delimitazione non sono necessarie. Ad
esempio il codice della slide precedente può
essere riscritto nel modo seguente:
int x=3, y=4, min;
if(x < y)
min=x;
else
min=y;
System.out.println(“Minimo=“+min);
22
Selezione annidata
I blocchi di istruzioni di un costrutto di selezione (a una
o a due vie) possono essere a loro volta costrutti di
selezione (a una o a due vie). Ad esempio:
if(<boolEXPR1>){
if(<boolEXPR2>){
...
}
else{
...
}
}
else{
if(<boolEXPR3>){
...
}
else{
...
}
}
23
Selezione annidata (esempio)
Esempio:
int x=3, y=4, z;
if(x != y){
if(x < y)
z=x;
else
z=y;
}
else{
z=0;
}
System.out.println(“Z=“+z);
La stampa è “Z=3”
24
Scope di una variabile
Una variabile è visibile solo all’interno del
blocco di codice in cui viene diachiarata! Ad
esempio nel codice seguente:
int x=10;
if(x < 20){
int y=30;
System.out.println(x+y);
}
System.out.println(y); //ISTRUZIONE ERRATA!
La variabile y NON ESISTE al di fuori del
blocco di codice relativo al costrutto di
selezione
25
Scarica

ProgrammazioneLEZ10