13/08/02Tipi base 1 Tipi interi Operatori numerici Tipi float Caratteri Tipo booleano
13/08/02 Tipi base2 Tipo intero La parola chiave int definisce una variabile di tipo intero Un int permette di memorizzare un intero di 4 byte (32 bit) con la tecnica del complemento a 2 Costanti di tipo intero sono sequenze di caratteri numerici senza il punto decimale Se la prima cifra è 0 il numero è interpretato come scritto secondo la notazione ottale Se la prima cifra è 0 seguito da x (X) il numero è considerato esadecimale 127 può perciò anche essere scritto sia come 0177 che 0x7f
13/08/02 Tipi base3 Tipo intero: operatori Espressioni di tipo intero utilizzano: operatori unari +, - operatori di tipo aritmetico +, -, *, /, % (resto della divisione) 28 / 5 --> 5 28 % 5 --> 3
13/08/02 Tipi base4 Programma PortaMonete.java 1.public class PortaMonete { 2. public static void main(String[] args) { // il portamonete contiene 3. int unCent = 8; // 8 monete da 1 cent, int dieciCent = 4; // quattro da 10 cent, 4. int ventiCent = 3; // e tre da // calcola il valore totale della moneta 7. int totale = unCent*1 + dieciCent*10 + ventiCent*20; // stampa il risultato 10. System.out.print(“Valore totale = ”); 11. System.out.print(totale); 12. System.out.println(“ centesimi”); 13. } 14.} Valore totale = 108 centesimi Ho definito 4 variabili di tipo int
13/08/02 Tipi base5 Programma PortaMonete.java E:\Java\esempi> java PortaMonete Valore totale = 108 centesimi E:\Java\esempi>
13/08/02 Tipi base6 Programma Monete2.java 1.public class Monete2 { 2. public static void main(String[] args) { 3. int unCent = 8; // 8 monete da 1 cent, 4. int dieciCent = 4; // 4 da 10 cent, int totale = unCent * 1 + dieciCent * 10; int ventiCent = 3; // e 3 da 20 cent // somma il valore dei venti cent 11. totale = totale + ventiCent * 20; // stampa il risultato 14. System.out.print(“Valore totale = ”); 15. System.out.print(totale); 16. System.out.println(“ centesimi”); 17. } 18.} Valore totale = 108 centesimi
13/08/02 Tipi base7 Assegnazione 3 48 ventiCent totale totale + ventiCent * ventiCent totale 108 Il nuovo valore ha sostituito irreversibilmente quello vecchio 11. totale = totale + ventiCent * 20;
13/08/02 Tipi base8 Il concetto di memoria Variabili Ogni variabile ha un nome, un tipo, una dimensione e un valore Il nome corrisponde a un indirizzo di memoria Quando un nuovo valore è posto in una variabile, sostituisce (e quindi distrugge) il contenuto precedente Leggere variabili dalla memoria non altera il loro valore 3 ventiCent 108 totale Nome: “ totale ” Tipo: int Dimensione: 4 byte 108 è il valore memorizzato nella cella
13/08/02 Tipi base9 Tipo intero: operatori operatori bit a bit & (and) 0xe & 0x3 0x2 | (or) 0xe | 0x3 0xf ^ (exor) 0xe ^ 0x3 0xd ~ (not) (scambia gli 1 con gli 0) >>, >> (shift) 0xe << 4 0xe0 0xe >> 2 0x3 (implementano in modo efficiente moltiplicazioni e divisioni per potenze di 2) >> conserva il bit di segno >>> inserisce sempre uno zero come bit più significativo
13/08/02 Tipi base10 Test Operatori public class TestOperatori { public static void main(String[] args) { 4. System.out.println(0xe & 0x3); 5. System.out.println(0xe | 0x3); 6. System.out.println(0xe ^ 0x3); 7. System.out.println(~ -2 ); 8. System.out.println(-1 << 2); 9. System.out.println(-4 >> 2); 10. System.out.println(-4 >>> 2); 11. System.out.println(-1 >> 1); 12. System.out.println(-1 >>> 1); 13. } }
13/08/02 Tipi base11 Operatori di incremento ++, -- incrementano o decrementano di 1 l'operando se l'operatore precede l'operando il risultato dell'espressione è quello ottenuto dopo l'applicazione dell'operatore stesso esempio: a = 4; b = ++a; // sia ad a che a b è assegnato il valore 5 a = 4; b = a++; // ad a è assegnato ancora 5, mentre a b il valore 4 a = 4; b = --a; // (a memorizza 3, b 3) a = 4; b = a--; // (a memorizza 3, b 4) ++ e -- sono applicabili solo a variabili non espressioni es. ++4 non è corretto
13/08/02 Tipi base12 Operatori: priorità Esiste una priorità fra gli operatori che corrisponde in genere alle normali regole dell’algebra: prima moltiplicazioni e divisioni (e modulo), poi somme e sottrazioni A parità di priorità le operazioni vengono solitamente eseguite da sinistra a destra, esiste comunque la possibilità di utilizzare le parentesi tonde per forzare un ordine particolare nell’ordine di esecuzione In caso di dubbi usate sempre le parentesi, in genere i programmi diventano anche più leggibili In generale la leggibilità aumenta spezzando espressioni complesse in più istruzioni semplici
13/08/02 Tipi base13 Altri tipi interi byte intero di 8 bit short intero di 16 bit long intero di 64 bit costanti di tipo long hanno come ultimo carattere L (l) TipoMemoriaValore minimoValore Massimo byte 8 bit short 16 bit int 32 bit long 64 bitminore di maggiore di 10 18
13/08/02 Tipi base14 Programma Monete3.java 1.public class Monete3 { 2. public static void main(String[] args) { 3. final int VAL_CENT = 1; 4. final int VAL_10CENT = 10; 5. final int VAL_20CENT = 20; 6. final int VAL_EURO = 100; int unCent = 8; 9. int dieciCent = 4; 10. int ventiCent = 7; // calcola il valore totale della moneta 13. int totale = 14. unCent * VAL_CENT dieciCent * VAL_ 10CENT ventiCent * VAL_20CENT; 17.
13/08/02 Tipi base15 Programma Monete3.java 18. // usa la divisione fra integer per convertire 19. // i centesimi in dollari int euro = totale / VAL_EURO; 22. int cent = totale % VAL_EURO; 23. System.out.print("Valore totale = "); 24. System.out.print(euro); 25. System.out.print(" euro e "); 26. System.out.print(cent); 27. System.out.println(" centesimi"); 28. } 29.} Valore totale = 1 euro e 88 centesimi
13/08/02 Tipi base16 Tipi floating point float precisione semplice (4 byte), double precisione doppia (8 byte) Costanti double e-5 sono caratterizzate o dal punto decimale o dall'esponente float 133.3f 78e-5F sono caratterizzate dal suffisso f(F) TipoMemoriaEsponenteValore Massimo double 64 bit10 bitmaggiore di float 32 bit8 bitmaggiore di 10 38
13/08/02 Tipi base17 Tipi floating point : operatori Sono gli stessi operatori visti per i tipi interi Non sono definiti gli operatori relativi alla gestione dei bit La divisione ovviamente produce decimali 28.0 / > 5.6 Esiste l’operatore % definito come a%b = a – ( (int)(a/b) ) * b 28.0 / > 2.5
13/08/02 Tipi base18 Funzioni matematiche La classe Math mette a disposizione una serie di metodi statici che implementano le più note funzioni matematiche Attenzione ogni volta che si utilizza uno di questi metodi occorre sempre specificare anche il nome della classe Esempio: Math.sin(Math.toRadians(45))
13/08/02 Tipi base19 Funzioni matematiche Il tipo restituito dipende dagli argomenti abs(x) Restituisce il valore assoluto max(a, b) Restituisce il maggiore dei due valori min(a, b) Restituisce il minore dei due valori Il tipo restituito è un double (escluso round che restituisce un long ) ceil(x) Restituisce l’intero più piccolo maggiore o uguale all'argomento floor(x) Restituisce l’intero più grande minore o uguale all'argomento rint(x) Restituisce l’intero più vicino a x round(x) Restituisce l’intero più vicino a x sqrt(x) Restituisce la radice quadrata pow(a, b) Operazione di elevamento a potenza a b exp(x) Funzione esponenziale ((Math.E) x ) log(x) Restituisce il logaritmo naturale (in base e) random() Restituisce un numero "a caso" compreso fra 0.0 e 1.0 escluso
13/08/02 Tipi base20 Funzioni trigonometriche sin(x) Restituisce il seno dell'angolo cos(x) Restituisce il coseno dell'angolo tan(x) Restituisce la tangente dell'angolo acos(x) Funzione inversa di cos asin(x) Funzione inversa di sin atan(x) Funzione inversa di tan atan2(y, x) Restituisce la componente del punto (r, ) in coordinate polari che corrisponde a (x, y) in coordinate Cartesiane per x positivo atan2(y,x)==atan(y/x) Per riferirsi a si può utilizzare la costante Math.PI
13/08/02 Tipi base21 Funzioni trigonometriche Versioni recenti di Java hanno implementati anche i metodi: toDegrees(angrad) Converte da radianti a gradi toRadians(angdeg) Converte da gradi a radianti In alternativa si può ottenere lo stesso risultato con il codice: degrees = angrad / Math.PI * angrad = degrees / * Math.PI
13/08/02 Tipi base22 FunzioniTrigonometriche.java 1.public class FunzioniTrigonometriche { 2. public static void main(String[] args) { 3. int ang=45; 4. double seno=Math.sin(Math.toRadians(ang)); 5. double pi = Math.asin(seno)*4; 6. System.out.print("sen(45°)="); 7. System.out.println(seno); 8. System.out.print("pi greco="); 9. System.out.println(pi); 10. System.out.print("Math.PI= "); 11. System.out.println(Math.PI); 12. } 13.} E:\Java\esempi\Math> java FunzioniTrigonometriche sen(45°)= pi greco= Math.PI= E:\Java\esempi\Math>
13/08/02 Tipi base23 Tipo boolean Espressioni boolean possono assumere solo due valori corrispondenti alle costanti predefinite true (vero) e false (falso), variabili booleane assumono per default il valore false Operatori booleani &, |, ^, !, &&, || And &falsetrue false truefalsetrue Xor ^falsetrue false true false Or |falsetrue false true Not ! falsetrue false && e || si comportano come i corrispondenti & e |, terminando la valutazione dell’espressione non appena questa è definita
13/08/02 Tipi base24 Tipo boolean Operatori relazionali (permettono di confrontare fra di loro due valori): == uguale != diverso > maggiore < minore >= maggiore o uguale <= minore o uguale 1.public class Confronti { 2. public static void main(String[] args) { 3. int a=0, c=5; 4. boolean b=(c>3) || (a++>0); 5. System.out.println("(c>3) || (a++>0): "+b+" a="+a); 6. b=(c>3) | (a++>0); 7. System.out.println("(c>3) | (a++>0): "+b+" a="+a); 8. } 9.} (c>3) || (a++>0): true a=0 (c>3) | (a++>0): true a=1 + è l’operatore di concatenazione fra stringhe, se un operando non è una stringa, viene automaticamente convertito in maniera opportuna
13/08/02 Tipi base25 Concatenazione di stringhe (cenni) 1.public class Concatenazione { public static void main(String[] args) { 4. int a=1, b=2; 5. System.out.println("a+b="+a+b); 6. } 7.} a+b=12 6. System.out.println("a+b="+a+b); L’operatore + viene valutato da sinistra verso destra perciò “a+b”+a concatena la stringa “a+b=” con la stringa “1”, il risultato di questa operazione viene quindi concatenato alla stringa “2” Probabilmente si voleva scrivere: 6. System.out.println("a+b="+(a+b));a+b=3
13/08/02 Tipi base26 Operatore ? L’operatore ? È l’unico operatore che coinvolge 3 valori Sintassi: “?” “:” Viene valutata l’espressione booleana, se risulta vera il valore finale è il risultato della prima espressione, altrimenti della seconda min = a<b ? a : b; // assegna a min il valore più piccolo fra a e b 1.public class OperatoreTernario { public static void main(String[] args) { 4. int età = 23; 5. System.out.println( 6. "Mario è "+(età>=18 ? "maggiorenne" : "minorenne")); 7. } 8.} Mario è maggiorenne Java accetta anche lettere accentate negli identificatori, non è comunque una pratica consigliabile
13/08/02 Tipi base27 Tipo char Il tipo char permette di memorizzare e stampare lettere, cifre, caratteri di punteggiatura, operatori, caratteri speciali Una costante di tipo char viene rappresentata dal carattere (o dalla corrispondente sequenza di escape) tra apici singoli char c = ‘a’; // ho memorizzato in c il codice del carattere a char d = ‘\n’; // ho memorizzato in d il codice del “ new line ” Un char viene memorizzato con 16 bit (2 byte) in questo modo è possibile trattare cifre e caratteri di alfabeti diversi (cirillico, ebraico, arabo, … ) Viene garantito il normale ordinamento alfabetico: ‘a’<‘b’, ma ‘B’<‘a’ (le lettere maiuscole precedono le minuscole), sono quindi lecite anche le operazioni di incremento e decremento
13/08/02 Tipi base28 Caratteri unicode I caratteri estesi (unicode) sono rappresentati dalla sequenza \uXXXX (X cifra esadecimale) char digit = ‘\u0f23’; // è la cifra 3 secondo l’alfabeto tibetano 1.public class CaratteriUnicode { public static void main(String[] args) { 4. char digit = '\u0f23'; 5. int val = Integer.parseInt(""+digit); 6. System.out.println(digit+"="+val); 7. } 8.} ?=3 Il sistema non sa come trattare il carattere digit è riconosciuto come una cifra, quindi la stringa risultante è trattata come una stringa numerica
13/08/02 Tipi base29 L’alfabeto Thai Caratteri unicode Menù con caratteri cinesi
13/08/02 Tipi base30 Caratteri unicode I codici minori di 0x7F corrispondono ai codici ASCII ‘\u0033’ il codice della cifra ‘3’ 1.public class CaratteriUnicode { public static void main(String[] args) { 4. char digit = '\u0033'; 5. int val = Integer.parseInt(""+digit); 6. System.out.println(digit+"="+val); 7. } 8.} 3=3 In linea di principio qualunque carattere unicode riconosciuto come lettera o cifra potrebbe essere utilizzato in un identificatore (ammesso di avere un editor adatto)
13/08/02 Tipi base31 a=? b=? Operatore di assegnazione Anche l'operatore = è un operatore lecito all'interno di una espressione restituisce come valore il risultato dell'espressione alla sua destra, gli operatori di assegnazione sono eseguiti da destra a sinistra (la maggior parte degli operatori viene associata da sinistra a destra) a=b=0 ; // assegna 0 sia a b che ad a 1.public class Assign { public static void main(String[] args) { 4. int a, b; 5. a = b = 4 * 5 / 3; 6. System.out.println("a="+a+" b="+b); 7. } 8.} a=6 b=6 1.public class Assign { public static void main(String[] args) { 4. int a, b; 5. a = (b = 4 * 5) / 3; 6. System.out.println("a="+a+" b="+b); 7. } 8.} a=6 b=20
13/08/02 Tipi base32 Operatore di assegnazione Esistono altri operatori di assegnazione: +=, -=, *=, /=, %=, >=, >>>=, &=, |=, ^= il risultato dell'espressione (var op= espr) sarà in generale equivalente all'espressione (var = var op espr) Esempio x += 3 (x = x + 3) NB: Si ricorda che l'assegnazione non è una equazione x = 2 * x - 3 non dà come risultato x = 3, ma il risultato dipenderà dal valore che x assumeva prima del calcolo dell'espressione alla destra di = (esempio se x valeva 2 il nuovo valore di x è 1)
13/08/02 Tipi base33 Regole di conversione Risultato di un’espressioneTipo di dato degli operandi double Almeno un operando e’ double. float Almeno un operando e’ float; nessun operando e’ double. long Non ci sono operandi float o double; almeno un operando e’ long. int Non ci sono operandi float o double; nessun operando e’ long.
13/08/02 Tipi base34 Operatori: precedenza e associatività OperatoreAssociatività ( ) ++ (postfisso) -- (postfisso) da sinistra a destra + (unario) – (unario) ++ (prefisso) -- (prefisso) da destra a sinistra new (tipo) espressione da destra a sinistra * / %da sinistra a destra + -da sinistra a destra = += -= *= /=da destra a sinistra
13/08/02 Tipi base35 Operatori: priorità postfix operators []. ( params ) expr ++ expr -- unary operators ++ expr -- expr + expr - expr ~ ! creation or cast new ( type ) expr multiplicative * / % additive + - shift > >>> Relational = instanceof equality == != bitwise AND & bitwise inclusive OR ^ bitwise exclusive OR | logical AND && logical OR || Conditional ? : Assignment = += -= *= /= %= &= ^= |= >= >>= Quando operatori con la medesima priorita’ sono presenti in un’espressione si deve seguire una regola che stabilisca l’ordine di valutazione. Tutti gli operatori, ad esclusione degli operatori di assegnazione, vengono valutati da sinistra verso destra. Gli operatori di assegnamento vengono valutati da destra a sinistra.