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