View
1
Download
0
Category
Preview:
Citation preview
1
Rappresentazione delle informazioni
Rappresentazione delle informazioni
• L’informatica si occupa di rappresentare ed elaborare
informazioni diverse:
• numeri
• caratteri
• audio
• immagini
• video
Rappresentazione dei caratteri
I caratteri: ASCII standard
• I simboli o caratteri appartenenti ad unalfabeto vengono codificati (cioè“rappresentati”) mediante sequenze di bit: unadiversa sequenza per ciascun diverso carattere.
• Uno dei codici più noti e usati è il codiceASCII (American Standard Code forInformation Interchange), usa una sequenza di7 bit per ciascun carattere:• ci sono 128 (=27) sequenze diverse, utilizzate
anche per lettere, segni di punteggiatura, cifredecimali, ecc.
2
I caratteri: ASCII esteso
• Dato che l’unità elementare di informazionenei calcolatori è il byte (= 8 bit), si è passati adusare, quasi sempre, il codice ASCII esteso,che usa una sequenza di 8 bit per ciascuncarattere degli alfabeti occidentali:
• ci sono 256 (=28) sequenze diverse, utilizzateanche per vocali accentate e altre lettere speciali(es. ß tedesca, ç francese)
• le sequenze con la prima cifra uguale a zerocoincidono con il codice ASCII.
(Appendice G)
I caratteri: ASCII esteso
• La codifica è: posizione n°°°°
il primo carattere 00000000 0
il secondo 00000001 1
…… ….
l’ultimo 11111111 255
• La sequenza di simboli Ciao viene codificata inASCII nel modo seguente:
C i a o
01000011 01101001 01100001 01101111
n° 67 105 97 111
Le lettere sono rappresentabili in 7 bit.
I caratteri: ASCII esteso
• I primi 32 caratteri del codice ASCII (con codice da0 a 31) sono caratteri di controllo:• 9 tabulatore ’\t’
• 10 nuova riga ’\n’
• 13 invio ’\r’
• I caratteri da 32 a 127 sono caratteri stampabili:• 32 spazio ’ ’
• da 48 a 57 caratteri numerici, le cifre decimali ’0’, ’1’…
• da 65 a 90, da 97 a 122 caratteri alfabetici (maiuscoli eminuscoli)
• da 33 a 47, da 58 a 64, da 91 a 96, da 123 a 127 caratteri diinterpunzione e simboli speciali.
I caratteri: Unicode
• Per rappresentare i segni grafici utilizzati datutti gli alfabeti del mondo servono molti piùsimboli diversi
• codifica Unicode http://www.unicode.org
• usa una sequenza di 16 bit per ciascunsegno grafico:
• ci sono 65536 (= 216) sequenze diverse
• le sequenze con le prime otto cifre uguali a zerocoincidono con il codice ASCII esteso.
3
I caratteri (codice Unicode)Rappresentazione delle
informazioni• Il linguaggio Java utilizza Unicode come
insieme di simboli; in ogni linguaggio diprogrammazione i simboli servono percostruire le unità lessicali.
• Ogni informazione che vogliamorappresentare è caratterizzata da un valore e daun suo tipo (tipo di dato). Non semprepossiamo o vogliamo rappresentaredirettamente il valore, ma vogliamo poterciriferire ad esso tramite un nome.
Astrazione
Astrazione
• L’evoluzione dei linguaggi di programmazione(basso ad alto livello) ha portatoall’introduzione del concetto di variabile: lalocazione di memoria viene “nascosta”all’utente, che vi accede tramite il nome dellavariabile.
• Le operazioni che si possono fare sullavariabile dipendono dal suo tipo: l’utente nonsa come avviene realmente la somma tra duenumeri interi (reali) o il loro confronto.
• Si ha una astrazione sul dato e sul suo tipo.
4
Astrazione
• L’evoluzione successiva dei linguaggipermetterà all’utente di inventare dei nuovitipi di dati, dei nuovi concetti.
• Tipo di Dato Astratto
1. è un insieme di elementi chiamato dominio
2. ha un nome
3. possiede delle funzioni che operano suldominio
4. possono esserci costanti che locaratterizzano.
Variabile e Tipi base
Variabile e Tipi base
• Nei corsi di matematica quando scriviamo
x ∈∈∈∈ ℝℝℝℝ
e diciamo “ x è una variabile reale” intendiamodire che x è un nome che indica un elementogenerico dell’insieme ℝℝℝℝ dei numeri reali.
• Nei corsi di informatica con “x è una variabilereale” intendiamo dire che x è un nome cheindica una posizione di memoria che conterràun elemento generico di R (con R⊂ℝ⊂ℝ⊂ℝ⊂ℝ).
Variabile e Tipi base
• ℝℝℝℝ insieme dei numeri reali (infinito econtinuo).
• R insieme dei numeri reali rappresentabilinel calcolatore (finito e discreto).
• La posizione di memoria è caratterizzata daltipo, che è l’insieme da cui la variabile puòestrarre i suoi valori
3 reale è diverso da 3 intero
5
Variabile e Tipi base
• Ogni linguaggio ha dei tipi base perrappresentare informazione numerica e nonnumerica (caratteri, valori logici).
• Anche il linguaggio Java possiede dei tipibase che non sono tipi di dato astratto, dalmomento che sono predefiniti: non sonoconcetti nuovi, ma sono concetti fondamentalisui quali i concetti nuovi si baseranno.
Variabile e Tipi base
• Tipi base o primitivi (par. 2.1, 2.5)
• numeri interi byte, short, int, long
• numeri reali float, double
• caratteri char
• logici boolean
• Definizione di una variabile
• Sintassi:
nometipo nomevariabile;
nometipo nomevar1, nomevar2;
Variabile e Tipi base
• Esempi.
int n, numeroanni;
int dimensione;
double area, saldo;
boolean errore;
char lettera;
Variabile e Tipi base
• Le operazioni che possiamo fare su unavariabile sono:
• accesso : individuare la posizione di memoriaed estrarre il valore (lettura)
• assegnamento : individuare la posizione dimemoria e introdurre il valore (scrittura)
6
Variabile e Tipi base
• Nelle istruzioni di un programma, si ha:
• accesso: quando la variabile compare in unaistruzione e se ne utilizza il valore
• assegnamento: quando il valore le vieneattribuito:
• lettura del valore in una acquisizione di datidall’esterno
• in una istruzione di assegnazione (par. 2.2)
Assegnazione
Assegnazione
• Sintassi: (par. 2.2)
nomevariabile = espressione;
• Esempi.
//con riferimento alle dichiarazioni precedenti
n = 3+5;
area = 25.67;
saldo = 20000;
lettera = 'x';
lettera = x ; //Errore
Assegnazione
• Quando una variabile viene definita le vieneassociata un’area di memoria del tipoattribuito con la definizione:
int a;
double b;
a b
• Non si possono ridefinire le variabili.
7
Assegnazione
• Quando si esegue l’assegnazione, il valoreviene inserito nell’area corrispondente
a=3;
b=3;
a b
• Le due aree di memoria sono di tipo diverso ela sequenza di bit contenuta è diversa, anchecon uguale numero di bit.
3 3
Assegnazione
• Il simbolo per l’istruzione di assegnazione è=
• NON lo si deve confondere con un simbolomatematico di uguaglianza o di confronto.
• Il suo significato è:• il valore dell’espressione a destra del
simbolo = viene inserito nella locazionecorrispondente alla variabile che sta asinistra.
• Nel Pascal, il simbolo è := proprio per distinguerlodal simbolo di uguaglianza
Assegnazione
• Definizione e assegnazione in un’unicaistruzione: si può eseguire una assegnazioneanche in fase di definizione:
int k=25;
• La definizione di una variabile può essere fattain un qualunque punto del programma madeve essere sempre prima del suo uso.
Assegnazione
• Osserviamo queste due assegnazioni eosserviamo che la variabile a è a destra o asinistra del simbolo di assegnazione: ciòimplica un diverso significato per l’utilizzo dia:
a=5; //assegnamento su a (scrittura)
//a è a sinistra
k=a; //accesso per a (lettura)
//a è a destra
8
Assegnazione
• Osserviamo queste assegnazioni:a = 5; //assegnamento
a = a + 1; /*accesso eassegnamento*/
• Quanto vale a?
a = a + 1;
• In alcuni linguaggi di pseudocodifica, il simbolo perl’assegnazione è ←
5 6
Assegnazione
• Nei primi linguaggi le variabili avevano per iltipo una definizione di default. In Java unavariabile può essere usata solo se è stataprecedentemente definita, ossia se è statadichiarata con il suo tipo.
• Esempio.
int c=7;
c1=c; //Errore: c1 non è definita
Il compilatore segnala:
cannot find symbol
Assegnazione
• Diversamente da altri linguaggi, in Java unavariabile definita in un metodo può essereusata (accesso) solo se è stataprecedentemente inizializzata, ossia se ha unvalore.
• Esempio.
int c2;
a=c2; //Errore: c2 non ha valore
Il compilatore segnala:
variable c2 might not have been initialized
Assegnazione
• Nell’assegnazione si deve rispettare il tipo didato.
• Esempio.
int m;
double y = 23.75;
m = y; //Errore: m è intero
Il compilatore segnala:
possible loss of precision
9
Tipi base
Tipo Intero
• Si rappresenta un intervallo limitato, quindifinito, dei numeri interi (par. 4.1)
• Dominio: Z ⊂⊂⊂⊂ ℤℤℤℤ
• Il nome del dominio varia a seconda delnumero di bit destinati alla rappresentazione: sihanno nomi diversi e anche insiemi diversi
bit byte
byte 8 1
short 16 2
int 32 4
long 64 8
Tipo Intero
• Il tipo di rappresentazione su n bit è
• il primo è il bit del segno, i successivi n-1 sonoper il numero.
• Dal momento che ogni bit assume due valori(0,1), avendo a disposizione n-1 bit si possonorappresentare 2n-1 valori diversi.
1 n-1
Tipo Intero
• Per il segno del numero si assume:
0 per il positivo 1 per il negativo
• Il numero 0, che non ha segno, viene scrittocon il bit del segno 0 ed è rappresentato da unasequenza di bit tutti nulli.
• In tale modo, lo zero occupa un postonell’intervallo dei numeri positivi.
10
Tipo Intero
• Si vuole rappresentare la struttura algebricadell’insieme ℤℤℤℤ dei numeri interi:
(ℤℤℤℤ , +)
ℤℤℤℤ insieme + operazione
• esiste un elemento neutro, lo zero
• ogni numero ha un inverso, chiamato opposto
• L’insieme Z è dato dall’intervallo
[-2n-1, 2n-1-1]
Tipo Intero
• I vari domini per gli interi sono:
(Cap.4 Tabella 1)
• byte n=8 [-27, 27-1] = [-128, 127]
• short n=16 [-215, 215-1] = [-32768, 32767]
• int n=32 [-231, 231-1]
• long n=64 [-263, 263-1]
Tipo Intero
• Le costanti che caratterizzano il dominio sono gli estremi dell’intervallo: -2n-1 e 2n-1-1.
• In Java esistono dei nomi che rappresentanoquesti estremi dell’intervallo, e sono legati alnome del tipo:
• Byte.MIN_VALUE Byte.MAX_VALUE
• Short.MIN_VALUE Short. MAX_VALUE
• Integer.MIN_VALUE Integer. MAX_VALUE
• Long.MIN_VALUE Long. MAX_VALUE
Tipo Intero
• Le operazioni che possiamo fare sono:
+ somma
−−−− sottrazione
∗∗∗∗ prodotto
/ divisione (troncata)
% resto della divisione
• Operatori di confronto:
< > <= >= == !=
11
Tipo Intero
• La divisione tra interi è troncata.
• Esempi.
32 /64 e 1 /2 in aritmetica sono frazioniequivalenti
32 / 64 è 0 nell’aritmetica del calcolatore, perchéil risultato deve essere intero
Se si vuole ottenere il valore corretto, si devonousare costanti reali, indicate dal punto decimale :
32. /64 ⇒⇒⇒⇒ 0.5
Tipo Intero
• Analogamente con le variabili:
int a,b;
a/b è troncata
double c,d;
c/d è reale, con glieventuali decimali
• Si può volere una divisione troncata e averequoziente e resto:
7 /4 ⇒⇒⇒⇒ 1 7 %4 ⇒⇒⇒⇒ 3
Tipo Reale
Tipo reale
• Si rappresenta un intervallo limitato e finitodei numeri reali
• Dominio: R ⊂⊂⊂⊂ ℝℝℝℝ
• Il nome del dominio varia a seconda delnumero di bit destinati alla rappresentazione:si hanno nomi diversi e anche insiemi diversi
bit byte
float 32 4 semplice precisione
double 64 8 doppia precisione
12
Tipo reale
• I numeri reali vengono chiamati numeri invirgola mobile, floating point.
• Secondo la notazione anglosassone laseparazione tra parte intera e parte decimale èil punto (nella notazione italiana è la virgola).
• Quando si moltiplica o si divide un numero perla base 10, la posizione del punto si sposta:
224.35 = 0.22435∗103 = 2243.5 ∗10-1
virgola fissa
Tipo reale
• La notazione scientifica viene scritta in Javautilizzando la lettera E (esponente), cherappresenta il prodotto per la base 10, seguitada un numero intero
0.22435∗103 0.22435E3
2243.5 ∗10-1 2243.5E-1
• Per la parte intera non si usa la separazionecon il punto (in alto) per gruppi di cifre:
non 12 ˙̇̇̇354 ma 12354
Tipo reale
• I numeri reali sono rappresentati in modulo esegno: significa che un numero a e il suoopposto –a hanno di diverso solo il bit delsegno.
• Il primo bit è il bit del segno ed è:
0 per i positivi 1 per i negativi
• I rimanenti bit rappresentano la mantissa el’esponente:
3.25 = 0.325 ∗∗∗∗ 10 1
0.325 mantissa
1 esponente riferito alla base 10
Tipo Reale
• Il tipo di rappresentazione per i float è con
n = 32 bit
1 8 23
• il primo è il bit del segno, i successivi 8 sonoper l’esponente, i successivi 23 per lamantissa.
• Per i double, n = 64, la ripartizione è:
1(segno) 11(esponente) 52(mantissa)
13
Tipo Reale
• Si vuole rappresentare la struttura algebricadell’insieme ℝℝℝℝ dei numeri reali:
(ℝℝℝℝ, +, ∗)
ℝℝℝℝ insieme + ∗ operazioni
• esiste un elemento neutro per la somma, lo zero 0
• l’ inverso di a per la somma, opposto -a
• esiste un elemento neutro per il prodotto, l’uno 1
• l’ inverso di a≠≠≠≠0 per il prodotto, reciproco 1/a
Tipo Reale
• Oltre agli estremi dell’intervallo dirappresentazione (il massimo reale e il suoopposto), dobbiamo conoscere quale è il piùpiccolo reale positivo: il più piccolo realedistinguibile dallo 0.
• Avendo a disposizione un numero finito di cifre inumeri reali minori del minimo positivo, sonorappresentati dallo 0.
• Le cifre decimali a disposizione:
• float: 6 cifre semplice precisione
• double: 15 cifre doppia precisione
Tipo Reale
• Le costanti che caratterizzano il dominio sono il minimo positivo e il massimo reale.
• Anche per i reali le costanti significative sono rappresentate da dei nomi:
• Float.MIN_VALUE Float.MAX_VALUE
• Double.MIN_VALUE Double.MAX_VALUE
Tipo Reale
• I numeri reali della macchina rappresentanoesattamente se stessi e rappresentano inmaniera approssimata un intervallo di numerireali.
• I numeri reali della macchina hanno tutti unnumero finito di cifre decimali (6, 15),pertanto tutti i numeri con un numeromaggiore di cifre non possono essererappresentati esattamente.
14
Tipo Reale
• Esempio.
x = 0.123456
y = 0.123457 x, y ∈ R
Se abbiamo a disposizione 6 cifre decimali, x ey sono rappresentati esattamente, mentre
αααα = 0.123456 12345872
ββββ = 0.123457 24672178
saranno approssimati con x e yrispettivamente.
Tipo Reale
• I numeri reali sono approssimati perarrotondamento.
• Se la cifra che si trascura è 0 1 2 3 4 allora ilnumero viene approssimato al “realemacchina” più piccolo (per difetto); se la cifraè 5 6 7 8 9 il numero è approssimato al “realemacchina” più grande (per eccesso):
αααα’ = 0.123456 82345872
è approssimato da y.
Tipo Reale
• I numeri reali della macchina non sonodistribuiti in maniera uniforme sulla rettareale: sono più fitti verso il minimo reale e piùradi verso il massimo reale.
• Esempio.
a = 0.00123456 140212
b = 123456 140212.
a = 0.123456 140212 ∗ 10-2
b = 0.123456 140212 ∗ 1012
Tipo Reale
• I numeri a e b vengono approssimati con
a1 = 0.123456 * 10-2
b1 = 0.123456 * 1012
• La settima cifra di a e b (1) che si trascuraha una grandezza diversa:
10-9 in a e 105 in b.
• Il rappresentante a1 è “vicino” ad a mentre ilrappresentante b1 è “lontano” da b.
15
Tipo Reale
• I numeri reali della macchina sono pertanto deirappresentanti di intervalli, perchéapprossimano (per eccesso e per difetto)infiniti numeri reali (che “non ci stanno”):
• y è il rappresentante di
αααα’ αααα’ < y : eccesso
ββββ ββββ > y : difetto
• E se ci servissero tutte le cifre di αααα’ e di ββββ ?
Tipo Reale
• Nell’esempio visto abbiamo utilizzato 6 cifredecimali e quindi la semplice precisione; seabbiamo bisogno di più cifre utilizziamo ladoppia precisione: definiamo le variabili con iltipo double, con il quale si rappresentano 15decimali.
• In Java useremo sempre il tipo double per i realie il tipo int per gli interi.
Tipo Reale
• L’insieme dei numeri del tipo double contienel’insieme dei numeri di tipo float:
• I double
• rappresentano un insieme più grande:
• maxfloat~1038 maxdouble ~ 10308
• i rappresentanti sono più fitti
• tra due rappresentanti x e y (float) ci sono “molti,ma in quantità finita”, numeri esatti(rappresentanti) in doppia precisione
Tipo Reale
• Le operazioni che possiamo fare sono:
∗∗∗∗ prodotto
/ divisione
+ somma
−−−− sottrazione
• Operatori di confronto:
< > <= >= == !=
16
Operatori e precedenza
• Il simbolo della divisione è / (par. 4.4)
no, invece (a+b) / 2
• Priorità degli operatori aritmetici:
(Appendice E)
• come nell’algebra, moltiplicazione e divisionehanno più alta priorità rispetto alla addizione esottrazione: nell’esempio precedente le parentesisono obbligatorie.
2
ba +
Operatori e precedenza
• Le due scritture producono diversi risultati:
1. (a+b) / 2 2. a+b / 2
1. prima si effettua la somma (a+b) e poi la divisione
2. prima si effettua la divisione b/2 e poi la somma
• A parità di priorità le operazioni vengonoeffettuate da sinistra verso destra:
3. a∗∗∗∗b/c = (a∗∗∗∗b)/c
Interi o reali?
• Perché ci sono due tipi di numeri: interi e ireali?
• I reali sono necessari per rappresentare valoricon i decimali: lira (intero), euro (reale).
• Se vogliamo avere una divisione non troncatadobbiamo usare i numeri reali.
• Gli interi sono “più efficienti”: occupano menospazio di memoria, le operazioni tra interi sonopiù veloci, e non producono errori diarrotondamento (maxint ha 10 cifre).
Tipo Carattere
17
Tipo Carattere
• Il nome del tipo è
char 2 byte 16 bit
• L’insieme dei caratteri è UNICODE
• Esempi.
char s = '0';
char x = 'a';
• Operatori di confronto:
< > <= >= == !=
Tipo Logico
Tipo Logico
• Il nome del tipo è
boolean 1 bit
• L’insieme è BBBB = {false, true}
false 0 true 1
• Operatori logici
&& (and) || (or) ! (not)
Esercizio
• Problema. Calcolare la somma dei reciprocidei primi 10 numeri naturali.
• Soluzione.
• Dobbiamo calcolare la somma
1 + 1 /2 + 1/3 + ….. + 1/10
• Ricopiando questa somma in una istruzione,otterremo un risultato corretto?
Attenzione: 1 /2 = 0 mentre 1. /2 = 0.5
18
Tipo di Dato Astratto
Tipo di Dato Astratto
• I tipi base non sono TDA: sono tipi predefintiche l’utente può usare ma non modificare enon può aggiungerne altri.
• Un TDA deve poter rappresentare un nuovoconcetto e si basa su concetti già esistenti.
• Nei linguaggi orientati agli oggetti si possonodefinire e realizzare dei nuovi concetti.
Insiemi numerici
• L’invenzione dei numeri risale a molti secolifa:
• Naturali ℕℕℕℕ = {1, 2, 3,…}
• Interi ℤℤℤℤ = {…., -3, -2, -1, 0, 1, 2, 3 ….}
• Razionali ℚℚℚℚ ={ a/b | a,b interi e b ≠ 0}
• Irrazionali es. π , e ,
• Reali ℝℝℝℝ visualizzati sulla retta
• Complessi ℂℂℂℂ visualizzati sul pianox2 +1 = 0 ha soluzione?
• Java non possiede il tipo di dato complex.
Tipo di Dato Astratto
• Vogliamo definire un nuovo concetto:Numero Complesso.
• Definizione.
• Indichiamo con ℂℂℂℂ l’insieme dei numericomplessi: ℂℂℂℂ = {(a,b) | a, b ∈ ℝ }
• Si vuole rappresentare la struttura algebricadell’insieme ℂℂℂℂ dei numeri complessi:
(ℂℂℂℂ , +, ∗)
ℂℂℂℂ insieme + ∗ operazioni
19
Tipo di Dato Astratto
• Un numero complesso è definito come coppiadi reali (i numeri reali sono un concetto giàesistente):
z = (a, b)
• La forma algebrica di z ∈ ℂℂℂℂ è
z = a + i b
a parte reale
b parte immaginaria
i = (0, 1) unità immaginaria
Tipo di Dato Astratto
• Per costruire il nuovo concetto dobbiamodescrivere:
• la sua forma: quali sono i dati (campi)
• le sue proprietà: quali operazioni possiamofare (metodi)
• Il nuovo concetto viene descritto all’interno diuna classe:
class NuovoConcetto {
<descrizione della sua forma>
<descrizione delle sue proprietà>
} //fine classe
Tipo di Dato Astratto
• Per il TDA NumeroComplesso avremo:
class NumeroComplesso{//forma o campi
double parteRe;double parteIm;
//proprietà o metodi
/* somma, prodotto, sottrazione,divisione, ….*/
}//fine classe NumeroComplesso
Tipo di Dato Astratto• La classe NumeroComplesso dovrà sviluppare
gli algoritmi (metodi) che rappresentano leoperazioni con le quali si possono usare oggettidi tipo NumeroComplesso: somma, prodotto, …
• Ogni oggetto di tipo NumeroComplesso saràuna realizzazione del nuovo concetto e potràessere utilizzato tramite i suoi metodi.
• Un utente della nostra classe NumeroComplessopotrà utilizzare il metodo somma senzaconoscere i dettagli descritti nella classe, cosìcome noi eseguiamo la somma di due numeriinteri senza sapere come ciò avviene realmente.
20
Oggetti, classi, metodi
Oggetti, classi, metodi
• Un oggetto è un’entità che si può usare
invocando (chiamando) i metodi della sua
classe. (par. 2.3)
• Un metodo è una sequenza di istruzioni che
può accedere ai dati dell’oggetto.
• I metodi della classe esprimono la funzionalità
dell’oggetto e la loro realizzazione è nascosta
all’utente.
Oggetti, classi, metodi
• Il concetto NuovoConcetto che si va adescrivere nella classe è solo un “prototipo”:ossia non è funzionante.
• Per sapere se il nostro concetto è realizzatocorrettamente è necessario provarlo.
• Si dovrà pertanto costruire un programma,con un metodo main, che costruisce l’oggetto everifica la correttezza dei suoi metodi.
Oggetti, classi, metodi
• Pertanto per ogni TDA costruiremo una“classe di collaudo”
class ProvaNuovoConcetto{//classe di prova
//per la classe NuovoConcetto
//metodo main{
/* istruzioni per creare e utilizzare
un oggetto di tipo NuovoConcetto */
}//fine main
}//fine classe ProvaNuovoConcetto
21
Tipo di dati String
Tipo di dati String
• Una stringa è una sequenza di caratteri.
• Diversamente dai numeri, in Java le stringhesono oggetti. (par. 4.6)
• Una costante (letterale) stringa si scriveracchiusa tra virgolette:
"benvenuto"
e le virgolette non fanno parte della stringa.
• Letterale o costante letterale: sequenza di simboli cherappresenta un valore di un certo tipo di dato.
Tipo di dati String
• Analogamente agli altri tipi di dato definiamouna stringa e le assegniamo un valore.
• Il tipo di dato è rappresentato dalla classeString:
String nome; //definizione
nome = "Maria"; //assegnazione
• Le stringhe hanno una sintassi diversa dagli altri oggetti.
Tipo di dati String
• String è il nome di una classe: inizia con lamaiuscola.
• Una variabile di tipo String può quindi essereutilizzata richiamando i metodi della suaclasse.
• La lunghezza di una stringa è il numero dicaratteri presenti in essa (senza contare levirgolette).
• Ogni carattere ha una sua posizione, o indice,all’interno della stringa.
22
Tipo di dati String
• La posizione dei caratteri nelle stringhe vienenumerata a partire da 0 (deriva da C e C++).
• La posizione dell’ultimo carattere di unastringa corrisponde alla lunghezza della stringameno 1.• la lettera o di Filippo è in posizione 6 = 7-1
0 1 2 3 4 5 6
F|i|l|i|p|p|o
Tipo di dati String
• Per sapere di quanti caratteri è composta unastringa, utilizziamo il metodo length.
(par. 2.3)
• Come si invoca un metodo (che agisce suoggetti)?
nomeoggetto.nomemetodo(parametri);
String saluto = "Ciao";
nome = "Filippo";
Tipo di dati String
• Il metodo length non ha parametri erestituisce un valore di tipo int. Pertantomemorizziamo questo valore in una variabiledi tipo int:
int n1 = saluto.length(); //n1=4
int n2 = nome.length(); //n2=7
//visualizziamo i valori di n1 e n2
System.out.println("n1= " + n1 +
" n2= " + n2);
Tipo di dati String
• Concatenazione tra stringhe.
• Le stringhe si possono concatenare utilizzando l’operatore +
String s1 = "Ciao";
String s2 = "mondo";
String s3 = s1 + s2;
• Il valore memorizzato in s3 è "Ciaomondo"
• Se si voglio gli spazi, questi devono essereinseriti esplicitamente:
String s4 = s1 + " " + s2
23
Tipo di dati String
• Se una delle espressioni a destra o sinistradell’operatore + è una stringa, l’altraespressione viene convertita a stringa e si ha laconcatenazione.
• Questa concatenazione è utile nelle stampe:
System.out.print("area = ");
System.out.println(25.6);
System.out.println("area = " + 25.6);
Tipo di dati String
• Una stringa di lunghezza zero, che noncontiene caratteri, si chiama stringa vuota e siindica con due caratteri virgolette consecutivi,senza spazi interposti:
String vuota = "";
• Poiché il metodo length restituisce un valorenumerico, tale valore di ritorno può esserepassato come parametro al metodo println:
System.out.println(vuota.length());
//stampa 0
Tipo di dati String
• Vogliamo estrarre una sottostringa da unastringa data, utilizziamo il metodo substring:
oggettostringa.substring(n1, n2);
• il primo parametro di substring è la posizionedel primo carattere che si vuole estrarre;
• il secondo parametro è la posizione successivaall’ultimo carattere che si vuole estrarre (ilprimo che non si vuole).
Tipo di dati String
• Esempio.
• Il metodo restituisce una nuova stringa.
• La differenza tra i due parametri di substringcorrisponde alla lunghezza della sottostringaestratta:• la lunghezza di subs1 è 4 = 4-0
String saluto1 = "Ciao mondo!";
String subs1 = saluto1.substring(0,4);
// subs1 contiene "Ciao"
24
Tipo di dati String
String subs2 = saluto1.substring(5,6);
// subs2 contiene "m" di lunghezza 1
• Attenzione: "m" è una stringa non un carattere.
• Il metodo substring può essere anche invocatocon un solo parametro che indica il primo daestrarre; si estraggono i rimanenti fino alla fine:
String subs3 = saluto1.substring(7);
// subs3 contiene "ndo!"
Tipo di dati String
• Metodo replace: ha due parametri di tipostringa e restituisce una stringa dove è statosostituito il primo con il secondo.
• Metodi toUpperCase e toLowerCase:convertono tutto in maiuscolo e in minuscolorispettivamente.
String nome1 = "Maria";String nome2 = nome1.replace("i","t");//nome2 è "Marta"
Tipo di dati String
• I metodi visti non modificano la stringa con laquale si invoca il metodo, ma restituisconouna nuova stringa (parametro di ritorno).
• Nessun metodo della classe String modifical’oggetto con cui viene invocato.
• Per tale motivo si dice che gli oggetti di tipoString sono oggetti immutabili.
Tipo di dati String
• Se si fornisce un parametro errato a substring,il programma viene compilato correttamente, maviene generato un errore in esecuzione.
• Esempio.public class Errore{
public static void main
(String[] arg){
String nome = """"Filippo"""";
String nome1 =
nome.substring(5,10);
System.out.println(nome1);}
}
25
Tipo di dati String
• Questo errore non viene segnalato dalcompilatore, ma si ha un errore durantel’esecuzione del programma, che siinterrompe segnalando:
StringIndexOutOfBoundsException
• Si tratta di un errore logico, di cui però ci siaccorge dato che l’esecuzione viene interrotta.
Sequenze di “escape”
• Come possiamo stampare una stringa che contienedelle virgolette?
• Il compilatore identifica le seconde virgolettecome la fine della prima stringa "Ciao, ", ma poinon capisce il significato della parola Mondo.
• Si deve inserire una barra rovesciata \ (backslash)prima delle virgolette all’interno della stringa
System.out.println("Ciao, "Mondo"!"); //ERRATO
Ciao, "Mondo"!
System.out.println ("Ciao, \"Mondo\"!");
Sequenze di “escape”
• Il carattere backslash all’interno di una stringa nonrappresenta se stesso, ma si usa per codificare altricaratteri: sequenza di escape (di uscita).
• Per inserire veramente un carattere backslash in unastringa, si usa la sequenza di escape \\
• Per scrivere parole italiane con lettere accentate senzaavere a disposizione una tastiera italiana, si inserisce\u seguito dalla codifica Unicode del carattere.
• Esempio. Stampare la parola Perché
System.out.println("Perch\u00E9");
Esercizio
• Dato un gruppo di tre parole, utilizzando imetodi visiti, costruirne l’acronimo.
• Esempio.
• Date le parole random access memory,costruire l’acronimo RAM.
• Soluzione.
• Dobbiamo estrarre da ogni parola la sottostringainiziale di lunghezza 1, concatenarle tra loro etrasformarle poi in maiuscolo.
26
Esercizio
public class Acronimo{//costruzione acronimo
public static void main(String[] arg){
String parola1 = "random";String parola2 = "access";
String parola3 = "memory";
// estrai le iniziali
String tmp = parola1.substring(0, 1)
+ parola2.substring(0, 1)
+ parola3.substring(0, 1);
// converti in maiuscolo
String acro = tmp.toUpperCase();
System.out.println("L'acronimo e' " + acro);
}//fine main
}//fine main
Recommended