Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria...

30
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dell’Informazione Università di Siena Via Roma 56 – 53100 – SIENA Uff. 0577233606 [email protected] www.dii.unisi.it/ ~ rigutini /

Transcript of Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria...

Page 1: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Tipi di dato e

controllo del flusso

Dott. Ing. Leonardo RigutiniDipartimento Ingegneria dell’InformazioneUniversità di SienaVia Roma 56 – 53100 – SIENAUff. [email protected]/~rigutini/

Page 2: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Tipi di dato

Page 3: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Tipi di dato semplici (primitivi)

Il JAVA fornisce tutti i tipi di dato semplici. Per ognuno di essi inoltre la Sun ha sviluppato una “versione” ad oggetti: i wrapper

Per i tipi di dato primitivi il JAVA non utilizza la memorizzazione per riferimento, bensì per valore: Questo significa che tutte le operazioni di assegnamento, passaggio

di parametri ecc… creano una variabile distinta

Page 4: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Tipi di dato semplici

Tipo Dimensione Min Max Wrapper

boolean 1 bit - - Boolean

char 16 bit 0 216-1 Charbyte 8 bit -128 +127 Byteshort 16 bit -215 +215-1 Short

int 32 bit -231 +231-1 Integerlong 64 bit -263 +263-1 Longfloat 32 bit IEEE 754 Floatdouble 64 bit IEEE 754 Double

void - - - Void

Page 5: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Tipi di dato numerici

Quando utilizziamo un tipo di dato semplice numerico è importante ricordarsi del range limitato di numeri rappresentabile in hardware

Piccoli errori di arrotondamento possono portare ad un risultato scorretto anche di quantità significative a seguito di numerose operazioni aritmetiche

Il caso più eclatante fu l’errore scoperto sul processore Pentium nel 1994 pochi mesi dopo la sua uscita

Page 6: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Operatori

Page 7: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Assegnamento

L’assegnamento permette di definire il valore memorizzato in una variabile: il valore assegnato deve essere compatibile col tipo della variabile,

altrimenti si genera un errore

int a, b;float v1, v2;char c = ‘M’;

a = 4; b = a; v1 = 3.2 v2 = a;

b = v1;

b assume il valore di a (cioè 4)

ammesso: v2 assume il valore di a (4) convertito in float

variabile espressione

non ammesso

Page 8: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Cast

cast (forzatura) indica l’operazione di forzare la trasformazione di un tipo di dato ad un altro: La sintassi consiste nell’inserire il nome_tipo tra parentesi, prima della

variabile o della espressione che vuole essere castata int a=(int) (3,14*4); a contiene 12 invece che 12.56 !!! double A=3,14; int f=(int) A; f contiene il valore 3 !!!

Il cast può essere esplicito o implicito: cast esplicito - l’utente specifica il tipo di dato finale in cui desidera

lavorare (tra parentesi tonde) cast implicito - il compilatore automaticamente decide il tipo di dato finale

in base al tipo di dato della variabile in cui il valore va ad essere memorizzato. Le conversioni ammesse implicitamente sono:

byte short int long float double

Page 9: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Operatori

Operatori unari: permettono di effettuare operazioni di inversione di segno e autoincremento

positivo +, negativo – pre-incremento ++a, pre-decremento --a post-incremento a++, post-decremento a--

class Prova { public static void main(String[] args) { int A = 10; System.out.println(A); // Stampa 10 System.out.println(A++); // Stampa 10 System.out.println(++A); // Stampa 12 }}

Page 10: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Operatori

Operatori aritmetici: moltiplicazione *, divisione / modulo % addizione +, sottrazione –

Operatori relazionali: permettono di costruire espressioni logiche uguale == , diverso != maggiore > , maggiore e uguale >= minore < , minore e uguale <=

(c != 23) è true se c è diverso da 23(b == ‘s’) è true se b è il carattere ‘s’

Page 11: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Operatori

Operatori booleani

Permettono di costruire espressioni logiche: And && Or || Not !

Non vengono mai valutate tutte i termini della condizione, ma solo fino a quando il risultato è univocamente determinato:

v1 && v2 && v3 && v4 v4 non viene valutata

( !((c == 23) || (c ==24)) ) c non è uguale a 23 nè a 24( (b == ‘s’) || (b ==‘S’) ) è true se b è il carattere ‘s’ o ‘S’( !((a >= 0) && (a < 0.5)) ) è false se a è compreso tra 0 (compreso) e

0.5 (escluso)

T T F T

Page 12: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Operatori

Operatori bit-a-bit And & Or | Xor ^ Not ~

class ProvaXor { public static void main(String[] args) { boolean A = 0x80; // (1000 0000)2

boolean B = 0xAB; // (1010 1011)2

System.out.println(A ^ B); // Stampa 0x2B (0010 1011)2

}}

Page 13: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Operatori

Operatori di shiftPermettono di traslare a destra o a sinistra sequenze di bit:

shift a destra >> shift a sinistra <<

1001001011101101 >> 2 00100100101110111001001011101101 << 3 0010010111011000

Page 14: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Varianti di operatori

Per quasi tutti gli operatori è possibile sostituire una espressione del tipo

variabile = variabile <operatore> valore

con una forma abbreviata:

variabile <_varoperatore>= valore

double A = 0.0D;

// Invece di scrivere A = A + 2D// abbiamo scritto A += 2.0DSystem.out.println(A += 2.0D); // Stampa 2.0

System.out.println(A /= 2.0D); // Stampa 1.0

Page 15: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Confronto di oggetti

Quando utilizziamo l’operatore == per confrontare due oggetti, in realtà confrontiamo l’indirizzo memorizzato nelle due variabili: Tale confronto quindi ritorna true nel caso che entrambe le variabili

si riferiscano allo stesso oggetto

Quindi in questo caso l’uguaglianza non si riferisce al contenuto della variabile ma controlla se le due variabili indicano lo stesso oggetto

Normalmente ogni oggetto mette a disposizione un metodo per controllare l’uguaglianza tra due oggetti: String.equals() ecc…

Page 16: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Confronto di oggetti

Solamente per i tipi di dato primitivi il confronto si comporta effettivamente come un operatore matematico di uguaglianza: Es. due variabili intere diverse che contengono lo stesso valore

sono considerate uguali

Un riferimento ad oggetto può avere valore null

Tale valore può essere utilizzato per verificare su un oggetto è stato inizializzato tramite confronto:

Rectangle R;

if (R==null) … // l’oggetto R non è stato inizializzato

Page 17: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Array

Page 18: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Array Un array è un handle ad un vettore (o una matrice) di elementi che

possono essere di tipo primitivo oppure oggetti:

Se vogliamo allocare memoria:

int[] A1;int A2[];

int[] B = {1, 2, 3, 4, 5, 6};

in entrambi i casi viene generato un handle adun vettore

in questo caso viene ancheallocata la zona di memorianecessaria a contenere glielementi indicati

int[] A1;int A2[];int[] B = {1, 2, 3, 4, 5, 6};

A1 = new int[6];A2 = A1;

A1.length indica quantielementi sono stati allocati

Page 19: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Array di oggetti È anche possibile creare un array di oggetti, cioè un vettore di

handle tutti inizializzati a null

E anche possibile inizializzare direttamente un vettore di oggetti:

ma è poco utile

Segmento[] Spezzata;Spezzata = new Segmento[6];

for ( int i = 0; i < Spezzata.length; i++) { Spezzata[i] = new Segmento();}

NULL

NULL

NULL

NULL

NULL

NULL

3:

4:

5:

2:

1:

0:

Segmento[] Spezzata = { new Segmento();new Segmento();new Segmento();

};

Page 20: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Array multidimensionali Il JAVA non pone limiti al numero di dimensioni degli array

int[][] A = { {1, 2, 3, 4, 5 }, {6, 7, 8, 9, 10} };

int[][] B = new int[5][2];

↑↑

↑109876

54321

A[0][3]

A[i].length

A.length

int[][][] A = new [2][2][3];

for (int x = 0; x < A.length; x++) for (int y = 0; y < A[x].length; y++) for (int z = 0; z < A[x][y].length; z++) A[x][y][z] = 1;

Page 21: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Controllo del flusso

Page 22: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

if … else …

cond

blocco 1 blocco 2

false

true

if (boolean-cond) { blocco 1}else { blocco 2}

if (vendite > media) { bonus = 0.1; guadagno = quota * bonus;}else { guadagno = 0;}

Page 23: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Operatore ?

Il costrutto if … else … può essere condensato in una istruzione singola utilizzando l’operatore ?

condizione ? valore1 : valore2

y = x>=0 ? x : -x ;

if (x >=0) y=x;else y=-x;

y = if (x>=0) x; else -x;

errore

Page 24: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

if … else if … else …

cond1

blocco 1

blocco 3

false

true

cond2

blocco 2

true

false

if (cond1) { blocco 1}else { if (cond2) { blocco 2; } else { blocco3; }}

if (cond1) { blocco 1}else if (cond2) { blocco 2;}else { blocco3;}

Page 25: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

switch … case …

char C = ‘n’;switch (C) { case ‘n’: System.out.println(“Sconto”); break; case ‘s’: System.out.println(“Sconto no”); break; default: System.out.println(“Boh!”);}

switch (variabile) { case Valore1: blocco1 break; case Valore2: { blocco2;

break; } default: blocco default;}

Page 26: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

while ()

cond

blocco

false

true

while (boolean-cond) { blocco}

while (true) { System.out.println(“Infinito”);}

Ciclo infinito:

Page 27: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

do … while()

La condizione viene valutata dopo aver eseguito il blocco almeno una volta

do { blocco} while (boolean-cond)

cond

blocco

false

true

Page 28: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

Cicli determinati: for

Ciclo di 5 iterazioni:

Ciclo infinito:

cond

blocco

false

true

inizializzazione

incremento

for (inizializzazione; boolean-cond; incremento) { blocco}

for (int i = 0; i < 5; i++) { System.out.println(i);}

for (;;) { System.out.println(“Infinito”);}

Page 29: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

for multivariabile

È possibile specificare nel ciclo for condizioni per più variabili.

L’esecuzione dei due cicli avviene eseguendo prima il più interno e poi avanzando quello superiore:

for (int i = 0, j = 5; i < 5; i++, j--) { System.out.println(i); System.out.println(j);}

Page 30: Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA.

break e continue

Queste istruzioni modificano l’esecuzione del ciclo: break interrompe l’attuale istruzione di iterazione while, do while, for ...

ed esce definitivamente dalla iterazione continue interrompe la corrente iterazione e ritorna all’inizio del ciclo,

iniziandone un’altra

for (int i = 0, j = 10; i < 15; i++, j--) { System.out.println(i); if (i % 2 == 0) continue; if (j < 0) break; System.out.println(j);}