I tipi di dato primitivi Raffaella Brighi, a.a. 2006/07 Corso di Algoritmi e programmazione. A.A. 2006-07 CdL Operatore Informatico Giuridico. Gestione della memoria I registri. Area di memorizzazione più veloce. Si trova all’interno del processore. Non sono controllabili dal programma Lo stack. Risiede nella RAM e viene liberata e assegnata attraverso lo stackpointer. Molto veloce. Il compilatore deve conoscere l’esatta occupazione dello spazio in memoria e il ciclo di vita. Lo heap. È un blocco di memoria di uso generale dove si trovano tutti gli oggetti Java create con l’operazione new. Il compilatore non ha bisogno di sapere quanto spazio dovrà assegnare. Occorre più tempo per allocare spazio sullo heap che sullo stack. 1 Gestione della memoria Lo spazio di memoria statico. Statico significa posto fisso (sempre in RAM, volatile). La memoria statica contiene dati che sono memorizzati per tutto il tempo di esecuzione del programma. Lo spazio di memoria costante. Lo spazio di memoria non RAM. Dati che esistono anche quando il programma non è in esecuzione: oggetti streamed (dati convertiti in flussi di byte) e oggetti persistenti. I tipi di dato primitivi Per alcuni tipi di dato, usati molto spesso, Java crea una variabile che non è un riferimento ma memorizza direttamente il valore e viene posta sullo stack. Questo aumenta le prestazioni (più veloce). La dimensione di questi tipi di dato è determinata a priori dal linguaggio Java e non dipende dalle architetture. I tipi di dato primitivi sono: numeri (interi o virgola mobile), caratteri, booleani. 2 Interi e numeri in virgola mobile La differenza tra i tipi numerici primitivi e’ il numero di bit dedicato alla memorizzazione, che determina l’intervallo di valori che possono essere memorizzati. Type Storage Min Value Max Value byte short int long 8 bits 16 bits 32 bits 64 bits -128 -32.768 -2.147.483.648 < -9 x 1018 127 32.767 2.147.483.647 > 9 x 1018 float double 32 bits 64 bits +/- 3,4 x 1038 with 7 significant digits +/- 1,7 x 10308 with 15 significant digits Caratteri Caratteri Parola chiave char. Un carattere viene indicato racchiudendolo tra un singolo apice. chat mycar=‘a’ Java supporta il set di caratteri Unicode (16 bit). Un set di caratteri è una lista di caratteri ordinata ognuno dei quali corrisponde ad un valore numerico. Il set di caratteri definisce i valori validi che si possono assegnare alle variabili di tipo carattere. Il numero di caratteri rappresentati dipende dal numero di bit per carattere. ASCII- 7 bit 128 caratteri poi esteso a 256 (otto bit) Unicode 16 bit: 65536 caratteri distinti (ASCI è un sottoinsieme di unicode). 3 I caratteri dell’alfabeto Unicode possono essere rappresentati da sequenze di escape della forma uHHHH, dove H indica una cifra esadecimale. Cioè uHHHH è il valore corrispondente del carattere nella rappresentazione Unicode. es. char mycar=‘A’ può diventare char mycar=‘\u0041’ '\t‘ '\u0009'HORIZONTAL TABULATION ‘\n‘ '\u000a‘ NEW LINE '\r‘ '\u000d‘ CARRIAGE RETURN ' ‘ '\u0020‘ SPACE Si utilizzano le codifiche per stringhe che contengono caratteri supplementari (es. alfabeti internazionali), I booleani Il tipo di dati boolean ha due valori validi: true e false. Viene utilizzato nelle condizioni. 4 I letterali Un letterale è un valore esplicito utilizzato in un programma. Es. int keys = 88 char lettera = ‘a’ Espressioni aritmetiche Un’espressione è la combinazione di operatori e operandi. Le operazioni aritmetiche classiche sono: + somma - differenza * moltiplicazione / divisione % resto della divisione intera del primo operando per il secondo Se entrambi gli operandi sono in virgola mobile anche il risultato è in virgola mobile. La divisione tra interi il risultato è un intero. 5 Conversioni di dati A volte è necessario convertire un valore di un tipo nel corrispondente valore di un altro tipo. Occorre prestare attenzione perché la conversione non determini perdita di informazione. Conversione larga: si effettua da un tipo di dato ad un altro che usa un quantitativo di memoria maggiore o uguale. (es.) Conversione stretta: una parte di informazione può andare persa per sempre. 1. byte -> short,int, long, float, double char -> byte Le conversioni possono avvenire in tre modi: Conversioni per assegnamento float denaro; int lire; denaro = lire; 2. 3. Promozione aritmetica: si verifica quando alcuni operatori hanno bisogno di cambiare il tipo di un operando per svolgere l’operazione. Es. divisione tra float e int Casting: è un operatore che applica all’operando la conversione verso il tipo richiesto. L’operando è racchiuso tra parentesi tonde. denaro = (float) lire risultato = (float) numeratore / denominatore 6 Costanti Sono valori che non vengono modificati nel corso del programma ed hanno un significato ben preciso. es areacerchio = r * r * 3.14 Questi dati possono essere memorizzati in costanti in modo che il programma sia leggibile e di più facile manutenzione. Una costante come la variabile è caratterizzata da nome, tipo e valore. La differenza è che il suo valore non può essere modificato nel corso del programma. sintassi: final tipo NOME = valore; es final double PIGRECO = 3.14159… ; Leggere l’input Nella versione 5.0 di java è stata introdotta la classe Scanner che consente la lettura semplice e comoda dei dati inseriti in ingresso da tastiera. Scanner in = new Scanner (System.in) -> crea un oggetto ‘in’ di tipo Scanner che legge dati ricevuti da tastiera tramite System.in nota: la classe Scanner può essere utilizzata per leggere dati da qualsiasi flusso in ingresso (es. file). Dopo aver creato l’oggetto possiamo utilizzarne i metodi per leggere l’input e convertire nel tipo corretto i dati in ingresso. L’oggetto legge l’input per token, vale a dire elementi atomici delimitati da un carattere convenzionale. Normalmente il token termina quando l’utente preme invio. 7 String next() Finds and returns the next complete token from this scanner. boolean nextBoolean() Scans the next token of the input into a boolean value and returns that value. byte nextByte() Scans the next token of the input as a byte double nextDouble() Scans the next token of the input as a double. float nextFloat() Scans the next token of the input as a float. int nextInt() Scans the next token of the input as an int. String nextLine() Advances this scanner past the current line and returns the input that was skipped. long nextLong() Scans the next token of the input as a long. int num= in.nextInt (); // legge e memorizza un numero intero digitato dall’utente String frase; frase = in.nextLine(); //restituisce tutto ciò che l’utente ha digitato prima di premere enter. String parola; parola = in.next(); //restituisce la parola successiva, ovvero una sequenza di caratteri terminata dal carattere spazio. Quando viene invocato uno dei metodi descritti il programma si arresta in attesa che l’utente digiti il dato e prema il tasto enter. Quindi prima di invocare il metodo di lettura è fondamentale dare all’utente istruzioni adeguate sull’input che ci sia aspetta. es. System.out.println (“inserisci il numero totale di giocatori”); 8 La classe Keyboard Non appartiene alla libreria standard di Java ma fa parte del materiale didattico. Serve per leggere l’input dell’utente da tastiera. Viene utilizzata nel testo Lewis&Loftus perché si riferisce a una jdk precedente alla 5.0. Si può dal sito di Lewis&Loftus (è disponibile anche tra i materiali diddattici del corso). NOTA: utilizzare negli esercizi la classe SCANNER Methods public static String readString () Reads and returns a string, to the end of the line, from standard input. public static String readWord () Reads and returns one space-delimited word from standard input. public static boolean readBoolean () Reads and returns a boolean value from standard input. Returns false if an exception occurs during the read. public static char readChar () Reads and returns a character from standard input. Returns MIN_VALUE if an exception occurs during the read. public static int readInt () Reads and returns an integer value from standard input. Returns MIN_VALUE if an exception occurs during the read. public static long readLong () Reads and returns a long integer value from standard input. Returns MIN_VALUE if an exception occurs during the read. public static float readFloat () Reads and returns a float value from standard input. Returns NaN if an exception occurs during the read. public static double readDouble () Reads and returns a double value from standard input. Returns NaN if an exception occurs during the read. 9 public static int getErrorCount() Returns the number of errors recorded since the Keyboard class was loaded or since the last error count reset. public static void resetErrorCount (int count) Resets the current error count to zero. public static boolean getPrintErrors () Returns a boolean indicating whether input errors are currently printed to standard output. public static void setPrintErrors (boolean flag) Sets the boolean indicating whether input errors are to be printed to standard input. Esercizio Scrivere un programma che preso in input il raggio di un cerchio (intero, positivo) ne restituisca Area e Circonferenza. 10 Formattare l’output: il metodo printf Può essere utile stampare l’output in un formato particolare, ad esempio dare solo 2 cifre significative per un numero in doppia precisione. A questo scopo si utilizza il metodo printf. public PrintStream printf(String format, Object... args) format è una stringa che esprime il formato secondo una codifica predefinita (specificatori di formato): es. “%5.2f” indica che deve essere stampato un numero in virgola mobile lungo 5 cifre con una precisione di 2 cifre Il separatore % delimita più specificatori di formato, se vengono mandati in stampa più valori: System.out.printf(“%5.2f%5d”, num1, num2); Nello specificatore di formato si possono aggiungere anche etichette, es. “totale:%5.2f” La classe Math La classe Math fornisce un vasto numero di funzioni matematiche. Fa parte della libreria standard di Java (package Java.lang). La classe Math ha metodi statici. Per invocare un metodo statico non occorre istanziare la classe: val=nomeClasse.nomeMetodo(parametri). static int abs(int num) Restituisce il valore assoluto di num static double ceil (double num) Restituisce il piu’ piccolo numero intero maggiore o uguale a num static double exp (double power) Restituisce il valore di e elevato a power 11 static double floor (double num) Restituisce il più grande numero intero minore o uguale a num static double max (double x,double y) Restituisce il più grande tra x e y (esiste un metodo max per ogni tipo di dato) static double min (double x,double y) Restituisce il più piccolo tra x e y (esiste un metodo max per ogni tipo di dato) static double random () Restituisce un numero casuale compreso tra 0.0 e 1.0 static double sqrt (double num) Restituisce la radice quadrata di num che deve essere positivo. Creazione di numeri casuali. Generazione di un numero casuale intero compreso tra 1 e 10. double numD; int numRnd; numD=Math.random(); numRnd = (int)(numD*10+1); 12 Esercizio Scrivere un programma che calcoli il numero di km percorribili con un litro di benzina da un’automobile. L’applicazione prende in ingresso il tipo di automobile, due interi: la lettura del misuratore del carburante all’inizio e alla fine del viaggio e il numero totale di km percorsi. Nel dare il risultato indicare a quale tipo di automobile si riferisce. Esercizio Scrivere un programma che presi in input 4 numeri interi restituisca il più grande ed il più piccolo. 13