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