Tipi di Dato

Transcript

Tipi di Dato
Tipi di Dato
Rosario Pugliese
[email protected]
Università di Firenze
Tipi di Dato – p.1/37
Contenuti
Tipi di dato primitivi
Variabili
Espressioni
Istruzioni di base
Tipi di Dato – p.2/37
Concetti base
Dati
Variabili: immagazzinano dati e sono associate a
locazioni di memoria
Tipi: specificano la tipologia di dati che una variabile può
contenere (essenziali per determinare quanta memoria
debba essere riservata alla variabile e come i dati
immagazzinati sono codificati)
Istruzioni
Istruzioni di base: assegnamento, input ed output
Istruzioni di controllo: selezioni e cicli
Suddivisione in moduli di un programma:
sotto-programmi
Tipi di Dato – p.3/37
Input/Output in JAVA -int x;
x = Input.getInt( "Inserisci un numero intero" );
System.out.print( "Numero inserito: " );
System.out.println( x );
N.B. System è una classe predefinita, Input è una classe appositamente
realizzata ed inclusa in JAVA -Tipi di Dato – p.4/37
Variabili e loro dichiarazione
Variabile: utilizzata per memorizzare un dato (come, ad
esempio, un numero o una lettera).
Nome: identificatore con cui riferirsi ad una variabile.
Valore: dato contenuto in una variabile.
Tipo: tipo del dato contenuto in una variabile.
Una variabile deve essere sempre dichiarata prima di poter
essere utilizzata.
Sintassi
tipo variabile 1,variabile 2, . . . ;
Esempio
int numeratore,denominatore;
Tipi di Dato – p.5/37
Identificatori
Devono soddisfare le seguenti regole:
Non cominciano con una cifra.
Consistono di lettere, cifre, del simbolo _ e del simbolo $.
Sono sensibili alle maiuscole.
Dovrebbero anche soddisfare le seguenti regole:
Hanno un significato relativo al contesto e suggeriscono il
loro utilizzo e/o il tipo di dati che contengono
(es. contatore).
Iniziano con una lettera minuscola e le eventuali parole
interne iniziano con una lettera maiuscola.
Non contengono il simbolo $
(è un simbolo riservato di Java).
Tipi di Dato – p.6/37
Tipi di dato primitivi
N OME
byte
short
int
long
float
double
char
boolean
T IPO
intero
intero
intero
intero
reale
reale
carattere
vero/falso
M EMORIA
1 byte
2 byte
4 byte
8 byte
4 byte
8 byte
2 byte
1 byte
Tipi di Dato – p.7/37
Numeri in virgola mobile
Rappresentazione in virgola mobile di un numero reale x:
mantissa m ed esponente e tali che
x = m · B e,
dove B è un numero intero detto base del sistema di
rappresentazione.
Notazione scientifica: B = 10 (si usa anche E ).
Esempio: 2.34E + 2 = 234.0 e 1.234E − 3 = 0.001234.
Precisione: numero di cifre decimali che possono essere
specificati nella mantissa (i numeri di tipo double sono
anche detti numeri in virgola mobile a precisione doppia).
Tipi di Dato – p.8/37
Il tipo di dati char
Usato per singoli caratteri, come le lettere alfabetiche.
Quando si specifica un carattere, come ’n’, va racchiuso tra
singoli apici.
Lettere minuscole e maiuscole sono caratteri diversi (ad
esempio, ’a’ ed ’A’ sono due caratteri diversi).
Tipi di Dato – p.9/37
Istruzione di assegnazione
La variabile alla sinistra del segno = è posta uguale al valore
dell’espressione alla destra.
Sintassi
variabile = espressione ;
Esempio
N.B. + è l’operatore di concatenazione tra stringhe.
Tipi di Dato – p.10/37
Somma di numeri interi
Formula di Gauss: dato un numero intero n, la somma dei primi
n numeri interi positivi è uguale a
n(n + 1)
.
i=
2
i=1
n
X
Tipi di Dato – p.11/37
Semantica dell’assegnazione
Uno stesso identificatore di variabile può apparire in
entrambi i lati dell’operatore di assegnazione.
Prima si usa il valore della variabile (nell’esempio, 5) per
valutare l’espressione, poi si imposta il nuovo valore della
variabile (nell’esempio, 4) al valore restituito
dall’espressione.
Tipi di Dato – p.12/37
Letterali
A differenza di una variabile, il valore di un letterale non può
cambiare (per questo si dicono anche costanti).
Letterali di tipo numero come 5.0 (costante reale) e 5
(costante di tipo intero).
Letterali di tipo carattere come ’A’, ’B’ e ’*’.
Letterali di tipo Booleano, ovvero le costanti true e false.
Letterali di tipo stringa: come "Contatore: ".
Tipi di Dato – p.13/37
Numeri reali e perdita di precisione
I numeri double più estesi dei numeri int ma meno precisi.
Il programma stampa Differenza: 0.0625 e non
Differenza: 0.05.
Il problema è dovuto al fatto che i double possono
memorizzare solo 15 cifre significative.
Tipi di Dato – p.14/37
Scambio di variabili
Operazione molto frequente.
Non può essere ridotta all’esecuzione di
x = y; y = x;
perché si perde il valore iniziale di x ed entrambe le variabili
hanno al termine dell’esecuzione il valore che aveva y prima
dello scambio.
Facendo uso di una variabile “di appoggio”, può essere
eseguita dalle seguenti istruzioni:
z = x; x = y; y = z;
Nel caso di variabili intere si può fare a meno della terza
variabile ed usare le operazioni di somma e sottrazione:
x = x + y; y = x - y; x = x - y;
Tipi di Dato – p.15/37
Assegnare valori iniziali
Opzionale (perché le variabili potrebbero avere valori di default)
ma consigliato.
Sintassi
tipo var 1 = esp 1,var 2 = esp 2, . . . ;
Esempio
N.B. area non è inizializzata.
Tipi di Dato – p.16/37
Operatori di assegnazione specializzati
Ottenuti combinando l’operatore di assegnazione con un
operatore aritmetico (+, -, *, /, %).
L’istruzione quantita += 5; è equivalente all’istruzione
quantita = quantita+5;
Può essere talvolta utile (mai necessario).
Tipi di Dato – p.17/37
Operatori di assegnazione specializzati
L’espressione alla destra dell’operatore di assegnazione
specializzato è trattata come una singola unità (come se vi fossero
delle parentesi).
La seconda istruzione del codice è equivalente alla terza e non
alla quarta.
Tipi di Dato – p.18/37
Commenti
Da includere per aumentare la chiarezza dei programmi, ma
senza esagerare.
Di due tipi: di riga e di paragrafo.
Esiste un terzo tipo per generare documentazione in
formato HTML.
Sintassi
// commento limitato ad una singola linea
/* commento distribuito su piu’ linee
senza limiti sul numero di righe */
Tipi di Dato – p.19/37
Conversione di tipo
Necessaria per assegnare un valore di un tipo ad una variabile
di un tipo diverso.
Implicita (ovvero automatica): assegna valore di tipo “più
basso” ad una variabile di tipo “più alto” nella gerarchia:
byte, short, int, long, float e double.
N.B. Cambia il tipo del valore non della variabile.
Tipi di Dato – p.20/37
Tipo di un’espressione
Operandi tutti dello stesso tipo: il tipo del valore di ritorno è
quello degli operandi.
Operandi di tipo diverso: il tipo del valore di ritorno è quello
più alto nella gerarchia.
Il tipo di n viene automaticamente convertito in double.
Tipi di Dato – p.21/37
Conversione e perdita di precisione
Non tutti i valori di tipo int sono rappresentati nel tipo float.
A causa della pardita di precisione, il valore di z stampato è
1109876480.
Tipi di Dato – p.22/37
Conversione esplicita
Necessaria per assegnare un valore di un tipo più alto ad una
variabile di un tipo più basso.
Se distanza è di tipo double e punti è di tipo int,
l’assegnazione punti = distanza; genera l’errore
possible loss of precision
found
: double
required: int
Sintassi
var 1 = (tipo )var 2 ;
Esempio
punti = (int)distanza;
Anche in questo caso, cambia il tipo del valore non della
variabile.
Tipi di Dato – p.23/37
Conversione e troncamento
Quando si converte un valore di tipo in virgola mobile in un tipo
intero, la parte decimale viene ignorata (non si arrotonda).
Il valore di numeroEuro stampato è 26.
Tipi di Dato – p.24/37
Troncamento e perdita di precisione
Non tutti i numeri reali sono rappresentati in modo esatto.
Il valore di n stampato è 434, perché nel sistema binario non
esiste una rappresentazione esatta di 4.35: la rappresentazione
utilizzata ha un valore appena inferiore per cui, quando la si
moltiplica per 100 e si effettua il troncamento, si ottiene 434.
Tipi di Dato – p.25/37
Divisione reale e divisione intera
Si possono formare espressioni numeriche combinando
variabili e letterali con gli operatori di addizione +,
sottrazione -, moltiplicazione * e divisione /.
L’operatore di divisione merita un’attenzione particolare.
Se almeno uno dei due operandi è di tipo float o
double, il risultato è quello aspettato.
Se entrambi gli operandi sono di un tipo intero, la parte
frazionaria viene ignorata.
I valori stampati sono 1.25 e 1.
Tipi di Dato – p.26/37
Caratteri come interi
I caratteri sono memorizzati come interi in accordo ad un
particolare codice.
I codici ASCII (8 bit) ed Unicode (16 bit) non fanno
corrispondere alle cifre i loro valori numerici intuitivi.
Il valore di rispostaIntera stampato è 55 che è il codice
intero associato al carattere ’7’.
Tipi di Dato – p.27/37
Operatore di modulo
L’operazione % restituisce il resto della divisione del primo
operando per il secondo.
Il valore di ritorno di 14%4 è 2.
Con operandi di tipo intero, consente di recuperare la parte
decimale del quoziente.
Diverse applicazioni
Consente di contare modulo un certo valore n (ad
esempio, 0, 1, 2, 0, 1, 2, . . . ).
Consente di eseguire certe operazioni solo su numeri
multipli di uno specificato valore m (ad esempio, solo sui
numeri 3, 6, 9, 12, . . . ).
Tipi di Dato – p.28/37
Precedenze e parentesi
Espressioni seguono normali regole di precedenza: operatori
unari, moltiplicativi ed additivi.
Le parentesi forzano la precedenza.
I valori stampati sono 2.4000000000000004 e 10.4.
Tipi di Dato – p.29/37
Operatori di incremento e decremento
Si indicano con il segno ++ e -- e possono essere usati per
aumentare o diminuire di 1 il valore di una variabile intera.
Se precedeono la variabile, il valore è incrementato
(decrementato) prima dell’uso, altrimenti il valore è
incrementato (decrementato) dopo.
I valori stampati sono 12, 12 e 7.
Tipi di Dato – p.30/37
Array
Collezione indicizzata di elementi dello stesso tipo.
Sintassi
tipo Base [] nome Array = {lista Valori};
tipo Base [] nome Array = new tipo Base [numero Elementi ];
Quando la lunghezza ed i valori degli elementi sono noti a priori, è
conveniente la prima forma, altrimenti si deve usare la seconda.
Tipi di Dato – p.31/37
Terminologia relativa agli array
Tipi di Dato – p.32/37
Array e locazioni di memoria
int numero = 6;
crea una locazione di 4 byte con nome numero e valore 6.
int[] numeroArray = {6};
crea una locazione (raffigurata da 2 byte) numeroArray
contenente l’indirizzo di un’altra locazione di 4 byte,
riferibile come numeroArray[0] e contenente il valore 6.
Una variabile di tipo array è talvolta detta essere un
riferimento all’array.
Tipi di Dato – p.33/37
Lunghezza di un array
Numero di elementi contenuti in un array.
Accesso alla lunghezza con nome dell’array seguito da punto
e da length.
Stampa Lunghezza di numeroPrimo: 6.
Non è possibile modificare il valore della lunghezza di un
array (da cui dipende la quantità di memoria allocata).
Tipi di Dato – p.34/37
Indicizzazione di un array
Gli indici degli array partono sempre da 0.
Ultimo indice: lunghezza dell’array meno 1.
int[] punteggio = {97,86,92,71};
Se un programma accede ad una variabile indicizzata con un
valore dell’indice fuori dominio, in fase di esecuzione
l’interprete Java genera un messaggio di errore del tipo
java.lang.ArrayIndexOutOfBoundsException: 11
N.B. Ciò differisce da quanto succede in C e C++.
Tipi di Dato – p.35/37
Array multi-dimensionali
Consentono di strutturare gli elementi della collezione in
forma di tabelle a più dimensioni.
In numero delle dimensioni determina il numero di indici.
Sintassi
tipo Base []...[] nome Array = new tipo Base [num El ]...[num El ];
Tipi di Dato – p.36/37
Scacchiera della dama
Gli array bidimensionali sono detti matrici.
Le matrici sono memorizzate come array di righe,
cioè l’indice più a sinistra si riferisce alle righe.
N.B. Le due rappresentazioni non sono consistenti!
Tipi di Dato – p.37/37