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
Scarica

I tipi di dato primitivi