Parte 4
Fondamenti di Programmazione
Strutture di controllo
1
Controllo del flusso
Flusso di esecuzione: ordine in cui le
istruzioni di un programma sono eseguite
 Salvo contrordini, è in sequenza
 Due possibili alterazioni:

selezione: sceglie un’azione da una lista di
due o più azioni possibili
 ripetizione: continua ad eseguire un’azione
fino a quando non si verifica una condizione
di termine

2
Strutture Java

Sequenza


di default
Selezione
» if
» if-else
» switch

Ripetizione
» while
» do-while
» for
3
Valori Booleani

boolean: tipo di dato primitivo in Java
che può assumere valore true oppure
false

Variabili (o espressioni) il cui valore è di
tipo boolean sono chiamate variabili (o
espressioni) Booleane

Il valore di una variabile (o espressione)
Booleana è true oppure false
4
Espressioni Booleane


Esprimono una condizione che
risulta essere vera o falsa
Esempio (A e B sono due dati non
necessariamente dello stesso
tipo):



A è maggiore di B?
A è uguale a B?
A è minore di oppure uguale a B?
5
Operatori di confronto
Notazione matematica
= (uguale a)
 (diverso da)
> (maggiore di)
 (maggiore di oppure uguale a)
< (minore di)
 (minore di oppure uguale a)
Java
==
!=
>
>=
<
<=
Esempio
utile == 0
utile  tax
ricavi > costi
voto >= 60
pressione < max
ricavi <= costi
6
Confronto tra caratteri e
stringhe


Si può confrontare caratteri: sono infatti basati su
Unicode che definisce un ordinamento per tutti i
possibili caratteri che possono essere usati. Dato
che in Unicode, per esempio, il carattere ‘a’ viene
prima di ‘b’, si può dire che ‘a’ è minore di ‘b’.
Non si possono usare operatori di confronto e di
uguaglianza tra stringhe.
7
Confronto tra valori in virgola
mobile
Raramente si usa l’operatore di
uguaglianza tra due valori in virgola
mobile.
 Per testare l’uguaglianza di due valori in
virgola mobile si può calcolare il valore
assoluto della loro differenza e
confrontare il valore così ottenuto con un
valore di tolleranza, ad esempio 0,00001.

8
Operatori logici

AND: &&



OR: ||



congiunge due espressioni
valore di ritorno true se e solo se entrambi le
espressioni sono vere
disgiunge due espressioni
valore di ritorno false se e solo se entrambi le
espressioni sono false
Valutazione della seconda espressione
condizionata

per avere valutazione completa, usare & e |
9
Altri operatori logici

NOT: !
nega un’espressione
 valore di ritorno true se e solo se
l’espressione è falsa


XOR: ^
disgiunge due espressioni in modo
esclusivo
 valore di ritorno true se e solo se le due
espressioni hanno diversi valori di ritorno
 esprimibile mediante AND, OR e NOT

10
Precedenze e associatività
Operatori
Associatività
++ -++ -- + - !
(type)
*/%
+< <= > >=
= = !=
&
^
|
&&
||
= += -= *= /= %= &= |= ^=













Tipo
Unario postfisso
Unario
Conversione
Moltiplicativo
Additivo
Relazionale
Uguaglianza
AND
XOR
OR
AND
OR
assegnazione
11
Esempio

score < min/2 – 10 || score > 90

score < (min/2) – 10 || score > 90

score < ((min/2) – 10) || score > 90

(score < ((min/2) – 10)) || (score > 90)

((score < ((min/2) – 10)) || (score > 90))
12
Blocchi di istruzioni

Insiemi di istruzioni racchiuse tra parentesi
graffe
corrispondono ad un’azione
 parentesi non necessarie se include una sola
istruzione


Esempio:
{ //inizio del blocco
calorieLess = 500;
calorieAllotment = calorieAllotment-calorieLess;
} //fine del blocco
13
Istruzione if

Selezione semplice:


esegue un’azione se solo se una certa condizione è
verificata
Sintassi:
if (Espressione_Booleana)
Blocco_1 //esegui solo se vera
Prossima_Istruzione; //sempre eseguita
Espressione_Booleana
true
Blocco_1
false
Prossima_Istruzione
14
Esempio



Se il peso è superiore a quello ideale allora
diminuisci il numero totale di calorie che si
possono assumere di 500.
Successivamente, imposta il numero di calorie
da assumere per colazione ad un terzo del
numero totale di calorie
if(weight > ideal)
calorieAllotment = calorieAllotment-500;
calorieBreakfast = calorieAllotment/3;
15
Istruzione if-else

Selezione doppia:


esegue un’azione oppure un’altra in base al
valore di una condizione
Sintassi:
if (Espressione_Booleana)
Blocco_1 //esegui solo se vera
else
Blocco_2 //esegui solo se falsa
Prossima_Istruzione; //sempre eseguita
16
Diagramma di flusso
Espressione_Booleana
true
Blocco_1
false
Blocco_2
Prossima_Istruzione
17
Esempi

Esempio con una singola istruzione:
if(balance >=0)
balance=balance+(INTEREST_RATE*balance)/12;
else
balance=balance-OVERDRAWN_PENALTY;

Esempio con un’istruzione composta:
if(balance >=0)
{
interest=(INTEREST_RATE*balance)/12;
balance=balance+interest;
}
else
{
interst=OVERDRAWN_PENALTY;
balance=balance-interest;
}
18
Istruzioni if-else annidate

Annidamento di istruzioni if-else:



tratta situazioni con più di due possibilità
Attenzione : ogni else si riferisce all’if più vicino
Sintassi:
if (Espressione_Booleana_1)
Blocco_1
else if (Espressione_Booleana_2)
Blocco_2
.
else if (Espressione_Booleana_ n)
Blocco_n
else
Blocco_Default
19
Esempio
if (score >= 90)
grade = ‘A’;
else if (score >= 80)
grade = ‘B’;
else if (score >= 70)
grade = ‘C’;
else if (score >= 60)
grade = ‘D’;
else
grade = ‘E’;
20
Istruzione switch


Selezione multipla
Sintassi:
switch(Espressione_Di_Controllo)
{
case Etichetta_Caso_1:
Sequenza_Istruzioni_1
break;
case Etichetta_Caso_2:
Sequenza_Istruzioni_2
break;
...
}
default:
Sequenza_Istruzioni_Default
21



Espressione_Di_Controllo deve essere
char, int, short o byte
Espressione_Di_Controllo e le varie
Etichette_Caso_* devono essere dello
stesso tipo
L’istruzione break, che può essere omessa,
fa, passare il controllo alla prima istruzione
dopo l’istruzione switch

se break non è inclusa, allora l’esecuzione procede
con le istruzioni del caso successivo
22
Diagramma di flusso
Espressione_Di_Controllo = Etichetta_Caso_1
true
Sequenza_Istruzioni_1
false
break?
true
false
Espressione_Di_Controllo = Etichetta_Caso_2
true
Sequenza_Istruzioni_2
false
break?
...
false
true
default?
true
...
Sequenza_Istruzioni_Default
false
23
Esempio
switch (seatLocationCode)
{
case 1:
type=‘O’;
price = 40.00;
break;
case 2:
type=‘M’;
price = 30.00;
break;
case 3:
case 4:
type=‘B’;
price = 15.00;
break;
default:
type=‘U’;
}
24
L’operatore condizionale
È l’unico operatore ternario di Java
 Sintassi:



(Espressione Booleana)?
Espressione_1:Espressione_2;
Il valore di ritorno è quello di
Espressione_1 se Espressione
Booleana è vera, altrimenti è quello di
Espressione_2
25
Esempio

max = (n1>n2)?n1:n2;

Equivale a:
if (n1>n2)
max = n1;
else
max = n2;
26
Ripetizione: i cicli

Struttura:



Organizzazione logica



corpo del ciclo
condizione di terminazione del ciclo
cicli controllati da condizioni
cicli controllati da contatori
Istruzioni Java per realizzare cicli



while
do-while
for
27
Ciclo while


Sintassi:
while (Espressione_Booleana)
Blocco //corpo del ciclo
Prossima_Istruzione
Espressione_Booleana rappresenta la
condizione di ripetizione del ciclo



si esce dal ciclo, quando è falsa
Blocco rappresenta il corpo del ciclo
Istruzioni di inizializzazione precedono
generalmente il ciclo
28
Diagramma di flusso
Espressione_Booleana
true
Blocco
false
Prossima_Istruzione
29
Esempio

Ciclo che calcola la somma dei primi 10
numeri interi
int total = 0;
int count = 1;
while (count <= 10)
{
total = total + count;
count++;
}
30
Minimo numero di iterazioni


Il numero minimo di iterazioni di un ciclo
while è 0 dato che la condizione di ingresso
può essere immediatamente falsa
Esempio:
int next;
int total = 0;
next = (int)(Math.random()*100)-50;
while (next >= 0)
{
total = total + next;
next = (int)(Math.random()*100)-50;
}
31
Ciclo do-while

Sintassi:
do
Blocco //corpo del ciclo
while (Espressione_Booleana);
Prossima_Istruzione

Il corpo del ciclo è eseguito almeno una volta
dato che la condizione di ripetizione è posta
dopo il corpo stesso
32
Diagramma di flusso
Blocco
true
Espressione_Booleana
false
Prossima_Istruzione
33
Esempio
int next;
int total = 0;
do
{
next = (int)(Math.random()*100)50;
total = total + next;
}
while (next >= 0);
34
Cicli infiniti

Cause principali:



errata espressione Booleana
errata (o assente) alterazione delle variabili coinvolte
nell’espressione Booleana
Esempio:
int total = 0;
int count = 1;
while (count != 10)
{
total = total + count;
count += 2;
}
35
Ciclo for

Struttura:





azione di inizializzazione
condizione di ripetizione
corpo del ciclo
azione di continuazione
Sintassi:
for (Inizializzazione;
Espressione_Booleana;
Continuazione)
Blocco
Prossima_Istruzione
36
Diagramma di flusso
Inizializzazione
Espressione_Booleana
false
true
Blocco
Continuazione
Prossima_Istruzione
37
Esempio

Sommare separatamente i numeri pari e
quelli dispari compresi tra 1 e 100
int sumEven = 0, sumOdd = 0;
for (int count = 1; count <= 99; count+=2)
{
sumOdd = sumOdd + count;
sumEven = sumEven + count + 1;
}
38
Considerazioni pratiche

Errori comuni:




cicli infiniti (non intenzionali)
cicli con contatore che non eseguono il numero di iterazioni
desiderato (scarto di uno).
Testare soprattutto la condizione di ripetizione di un
ciclo per evitare possibili errori
Mantenere traccia dei valori delle variabili (facendo
uso di stampe su video)
39
Questioni di stile

Blocchi:
{
Sequenza_Istruzioni
}


inserire le parentesi graffe anche se il blocco è
costituito da una sola istruzione
indentare tutte le istruzioni incluse nella
sequenza
40
Istruzione if:
if (Espressione_Booleana)
Blocco
 Istruzione if-else:
if (Espressione_Booleana)
Blocco else
Blocco

41

Istruzione switch:
switch (Espressione_Di_Controllo)
{
case Etichetta_1:
Sequenza_Istruzioni_1
case Etichetta_2:
Sequenza_Istruzioni_2
...
case Etichetta_n:
Sequenza_Istruzioni_n
default:
Sequenza_Istruzioni_Default
}
42



Istruzione while:
while (Espressione_Booleana)
Blocco
Istruzione do-while:
do
Blocco while (Espressione_Booleana);
Istruzione for:
for (Inizializzazione ; EB; Continuazione)
Blocco
43
Scarica

Lezione4