Fondamenti di Informatica 1 Prof. B.Buttarazzi A.A. 2010/2011 Sommario • • • • Conversione di tipo:casting Tipo enumerativo Algebra Booleana Esercizi Conversione di tipo:casting • Il casting o conversione di tipo avviene quando trasformiamo un valore di un tipo primitivo in un altro Esempio: quando assegniamo ad una variabile double o float un valore intero (il valore intero viene convertito in double o float automaticamente ... double a = 4; // 4 è una costante intera System.out.println(a); // Stampa 4.0 4.0 è la rappresentazione di una costante a virgola mobile (c‟è il punto decimale) Il compilatore esegue alcune conversioni di tipo implicitamente 3 Conversione di tipo:casting La conversione di un dato da un tipo origine a uno appartenente ad un insieme più ampio non necessita di alcuna trasformazione in quanto questa avviene automaticamente senza errori. Non ci sono problemi se, ad esempio, si assegna un dato int ad un long o ad un double. La tabella precedente mostra alcune operazioni di type cast possibili 4 Casting esplicito • • • Se vogliamo memorizzare il valore di una variabile float su una di tipo int dobbiamo forzare con il cast esplicito ( explicit cast ), quindi dobbiamo scrivere: In questo caso il programmatore forza la conversione che potrebbe risultare pericolosa in termini di perdita di dati. … float k = 4.3; int b = (int)k; … Casting • Il casting è possibile anche tra due oggetti a patto che appartengano a classi in relazione di ereditarietà. • In particolare si può effettuare il casting plicito di un oggetto di una sottoclasse in modo da ottenere un nuovo oggetto della superclasse. • Da notare che non si possono effettuare conversioni da oggetti a tipi primitivi e viceversa. Tipo enumerativo: enum • • • Java permette di definire nuovi tipi semplicemente elencando tutti i valori del dominio corrispondente Questi tipi detti tipi enumerativi, possono essere dichiarati con la parola chiave enum e poi usati per dichiarare variabili di quel tipo. Una variabile di tipo enumerativo potrà assumere soltanto quei valori elencati nel definire il tipo enumerativo. Esempi di dichiarazioni di nuovi tipi enum enum Seme { CUORI, QUADRI, FIORI, PICCHE }; enum Giorno { LUNEDI, MARTEDI, MERCOLEDI, GIOVEDI, VENERDI, SABATO, DOMENICA }; enum Mese { GENNAIO, FEBBRAIO, MARZO, APRILE, MAGGIO, GIUGNO, LUGLIO, AGOSTO, SETTEMBRE, OTTOBRE, NOVEMBRE, DICEMBRE }; Esempio di uso del tipo enum package provabb; enum Seme { CUORI, QUADRI, FIORI, PICCHE } public class provabb1 { public static void main(String[] args) { Seme miaCarta,tuaCarta,suaCarta; miaCarta=Seme.CUORI; tuaCarta=Seme.FIORI; suaCarta=Seme.CUORI; System.out.println(miaCarta==tuaCarta); // false System.out.println(miaCarta.equals(tuaCarta)); // false System.out.println(miaCarta==suaCarta); // true System.out.println(miaCarta.equals(suaCarta)); // true System.out.println(miaCarta==Seme.CUORI); // true System.out.println(miaCarta.equals(Seme.CUORI)); // true } } altre soluzioni…per enum package provabb; public class provabb1 { public static void main(String[] args) { final String[] semi={"Cuori","Quadri","Fiori","Picche"}; private final char[] valori={„A‟,‟2‟,‟3‟,‟4‟,‟5‟,‟6‟,‟7‟,‟8‟,‟9‟,‟10‟,‟J‟,‟Q‟,‟K‟}; ….. } } Algebra di Boole É un‟algebra basata su tre operazioni logiche OR (somma) AND (moltiplicazione) NOT (negazione) ed operandi che possono avere due soli valori: Vero (1) (true) Falso(0) (false). Tramite questa algebra di possono comporre espressioni logiche che possono essere vere o false. Ad esempio: (X AND Y)OR Z oppure (NOT A)OR B 11 Le operazioni booleane Negazione simboli che rappresentano la negazione logica (NOT) (sopralineatura) In Java la negazione logica è rappresentata dall’operatore “!” Tavola di verità Tavola di verità Variabile A Risultato !A Variabile A Risultato 0 1 0 1 1 0 1 0 A 12 • Proprietà della Negazione – eliminazione della doppia negazione: A !! A A A 13 Prodotto (Congiunzione) logico . simboli che rappresentano il prodotto logico (AND) ( ) In Java il prodotto logico è rappresentato dall’operatore “&” A Tavola di verità Variabile B Variabile C Risultato A 0 0 0 0 1 0 1 0 0 1 1 1 B &C 14 • Proprietà del Prodotto logico (AND) (.)(&) – idempotenza A·A=A – commutativa A·B=B·A – associativa A · (B · C) = (A · B) · C – elemento neutro 1·A =A – elemento assorbente 0·A = 0 – 1 = true 0= false 15 Somma Logica (Disgiunzione) (OR) + simboli che rappresentano la somma logica (OR) ( ) In Java la somma logica è rappresentata dall’operatore “|” A Tavola di verità Variabile B Variabile C Risultato A 0 0 0 0 1 1 1 0 1 1 1 1 B C 16 • Proprietà della Somma logica (OR) (+) (|) – idempotenza A+A=A – commutativa A+B=B+A – associativa A + (B + C) = (A + B) + C – elemento neutro 0+A =A – elemento assorbente 1+A = 1 17 Le altre proprietà A B A B A B distributività di AND rispetto a OR: A·(B + C)= (A·B) + (A·C) distributività di OR rispetto a AND: A+(B·C)= (A+B)· (A+C) AND di complementi: OR di complementi: La Legge di De Morgan per trasformare AND in OR: La Legge di De Morgan per trasformare OR in AND: A A 0 A A 1 A B A B A B A B 18 Espressioni logiche Sono espressioni contenenti solo: • – variabili booleane • – le costanti logiche (0 e 1 oppure false e true) • – gli operatori logici AND OR NOT oppure & | ! Esercizio Semplificare la seguente espressione logica: 19 Per semplificare le espressioni si usano le proprietà e i teoremi dell‟algebra Booleana: • D | !( !A | B & !A | A ) | E • D | !( !A | B & !A | A ) | E • D | !( true | B & !A ) | E • D | !( true ) | E • D | false | E • D|E Per verificare il risultato si può analizzare la tabella di verità 20 D | !( !A | B & !A | A ) | E 21 Esercizio Verificare il codice del seguente metodo di classe (statico) evidenziando eventuali errori e generare la versione corretta static float fatt(double[] x) { int i,z=0; for(i=1; i<=x.length; i=i+1) { int y=x[i]; z=z+y; } return z; } Verificare il codice del seguente metodo statico evidenziando eventuali errori static float fatt(double[] x) { int i,z=0; for(i=1; i<=x.length; i=i+1) { int y= x[i]; z=z+y; } return z; } Verificare il codice del seguente metodo statico evidenziando eventuali errori static float fatt(double[] x) { int i,z=0; for(i=0; i<x.length; i=i+1) { int y=(int)x[i]; z=z+y; } return z; } Esercizio Esercizio Individuare quali numeri vengono stampati. Esercizi da svolgere