Il cast
Cast implicito Il cast è fatto automaticamente quando un tipo più basso viene assegnato ad un tipo più alto Per esempio: byte short int long float double int x = 10; float f; f = x; Il valore di x viene convertito in un float e quindi assegnato a f
Cast esplicito È necessario quando si assegna un valore di un tipo più alto ad una variabile dichiarata di tipo più basso Sintassi: (tipo)nomevariabile Per esempio: int n; double d = 3.6; n = (int)d; Il valore di d viene convertito in un int e quindi assegnato a n Il cast effettua un troncamento!!!
Espressioni booleane Controllo del flusso: selezione
Agenda Espressioni booleane Il tipo boolean Operatori condizionali Operatori relazionali Controllo del flusso Selezione istruzioni condizionali
Espressioni booleane
Il tipo boolean Il tipo boolean è un tipo primitivo Può assumere esclusivamente due valori: true o false boolean b; b = true; System.out.println(b); b = false; System.out.println(b);
Espressioni booleane Una espressione booleana è un espressione che può essere o vera o falsa Esempi di espressioni booleane sono: valore > 0 valore1!= valore2 valore1 == valore3 In Java, un espressione è booleana se restituisce o true o false vuol dire che si può assegnare il risultato della valutazione dell espressione ad una variabile dichiarata di tipo boolean Come le espressioni aritmetiche sono costruite utilizzando operatori specifici (operatori aritmetici), anche le espressioni booleane si costruiscono a partire da particolari operatori chiamati operatori relazionali e condizionali
Operatori relazionali Confrontano 2 valori numerici e determinano la relazione restituendo un valore boolean Operatore Descrizione Uso Descrizione Restituisce true se = = Uguale a op1 = = op2 op1 e op2 sono uguali!= Diverso da op1!= op2 op1 e op2 sono diversi < Minore di op1 < op2 op1 è minore di op2 > Maggiore di op1 > op2 op1 è maggiore di op2 <= Minore o uguale di op1 <= op2 op1 è minore o uguale di op2 >= Maggiore o uguale di op1 >= op2 op1 è maggiore o uguale di op2
Esempi int x = 3; int y = 4; boolean b; b = x<=y; System.out.println(b); int x = 3; int y = 4; boolean b; b = x==y; System.out.println(b); int x = 3; int y = 4; boolean b; b = x!=y; System.out.println(b); true false true
Costruzioni più complesse Se si vogliono costruire espressioni booleane più complesse, si ricorre all uso degli operatori condizionali Ne esistono di due tipi: binari e unari un operatore condizionale binario permette di combinare due espressioni booleane per ottenere ancora un valore booleano Le combinazioni possono essere di due tipi: and logico: expbool1 & expbool2» restituisce true se entrambe le espressioni booleane sono true or logico: expbool1 expbool2» restituisce true se almeno una delle due espressioni è true l unico operatore condizionale unario (il carattere!), nega l espressione booleana successiva not:!expbool» restituisce true se expbool è false
Esempio Data divisore una variabile intera, si vuole determinare se è vero che: il divisore sia diverso da zero e contemporaneamente il divisore sia maggiore di 3 relazionale condizionale relazionale (divisore!= 0) & (divisore > 3)
Operatori condizionali: tabelle di verità binari ris. true false false false ris. true true true false ex1 true true false false ex1 true true false false & & & & ex2 true false true false ex2 true false true false And logico restituisce true se tutte le espressioni sono true Or logico restituisce true se almeno una espressione è true unari ris. false true ex1! true! false Negazione nega il valore dell espressione
Operatori condizionali Gli operatori binari confrontano 2 valori boolean e restituiscono un valore boolean, quello unario nega un valore boolean Operatore Significato Uso Descrizione Restituisce true se & AND Restituisce true se entrambi veri OR Restituisce true se almeno uno è vero! NOT Restituisce true se l operando è false, false in caso contrario && AND (calcolo abbreviato) Restituisce true se entrambi veri OR (calcolo abbreviato) Restituisce true se almeno uno è vero op1 & op2 op1 op2!op1 op1 && op2 op1 op2 op1 e op2 sono entrambi true almeno op1 o op2 true op1 è false op1 e op2 sono entrambi true almeno op1 o op2 true
Differenza tra && e & e tra e Se una valutazione fallisce, utilizzando la forma abbreviata, le successive valutazioni non vengono eseguite Esempio: int x = 3; int y = 0;? boolean b = (y!= 0) && (x/y > 0) non viene valutata false Attenzione però all ordine: non è detto che un espressione venga effettivamente valutata nell ordine in cui è stata codificata quindi per istruzioni che possono generare errori run-time occorre prestare attenzione
Precedenze fra operatori (1/2) Massima precedenza () ++ -- (raggruppamento espr.) (incr. pre) (decr. pre) ++ --! (incremento post) (decremento post) (negazione) * / % (moltiplicazione) (divisione) (modulo) + - (somma) (sottrazione) < > <= >= (minore) (maggiore) (minore o uguale) (maggiore o uguale) Minima precedenza ==!= (uguaglianza) (disuguaglianza)
Precedenze fra operatori (2/2) Massima precedenza Minima precedenza & (AND) (OR) && (AND logico) (OR logico) = += -= *= /= %= (assegnamenti)
Il controllo del flusso: la selezione
Il controllo del flusso Il flow of control è l esecuzione ordinata di una sequenza di istruzioni Tutti i programmi possono essere scritti usando i seguenti elementi di controllo del flusso: sequenza esegue le istruzioni una alla volta nell ordine in cui sono state scritte selezione permette di scegliere tra almeno due possibilità iterazione esegue ripetutamente un blocco di istruzioni fino al verificarsi di una condizione eccezione try, catch, finally miscellanea break, continue, label, return
Selezione Quando più strade sono percorribili, occorre eseguire un test per verificare quale sia quella corretta Generalmente: se true fai qualcosa, se false fai qualcos altro Il test è quindi realizzato tramite una espressione booleana (che restituisce un valore di tipo boolean) Costrutti: if (istruzione condizionale ad una via) if-else (istruzione condizionale a due vie) switch condizione? istruzione1 : istruzione2;
Istruzione condizionale ad una via Permette di decidere se eseguire una istruzione oppure saltarla if (espressionebooleana) istruzione1; istruzione; viene eseguita se espressionebooleana è true viene eseguita in ogni caso Esecuzione: Si valuta l espressione booleana. Se il valore dell espressione booleana è true, si esegue istruzione1 e poi il controllo diventa sequenziale, quindi viene eseguita istruzione false: non viene eseguita istruzione1 e quindi viene eseguita istruzione
if: esempio public class ProvaStampa { public static void main(string a[]) { int x = 5; if (x<=10) x++; System.out.println( x vale: + x); } }
Selezione a due vie Permette di decidere di eseguire una istruzione piuttosto che un altra if (espressionebooleana) istruzione1; else istruzione2; istruzione; viene eseguita se espressionebooleana è true viene eseguita se espressionebooleana è false Esecuzione: Si valuta l espressione booleana. Se il valore dell espressione booleana è true, si esegue istruzione1, quindi viene eseguita istruzione false: non viene eseguita istruzione1, ma istruzione2, quindi viene eseguita istruzione
if-else: esempio public class ProvaStampa { public static void main(string a[]) { short v1 = 5, v2 = 3, min; if (v1 < v2) min = v1; else min = v2; System.out.print( Minore: +min); } }
Istruzioni condizionali annidate... o in cascata, o innestate Si utilizzano quando le alternative di un istruzione condizionale siano istruzioni condizionali a loro volta istruzione1 istruzione2 istruzione3 if(expbooleana1) if(expbooleana2) if(expbooleana3)... else istruzione3e else istruzione2e else istruzione1e istruzione1e istruzione2e istruzione3e if(expbooleana1) istruzione1; else if(expbooleana2) istruzione2; else if(expbooleana3) istruzione3 else...
Esempio istruzione1 if(10>(2-5)*2) if(3==4%2) System.out.println( uno ); else System.out.println( due ); else System.out.println( tre );? due
if-else: esempio 2 public class ProvaStampa { public static void main(string a[]) { int num = 2; String mese; if (num == 1) mese = Gennaio ; else if (num == 2) mese = Febbraio ; System.out.print( Mese: +mese); } }
Ambiguità Cosa succede quando si innesta un condizionale ad una via dentro ad un condizionale a due vie? if(10<(x+5)*2) if(1==x%2) System.out.println( uno ); else System.out.println( tre ); System.out.println( out ); if(10<(x+5)*2) if(1==x%2) System.out.println( uno ); else System.out.println( tre ); System.out.println( out );? Una clausola else si riferisce sempre all ultimo if senza clausola else out
Eseguire più istruzioni Cosa succede se si esegue il seguente frammento di codice? int x = 4; int y = 9; if(x!= y) x = y; System.out.println( Ora x e y sono uguali ); else System.out.println( x e y sono già uguali ); Errore in compilazione: else without if Soluzione: uso i blocchi
Blocchi Un blocco di istruzioni è un insieme di istruzioni racchiuse tra graffe Un blocco di istruzioni è considerato come una singola istruzione! istruzione { } istruzione1; istruzione2; istruzione3; istruzionen;
quindi int x = 4; int y = 9; if(x!= y){ x = y; System.out.println( Ora x e y sono uguali ); } else System.out.println( x e y sono già uguali );
E così? int x = 4; int y = 9; if(x!= y){ x = y; System.out.println( Ora x e y sono uguali ); } else x++; System.out.println( Ora x e y sono diversi );? Ora x e y sono uguali Ora x e y sono diversi
Soluzione int x = 4; int y = 9; if(x!= y){ x = y; System.out.println( Ora x e y sono uguali ); } else { x++; System.out.println( Ora x e y sono diversi ); }
Sintassi finale if (espressionebooleana){ istruzione1; istruzione2; } else{ istruzione1; istruzione2;... } prossimaistruzione; vengono eseguite se espressionebooleana è true vengono eseguite se espressionebooleana è false viene eseguita in ogni caso
Esempio 1 public class ProvaStampa { public static void main(string a[]) { int x = 5; if ((x<=10) && (x>0)) { System.out.println( if ); x++; } System.out.println( x vale: +x); } }
Esempio 2 public class ProvaStampa { public static void main(string a[]) { int x = 11; boolean min; if ((x<=10) && (x>0)) { min = true; x++; } else { min = false; } System.out.println( x vale: +x); } }
Esercizi Provate ad implementare il massimo tra tre numeri