Tipo intero Tipi base o primitivi Tipi interi: int, byte, short, long Tipi float: float, double Caratteri: char Tipo booleano: boolean Operatori numerici e logici La parola chiave int definisce una variabile di tipo intero esempio: int a; 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. Tipi base 1 Tipi base 2 Espressioni di tipo intero utilizzano: Tipo intero: operatori operatori unari (che richiedono cioè un solo operando) +, - esempio: -5, -a operatori di tipo aritmetico binari (che richiedono cioè due operandi) +, -, *, /, % (resto della divisione) esempi: 28 / 5 --> 5 (la divisione tra interi restituisce un risultato intero) 28 % 5 --> 3 Esempio /* * Somma di due valori interi */ public class SommaInteri { public static void main(string[] args) { int a, b; int somma; a = 5; b = -3; somma = a + b; System.out.println("a + b = " + somma); Tipi base 3 Tipi base 4 Programma PortaMonete.java 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, 4. int diecicent = 4; // quattro da 10 cent, 5. int venticent = 3; // e tre da 20 6. 7. // calcola il valore totale della moneta 8. int totale = uncent*1 + diecicent*10 + venticent*20; 9. 10. // stampa il risultato 11. System.out.print( Valore totale = ); 12. System.out.print(totale); 13. System.out.println( centesimi ); 14. 15. Ho definito 4 variabili di tipo int E:\Java\esempi> java PortaMonete Valore totale = 108 centesimi E:\Java\esempi> Valore totale = 108 centesimi Tipi base 5 Tipi base 6
Altri tipi interi La dimensione di un dato intero (numero di bit con cui viene rappresentato) ne determina il range di valori rappresentabili. 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) Tipi floating point float precisione semplice (4 byte = 32 bit) double precisione doppia (8 byte = 64 bit) La dimensione di un dato floating point ne determina il range di valori rappresentabili (numero di bit utilizzati per l esponente); la precisione (numero di bit utilizzati per la mantissa) con cui il valore viene rappresentato (numero di cifre significative). Tipo byte short int Memoria 8 bit 16 bit 32 bit Valore minimo -128-32768 -2147483648 Valore Massimo 127 32767 2147483647 Tipo double float Memoria 64 bit 32 bit Esponente 10 bit 8 bit Valore Massimo maggiore di 10 308 maggiore di 10 38 long 64 bit minore di -10 18 maggiore di 10 18 Tipi base 7 Tipi base 8 Costanti floating point Costanti floating point double 133.3 78e-5 sono caratterizzate o dal punto decimale o dall'esponente float 133.3f 78e-5F sono caratterizzate dal suffisso f(f) 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.0 --> 5.6 (il risultato è ancora un double) Esiste l operatore % definito come a%b = a ( (int)(a/b) ) * b 28.0 % 5.1 --> 2.5 (il risultato è ancora un double) Tipi base 9 Tipi base 10 Dichiarazione di costanti con nome: final Una costante è un valore che non cambierà nel corso dell esecuzione del programma. Dichiarazione di una costante con nome: final int N_RIGHE = 80; Per convenzione i nomi di costante sono maiuscoli. Uso delle costanti: è possibile accedere al valore di una costante come a un altra variabile qualsiasi; a parte il valore iniziale, non è possibile modificare il valore della costante nel programma (il compilatore effettua il controllo). Utilità dell uso di costanti con nome: il programma che fa uso di costanti con nome è più facilmente modificabile. Inizializzazione e assegnazione di variabili Una variabile può essere inizializzata nella medesima istruzione che la dichiara: double raggio = 3.1; // corretto Il valore con cui è possibile inizializzare una variabile deve essere consistente con il tipo della variabile. float diametro = 3.2; // errato: 3.2 costante double Si cerca di assegnare un valore con range di valori rappresentabili più ampio (double) ad una variabile con un range di valori rappresentabili più ristretto (float). Rischio di perdita in precisione o di non poter rappresentare il medesimo valore. float diametro = 3.2f; // corretto: 3.2f costante float Tipi base 11 Tipi base 12
Conversioni esplicite E possibile forzare la conversione di una valore da un tipo con range di valori rappresentabili più ampio ad un altro con range di valori rappresentabili più ristretto (ad esempio da int a short) con l operatore di conversione esplicita (cast). La conversione esplicita si specifica scrivendo: il nome del tipo a cui si vuole convertire, racchiuso tra parentesi, seguito dalla espressione di cui si deve convertire il valore. Esempi: short InteroPiccolo; // intero a 2 byte int Intero; // intero a 4 byte Intero = 5; InteroPiccolo = (short)intero; // senza cast si verifica un errore di compilazione float raggio = (float)3.2; int b; double a = b / (double)2; oppure double a = (double)b / 2; oppure double a = b / 2.; Programma ConvertiEuro.java 1.public class ConvertiEuro { 2. 3. public static void main(string[] args) { 4. final double VAL_EURO = 1936.27; 5. double valoreinlire = 247345, valoreineuro; 6. 7. valoreineuro = valoreinlire / VAL_EURO; 8. System.out.print(valoreInLire + " lire valgono " + valoreineuro + " euro."); 9. 10. 11. 247345.0 lire valgono 127.74303170528904 euro. Tipi base 13 Tipi base 14 Valutazione delle espressioni Le espressioni vengono valutate calcolando il valore di ciascun operando e applicando gli operatori uno alla volta secondo un ordine che dipende: dalla precedenza (priorità) degli operatori che vi occorrono normalmente gli operatori moltiplicativi (* / %) vengono applicati prima degli additivi (+ -) a parità di precedenza, dalla associatività degli operatori normalmente gli operatori a parità di precedenza, vengono valutati da sinistra verso destra dalle parentesi le parentesi hanno la priorità massima rispetto ad ogni altro operatore, per cui si possono utilizzare per alterare l ordine di valutazione delle esepressioni, superando le regole di precedenza e associatività In caso di dubbi usare sempre le parentesi. In genere i programmi diventano anche più leggibili In generale la leggibilità aumenta spezzando espressioni complesse in più istruzioni semplici Tipi base 15 12/3 + 4 vale 8 Valutazione delle espressioni e conversioni: esempi 2(3+4) errata, perché? (1/2) + (1/2) quanto vale? (1./2) + (1/2.) quanto vale? (1./2) + (1/2) quanto vale? int intero = 10; double razionale; razionale = intero; int intero; double razionale = 10.3; intero = razionale; // errore Tipi base 16 Regole di conversione Operatori: precedenza e associatività Risultato di un espressione Tipo di dato degli operandi Operatore ( ) ++ (postfisso) -- (postfisso) Associatività da sinistra a destra double Almeno un operando e double. + (unario) (unario) ++ (prefisso) -- (prefisso) da destra a sinistra float long Almeno un operando e float e nessun operando e double. Non ci sono operandi float o double; e almeno un operando e long. new (tipo)espressione * / % + - da destra a sinistra da sinistra a destra da sinistra a destra int Non ci sono operandi float o double e nessun operando e long. = += -= *= /= da destra a sinistra Tipi base 17 Tipi base 18
Tutti gli operatori: priorità Funzioni matematiche postfix operators unary operators creation or cast multiplicative additive shift Relational equality bitwise AND bitwise inclusive OR bitwise exclusive OR logical AND logical OR Conditional Assignment []. (params) expr++ expr-- ++expr --expr +expr -expr ~! new (type)expr * / % + - << >> >>> < > <= >= instanceof ==!= & ^ &&? : = += -= *= /= %= &= ^= = <<= >>= >>= 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. Ad esempio: double Math.sqrt(x) calcola la radice quadrata di x double Math.pow(x, y) calcola x elevato alla y La classe Math contiene anche la definizione di alcune costanti matematiche con la migliore approssimazione possibile: Math.E Math.PI 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. Tipi base 19 Tipi base 20 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) 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 random() Restituisce un numero "a caso" compreso fra 0.0 e 1.0 escluso Tipi base 21 Tipi base 22 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 )=0.7071067811865475 pi greco=3.1415926535897927 Math.PI= 3.141592653589793 E:\Java\esempi\Math> Tipo boolean Un tipo di dato molto utile nella programmazione è il tipo delle espressioni logiche (utilizzate nei blocchi di decisione): questo tipo di dato è rappresentato in java dal tipo primitivo boolean (dal nome del matematico irlandese George Boole [1815-1864] che ne ha formulato un algebra). L algebre di Boole si basa sui seguenti elementi: un dominio composto dai due valori vero e falso che si denotano con i valori e ; tre operatori (detti booleani) l operatore not di negazione o complementazione (!) l operatore or di disgiunzione ( ) l operatore and di congiunzione (&) Tipi base 23 Tipi base 24
Tipo boolean Espressioni boolean possono assumere solo i due valori corrispondenti alle costanti predefinite (vero) e (falso), variabili booleane assumono per default il valore Operatori booleani &,, ^,!, &&, And & Or Xor ^ Not! && e si comportano come i corrispondenti & e, terminando la valutazione dell espressione non appena questa è definita Tipi base 25 Operatore! di negazione! vale! vale Operatore && di congiunzione condizionale Operatore di disgiunzione condizionale Operatori logici a && b vale se a e b valgono (l operando b viene valutato solo se a vale ); && e && valgono && vale a b vale se almeno uno tra a e b vale (l operando b viene valutato solo se a vale ); e valgono vale Tipi base 26 Valutazione di!, &, &&,, Nella valutazione di espressioni di tipo boolean (che coinvolgono cioè operatori logici) l operatore di negazione! ha la precedenza maggiore tra tutti gli operatori logici e non; l operatore and ha precedenza sull or; Esercizio: si valutino le seguenti espressioni booleane! &&!( && ) ( && )!( && ) Tipi base 27 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 { + è l operatore di concatenazione fra stringhe, se un operando non è una stringa, viene automaticamente convertito in maniera opportuna 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): a=0 (c>3) (a++>0): a=1 Tipi base 28 Esercizi Predicati 10 > 5 10.0 < 5.0 10 > 10 10 >= 10 10.0 >= 5.0 10 == 5 10 == 10 10!= 5 10!= 10 Le espressioni di tipo boolean sono chiamate anche predicati (o condizioni) i predicati sono espressioni in cui possono apparire sia operatori relazionali che operatori logici definire un predicato che sia vero se n è compreso tra 0 e 10 (estremi inclusi) (n>=0)&&(n<=10) vale se (e solo se) il valore di n è compreso tra 0 e 10 Tipi base 29 Tipi base 30
È possibile dichiarare variabili di tipo boolean Variabili boolean boolean npari; // n è pari boolean npositivo; // n è positivo boolean npariepositivo; // n è pari e positivo È possibile assegnare a una variabile boolean il valore (della valutazione) di un predicato /* n è pari se * il resto della divisione per due vale zero */ npari = (n%2) == 0; npositivo = n>0; Esercizi Qual è il valore stampato dal seguente frammento di codice? Perché? boolean a, b, c; a = ; b = ; c = a &&!b; b = (b && c) (!b &&!c); a = (b && c) (!b &&!c); c =!(a && b); Nei predicati è possibile usare anche variabili boolean npariepositivo = npari && npositivo; Tipi base 31 Tipi base 32 Esercizio Concatenazione di stringhe (cenni) Dati tre numeri a, b, c forniti da tastiera in ordine crescente, verificare che esista un triangolo avente come misura dei lati tali numeri e stabilire di che tipo e' il triangolo. Si effettuino opportuni controlli per verificare che i numeri siano stati forniti da tastiera in ordine crescente. (Si ricorda che, dati tre numeri a, b, c ordinati in modo crescente, esiste un triangolo avente come misura dei lati tali numeri se c<a+b). 1. public class Concatenazione { 2. 3. 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 Si doveva scrivere: 6. System.out.println("a+b="+(a+b)); a+b=3 Tipi base 33 Tipi base 34 Tipo char Il tipo char permette di memorizzare lettere, cifre, caratteri di punteggiatura, operatori, caratteri speciali. Il tipo char è un tipo numerico. A ciascun valore di tipo char è associato un codice numerico (numero naturale) stabilito dal sistema di codifica chiamata Unicode (16 bit = 2 byte). Con un char è possibile trattare cifre e caratteri di alfabeti diversi (cirillico, ebraico, arabo, ). 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 carattere newline Tipi base 35 Aritmetica dei char Gli operatori aritmetici possono essere applicati anche ai char (in quanto i char sono interi memorizzati con 16 bit). Inoltre: i codici assegnati ai caratteri alfabetici minuscoli sono consecutivi; i codici assegnati ai caratteri alfabetici maiuscoli sono consecutivi; i codici numerici dei caratteri minuscoli sono maggiori dei codici numerici dei caratteri maiuscoli; i codici assegnati ai caratteri numerici (cifre da 0 a 9 ) sono consecutivi. Quindi: viene garantito il normale ordinamento alfabetico: a < b, ma B < a (le lettere maiuscole precedono le minuscole); sono lecite anche le operazioni di incremento e decremento. (int)( 3-0 ) vale 3 (char)( 0 +3) vale 3 char c1 = a, c2; c2 = ++c1; // c2 vale b Tipi base 36
Caratteri unicode I caratteri estesi (unicode) sono rappresentati dalla sequenza \uxxxx (X cifra esadecimale) char digit = \u0f23 ; // è la cifra 3 secondo l alfabeto tibetano I codici minori di 0x7F corrispondono ai codici ASCII \u0033 è il codice della cifra 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) Variabili locali Per ora stiamo considerando solo variabili dichiarate nel metodo main(). Le variabili dichiarate nell ambito di un metodo si chiamano variabili locali (sono utilizzabili e visibili solo all interno del metodo, ossia nel suo corpo). E possibile dichiarare variabili locali a livello di blocco utilizzando una coppia di { che delimiti il blocco. Tali variabili non saranno visibili e quindi utilizzabili al di fuori del blocco. Esempio: public class SommaInteri { public static void main(string[] args) { int a, b; { // inizio del blocco int somma; // somma visibile solo all interno del blocco a = 5; b = -3; somma = a + b; System.out.println("a + b = " + somma); // fine del blocco System.out.println(a + " + " + b + " = " + somma); // errore: somma non è visibile Tipi base 37 Tipi base 38