1
PartParte 4e 4
Fondamenti di Programmazione
Strutture di controllo
2
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
3
Strutture Java Sequenza
di default
Selezione» if» if-else» switch
Ripetizione» while» do-while» for
4
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
5
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?
6
Operatori di confronto
Notazione matematica Java Esempio
= (uguale a) == utile == 0≠ (diverso )da != utile ≠ tax> (maggior e di) > ricav >i costi≥ (maggior e dioppu re ugual )e a >= vo to>= 60< (min ored )i < pression < e max≤ (mino re d i oppure ugua le a) <= ricav <i = costi
7
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.
8
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.
9
Operatori logici AND: &&
congiunge due espressioni valore di ritorno true se e solo se entrambi le espressioni sono vere
OR: || 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 |
10
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
11
Precedenze e associatività
Unario++ -- + - !Unario
postfisso++ --
assegnazione= += -= *= /= %= &= |= ^=
OR||AND&&OR|XOR^AND&
Uguaglianza= = !=Relazionale< <= > >=Additivo+ -
Moltiplicativo
* / %Conversione(type)
Operatori Associatività Tipo
12
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))
13
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
14
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_Booleanatrue
Blocco_1
false
Prossima_Istruzione
15
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;
16
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 veraelse Blocco_2 //esegui solo se falsaProssima_Istruzione; //sempre eseguita
17
Diagramma di flusso
Espressione_Booleanatrue
Blocco_1
false
Blocco_2
Prossima_Istruzione
18
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;}
19
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_1else if (Espressione_Booleana_2) Blocco_2 .else if (Espressione_Booleana_ n) Blocco_nelse Blocco_Default
20
Esempioif (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’;
21
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}
22
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
23
Diagramma di flusso
Espressione_Di_Controllo = Etichetta_Caso_1true
Sequenza_Istruzioni_1
break?
true
break?
Espressione_Di_Controllo = Etichetta_Caso_2
false
Sequenza_Istruzioni_2
false
false
...
true
true
false
...
false
true
Sequenza_Istruzioni_Defaultdefault?
24
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’;}
25
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
26
Esempio max = (n1>n2)?n1:n2;
Equivale a:
if (n1>n2)max = n1;
elsemax = n2;
27
Ripetizione: i cicli Struttura:
corpo del ciclo condizione di terminazione del ciclo
Organizzazione logica cicli controllati da condizioni cicli controllati da contatori
Istruzioni Java per realizzare cicli while do-while for
28
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
29
trueBlocco
Diagramma di flusso
Espressione_Booleana
false
Prossima_Istruzione
30
Esempio Ciclo che calcola la somma dei primi 10 numeri interi
int total = 0;int count = 1;while (count <= 10){ total = total + count; count++;}
31
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;
}
32
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
33
Diagramma di flusso
Espressione_Booleana
false
Prossima_Istruzione
Blocco
true
34
Esempio
int next;
int total = 0;
do
{
next = (int)(Math.random()*100)-50;
total = total + next;
}
while (next >= 0);
35
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;}
36
Ciclo for Struttura:
azione di inizializzazione condizione di ripetizione corpo del ciclo azione di continuazione
Sintassi:for (Inizializzazione; Espressione_Booleana; Continuazione) Blocco Prossima_Istruzione
37
Diagramma di flusso
Inizializzazione
Continuazione
Bloccotrue
Espressione_Booleana
false
Prossima_Istruzione
38
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;
}
39
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)
40
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
41
Istruzione if:if (Espressione_Booleana)Blocco
Istruzione if-else:if (Espressione_Booleana)Blocco elseBlocco
42
Istruzione switch:switch (Espressione_Di_Controllo){
case Etichetta_1:Sequenza_Istruzioni_1
case Etichetta_2: Sequenza_Istruzioni_2
...case Etichetta_n:
Sequenza_Istruzioni_ndefault:
Sequenza_Istruzioni_Default}
43
Istruzione while:while (Espressione_Booleana)Blocco
Istruzione do-while:do Blocco while (Espressione_Booleana);
Istruzione for:for (Inizializzazione ; EB; Continuazione)
Blocco