Rappresentazione delle informazioni Rappresentazione delle informazioni L informatica si occupa di rappresentare ed elaborare informazioni diverse: numeri caratteri audio immagini video I caratteri: ASCII standard Rappresentazione dei caratteri I simboli o caratteri appartenenti ad un alfabeto vengono codificati (cioè rappresentati ) mediante sequenze di bit: una diversa sequenza per ciascun diverso carattere. Uno dei codici più noti e usati è il codice ASCII (American Standard Code for Information Interchange), usa una sequenza di 7 bit per ciascun carattere: ci sono 128 (=2 7 ) sequenze diverse, utilizzate anche per lettere, segni di punteggiatura, cifre decimali, ecc. 1
I caratteri: ASCII esteso Dato che l unità elementare di informazione nei calcolatori è il byte (= 8 bit), si è passati ad usare, quasi sempre, il codice ASCII esteso, che usa una sequenza di 8 bit per ciascun carattere degli alfabeti occidentali: ci sono 256 (=2 8 ) sequenze diverse, utilizzate anche per vocali accentate e altre lettere speciali (es. ß tedesca, ç francese) le sequenze con la prima cifra uguale a zero coincidono 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 in ASCII 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 da 0 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 e minuscoli) da 33 a 47, da 58 a 64, da 91 a 96, da 123 a 127 caratteri di interpunzione e simboli speciali. I caratteri: Unicode Per rappresentare i segni grafici utilizzati da tutti gli alfabeti del mondo servono molti più simboli diversi codifica Unicode http://www.unicode.org usa una sequenza di 16 bit per ciascun segno grafico: ci sono 65536 (= 2 16 ) sequenze diverse le sequenze con le prime otto cifre uguali a zero coincidono con il codice ASCII esteso. 2
I caratteri (codice Unicode) Rappresentazione delle informazioni Il linguaggio Java utilizza Unicode come insieme di simboli; in ogni linguaggio di programmazione i simboli servono per costruire le unità lessicali. Ogni informazione che vogliamo rappresentare è caratterizzata da un valore e da un suo tipo (tipo di dato). Non sempre possiamo o vogliamo rappresentare direttamente il valore, ma vogliamo poterci riferire ad esso tramite un nome. Astrazione Astrazione L evoluzione dei linguaggi di programmazione (basso ad alto livello) ha portato all introduzione del concetto di variabile: la locazione di memoria viene nascosta all utente, che vi accede tramite il nome della variabile. Le operazioni che si possono fare sulla variabile dipendono dal suo tipo: l utente non sa come avviene realmente la somma tra due numeri interi (reali) o il loro confronto. Si ha una astrazione sul dato e sul suo tipo. 3
Astrazione L evoluzione successiva dei linguaggi permetterà all utente di inventare dei nuovi tipi 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 sul dominio 4. possono esserci costanti che lo caratterizzano. Variabile e Tipi base Variabile e Tipi base Nei corsi di matematica quando scriviamo x R e diciamo x è una variabile reale intendiamo dire che x è un nome che indica un elemento generico dell insieme R dei numeri reali. Nei corsi di informatica con x è una variabile reale intendiamo dire che x è un nome che indica una posizione di memoria che conterrà un elemento generico di R (con R R R). Variabile e Tipi base R insieme dei numeri reali (infinito e continuo). R insieme dei numeri reali rappresentabili nel calcolatore (finito e discreto). La posizione di memoria è caratterizzata dal tipo, che è l insieme da cui la variabile può estrarre i suoi valori 3 reale è diverso da 3 intero 4
Variabile e Tipi base Ogni linguaggio ha dei tipi base per rappresentare informazione numerica e non numerica (caratteri, valori logici). Anche il linguaggio Java possiede dei tipi base che non sono tipi di dato astratto, dal momento che sono predefiniti: non sono concetti nuovi, ma sono concetti fondamentali sui 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; Esempi. Variabile e Tipi base int n, numeroanni; int dimensione; double area, saldo; boolean errore; char lettera; Variabile e Tipi base Le operazioni che possiamo fare su una variabile sono: accesso : individuare la posizione di memoria ed estrarre il valore (lettura) assegnamento : individuare la posizione di memoria e introdurre il valore (scrittura) 5
Variabile e Tipi base Nelle istruzioni di un programma, si ha: accesso: quando la variabile compare in una istruzione e se ne utilizza il valore assegnamento: quando il valore le viene attribuito: lettura del valore in una acquisizione di dati dall 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 viene associata un area di memoria del tipo attribuito con la definizione: int a; double b; a b Non si possono ridefinire le variabili. 6
Assegnazione Quando si esegue l assegnazione, il valore viene inserito nell area corrispondente a=3; b=3; 3 3 a Le due aree di memoria sono di tipo diverso e la sequenza di bit contenuta è diversa, anche con uguale numero di bit. b Assegnazione Il simbolo per l istruzione di assegnazione è = NON lo si deve confondere con un simbolo matematico di uguaglianza o di confronto. Il suo significato è: il valore dell espressione a destra del simbolo = viene inserito nella locazione corrispondente alla variabile che sta a sinistra. Nel Pascal, il simbolo è := proprio per distinguerlo dal simbolo di uguaglianza Assegnazione Definizione e assegnazione in un unica istruzione: si può eseguire una assegnazione anche in fase di definizione: int k=25; La definizione di una variabile può essere fatta in un qualunque punto del programma ma deve essere sempre prima del suo uso. Assegnazione Osserviamo queste due assegnazioni e osserviamo che la variabile a è a destra o a sinistra del simbolo di assegnazione: ciò implica un diverso significato per l utilizzo di a: a=5; //assegnamento su a (scrittura) //a è a sinistra k=a; //accesso per a //a è a destra (lettura) 7
Assegnazione Osserviamo queste assegnazioni: a = 5; //assegnamento a = a + 1; /*accesso e assegnamento*/ Quanto valea? 5 a = a + 1; 6 In alcuni linguaggi di pseudocodifica, il simbolo per l assegnazione è Assegnazione Nei primi linguaggi le variabili avevano per il tipo una definizione di default. In Java una variabile può essere usata solo se è stata precedentemente definita, ossia se è stata dichiarata 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 una variabile definita in un metodo può essere usata (accesso) solo se è stata precedentemente inizializzata, ossia se ha un valore. 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 di dato. Esempio. int m; double y = 23.75; m = y; //Errore: m è intero Il compilatore segnala: possible loss of precision 8
Tipo Intero Tipi base Si rappresenta un intervallo limitato, quindi finito, dei numeri interi (par. 4.1) Dominio: Z Z Il nome del dominio varia a seconda del numero di bit destinati alla rappresentazione: si hanno 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 è 1 n-1 il primo è il bit del segno, i successivi n-1 sono per il numero. Dal momento che ogni bit assume due valori (0,1), avendo a disposizione n-1 bit si possono rappresentare 2 n-1 valori diversi. 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 scritto con il bit del segno 0 ed è rappresentato da una sequenza di bit tutti nulli. In tale modo, lo zero occupa un posto nell intervallo dei numeri positivi. 9
Tipo Intero Si vuole rappresentare la struttura algebrica dell insieme Z dei numeri interi: (Z, +) Z insieme + operazione esiste un elemento neutro, lo zero ogni numero ha un inverso, chiamato opposto L insieme Z è dato dall intervallo [-2 n-1, 2 n-1-1] Tipo Intero I vari domini per gli interi sono: (Cap.4 Tabella 1) byte n=8 [-2 7, 2 7-1] = [-128, 127] short n=16 [-2 15, 2 15-1] = [-32768, 32767] int n=32 [-2 31, 2 31-1] long n=64 [-2 63, 2 63-1] Tipo Intero Le costanti che caratterizzano il dominio sono gli estremi dell intervallo: -2 n-1 e 2 n-1-1. In Java esistono dei nomi che rappresentano questi estremi dell intervallo, e sono legati al nome 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: < > <= >= ==!= 10
Tipo Intero La divisione tra interi è troncata. Esempi. 32 /64 e 1 /2 in aritmetica sono frazioni equivalenti 32 / 64 è 0 nell aritmetica del calcolatore, perché il risultato deve essere intero Se si vuole ottenere il valore corretto, si devono usare 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 gli eventuali decimali Si può volere una divisione troncata e avere quoziente e resto: 7 /4 1 7 %4 3 Tipo reale Tipo Reale Si rappresenta un intervallo limitato e finito dei numeri reali Dominio: R R Il nome del dominio varia a seconda del numero 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 11
Tipo reale I numeri reali vengono chiamati numeri in virgola mobile, floating point. Secondo la notazione anglosassone la separazione tra parte intera e parte decimale è il punto (nella notazione italiana è la virgola). Quando si moltiplica o si divide un numero per la base 10, la posizione del punto si sposta: 224.35 = 0.22435 10 3 = 2243.5 10-1 virgola fissa Tipo reale La notazione scientifica viene scritta in Java utilizzando la lettera E (esponente), che rappresenta il prodotto per la base 10, seguita da un numero intero 0.22435 10 3 0.22435E3 2243.5 10-1 2243.5E-1 Per la parte intera non si usa la separazione con il punto (in alto) per gruppi di cifre: non 12 354 ma 12354 Tipo reale I numeri reali sono rappresentati in modulo e segno: significa che un numero a e il suo opposto a hanno di diverso solo il bit del segno. Il primo bit è il bit del segno ed è: 0 per i positivi 1 per i negativi I rimanenti bit rappresentano la mantissa e l 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 sono per l esponente, i successivi 23 per la mantissa. Per i double, n = 64, la ripartizione è: 1(segno) 11(esponente) 52(mantissa) 12
Tipo Reale Si vuole rappresentare la struttura algebrica dell insieme R dei numeri reali: (R, +, ) R 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 di rappresentazione (il massimo reale e il suo opposto), dobbiamo conoscere quale è il più piccolo reale positivo: il più piccolo reale distinguibile dallo 0. Avendo a disposizione un numero finito di cifre i numeri reali minori del minimo positivo, sono rappresentati 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 Double.MIN_VALUE Float.MAX_VALUE Double.MAX_VALUE Tipo Reale I numeri reali della macchina rappresentano esattamente se stessi e rappresentano in maniera approssimata un intervallo di numeri reali. I numeri reali della macchina hanno tutti un numero finito di cifre decimali (6, 15), pertanto tutti i numeri con un numero maggiore di cifre non possono essere rappresentati esattamente. 13
Tipo Reale Esempio. x = 0.123456 y = 0.123457 x, y R Se abbiamo a disposizione 6 cifre decimali, x e y sono rappresentati esattamente, mentre α = 0.123456 12345872 β = 0.123457 24672178 saranno approssimati con x e y rispettivamente. Tipo Reale I numeri reali sono approssimati per arrotondamento. Se la cifra che si trascura è 0 1 2 3 4 allora il numero viene approssimato al reale macchina più piccolo (per difetto); se la cifra è 5 6 7 8 9 il numero è approssimato al reale macchina più grande (per eccesso): α = 0.123456 82345872 è approssimato da y. Tipo Reale I numeri reali della macchina non sono distribuiti in maniera uniforme sulla retta reale: 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 10 12 Tipo Reale I numeri a e b vengono approssimati con a 1 = 0.123456 * 10-2 b 1 = 0.123456 * 10 12 La settima cifra di a e b (1) che si trascura ha una grandezza diversa: 10-9 in a e 10 5 in b. Il rappresentante a 1 è vicino ad a mentre il rappresentante b 1 è lontano da b. 14
Tipo Reale I numeri reali della macchina sono pertanto dei rappresentanti 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 cifre decimali e quindi la semplice precisione; se abbiamo bisogno di più cifre utilizziamo la doppia precisione: definiamo le variabili con il tipo double, con il quale si rappresentano 15 decimali. In Java useremo sempre il tipo double per i reali e il tipo int per gli interi. Tipo Reale L insieme dei numeri del tipo double contiene l insieme dei numeri di tipo float: I double rappresentano un insieme più grande: maxfloat~10 38 maxdouble~10 308 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: < > <= >= ==!= 15
Operatori e precedenza Il simbolo della divisione è / (par. 4.4) a + b 2 no, invece (a+b) / 2 Priorità degli operatori aritmetici: (Appendice E) come nell algebra, moltiplicazione e divisione hanno più alta priorità rispetto alla addizione e sottrazione: nell esempio precedente le parentesi sono obbligatorie. 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 vengono effettuate da sinistra verso destra: 3. a b/c = (a b)/c Interi o reali? Perché ci sono due tipi di numeri: interi e i reali? I reali sono necessari per rappresentare valori con i decimali: lira (intero), euro (reale). Se vogliamo avere una divisione non troncata dobbiamo usare i numeri reali. Gli interi sono più efficienti : occupano meno spazio di memoria, le operazioni tra interi sono più veloci, e non producono errori di arrotondamento (maxint ha 10 cifre). Tipo Carattere 16
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 Il nome del tipo è boolean L insieme è Tipo Logico 1 bit B = {false, true} false 0 true 1 Operatori logici && (and) (or)! (not) Esercizio Problema. Calcolare la somma dei reciproci dei 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 17
Tipo di Dato Astratto Tipo di Dato Astratto I tipi base non sono TDA: sono tipi predefinti che l utente può usare ma non modificare e non può aggiungerne altri. Un TDA deve poter rappresentare un nuovo concetto e si basa su concetti già esistenti. Nei linguaggi orientati agli oggetti si possono definire e realizzare dei nuovi concetti. Insiemi numerici L invenzione dei numeri risale a molti secoli fa: Naturali N = {1, 2, 3, } Interi Z = {., -3, -2, -1, 0, 1, 2, 3.} Razionali Q ={ a/b a,b interi e b 0} Irrazionali es. π, e, Reali R visualizzati sulla retta Complessi C visualizzati sul piano x 2 +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 C l insieme dei numeri complessi: C = {(a,b) a, b R } Si vuole rappresentare la struttura algebrica dell insieme C dei numeri complessi: (C, +, ) C insieme + operazioni 18
Tipo di Dato Astratto Un numero complesso è definito come coppia di reali (i numeri reali sono un concetto già esistente): z = (a, b) La forma algebrica di z C è z = a + i b a parte reale b parte immaginaria i = (0, 1) unità immaginaria Tipo di Dato Astratto Per costruire il nuovo concetto dobbiamo descrivere: la sua forma: quali sono i dati (campi) le sue proprietà: quali operazioni possiamo fare (metodi) Il nuovo concetto viene descritto all interno di una 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 le operazioni con le quali si possono usare oggetti di 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 NumeroComplesso potrà utilizzare il metodo somma senza conoscere i dettagli descritti nella classe, così come noi eseguiamo la somma di due numeri interi senza sapere come ciò avviene realmente. 19
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 a descrivere nella classe è solo un prototipo : ossia non è funzionante. Per sapere se il nostro concetto è realizzato correttamente è necessario provarlo. Si dovrà pertanto costruire un programma, con un metodo main, che costruisce l oggetto e verifica 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 //metodomain{ /* istruzioni per creare e utilizzare un oggetto di tipo NuovoConcetto */ }//fine main }//fine classe ProvaNuovoConcetto 20
Tipo di dati String Tipo di dati String Una stringa è una sequenza di caratteri. Diversamente dai numeri, in Java le stringhe sono oggetti. (par. 4.6) Una costante (letterale) stringa si scrive racchiusa tra virgolette: "benvenuto" e le virgolette non fanno parte della stringa. Letterale o costante letterale: sequenza di simboli che rappresenta un valore di un certo tipo di dato. Tipo di dati String Analogamente agli altri tipi di dato definiamo una stringa e le assegniamo un valore. Il tipo di dato è rappresentato dalla classe String: 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 la maiuscola. Una variabile di tipo String può quindi essere utilizzata richiamando i metodi della sua classe. La lunghezza di una stringa è il numero di caratteri presenti in essa (senza contare le virgolette). Ogni carattere ha una sua posizione, o indice, all interno della stringa. 21
Tipo di dati String La posizione dei caratteri nelle stringhe viene numerata a partire da 0 (deriva da C e C++). F i l i p p o 0 1 2 3 4 5 6 La posizione dell ultimo carattere di una stringa corrisponde alla lunghezza della stringa meno 1. la lettera o di Filippo è in posizione 6 = 7-1 Tipo di dati String Per sapere di quanti caratteri è composta una stringa, utilizziamo il metodo length. (par. 2.3) Come si invoca un metodo (che agisce su oggetti)? nomeoggetto.nomemetodo(parametri); String saluto = "Ciao"; nome = "Filippo"; Tipo di dati String Il metodo length non ha parametri e restituisce un valore di tipo int. Pertanto memorizziamo questo valore in una variabile di 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 essere inseriti esplicitamente: String s4 = s1 + " " + s2 22
Tipo di dati String Se una delle espressioni a destra o sinistra dell operatore + è una stringa, l altra espressione viene convertita a stringa e si ha la concatenazione. 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 non contiene caratteri, si chiama stringa vuota e si indica con due caratteri virgolette consecutivi, senza spazi interposti: String vuota = ""; Poiché il metodo length restituisce un valore numerico, tale valore di ritorno può essere passato come parametro al metodoprintln: System.out.println(vuota.length()); //stampa 0 Tipo di dati String Vogliamo estrarre una sottostringa da una stringa data, utilizziamo il metodo substring: oggettostringa.substring(n1, n2); il primo parametro di substring è la posizione del primo carattere che si vuole estrarre; il secondo parametro è la posizione successiva all ultimo carattere che si vuole estrarre (il primo che non si vuole). Esempio. Tipo di dati String String saluto1 = "Ciao mondo!"; String subs1 = saluto1.substring(0,4); // subs1 contiene "Ciao" Il metodo restituisce una nuova stringa. La differenza tra i due parametri di substring corrisponde alla lunghezza della sottostringa estratta: la lunghezza disubs1 è 4 = 4-0 23
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 invocato con un solo parametro che indica il primo da estrarre; 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 tipo stringa e restituisce una stringa dove è stato sostituito il primo con il secondo. String nome1 = "Maria"; String nome2 = nome1.replace("i","t"); //nome2 è "Marta" Metodi touppercase e tolowercase: convertono tutto in maiuscolo e in minuscolo rispettivamente. Tipo di dati String I metodi visti non modificano la stringa con la quale si invoca il metodo, ma restituiscono una nuova stringa (parametro di ritorno). Nessun metodo della classe String modifica l oggetto con cui viene invocato. Per tale motivo si dice che gli oggetti di tipo String sono oggetti immutabili. Tipo di dati String Se si fornisce un parametro errato a substring, il programma viene compilato correttamente, ma viene 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);} } 24
Tipo di dati String Questo errore non viene segnalato dal compilatore, ma si ha un errore durante l esecuzione del programma, che si interrompe segnalando: StringIndexOutOfBoundsException Si tratta di un errore logico, di cui però ci si accorge dato che l esecuzione viene interrotta. Sequenze di escape Come possiamo stampare una stringa che contiene delle virgolette? Ciao, "Mondo"! System.out.println("Ciao, "Mondo"!"); //ERRATO Il compilatore identifica le seconde virgolette come la fine della prima stringa "Ciao, ", ma poi non 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\"!"); Sequenze di escape Il carattere backslash all interno di una stringa non rappresenta se stesso, ma si usa per codificare altri caratteri: sequenza di escape (di uscita). Per inserire veramente un carattere backslash in una stringa, si usa la sequenza di escape \\ Per scrivere parole italiane con lettere accentate senza avere 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 i metodi visiti, costruirne l acronimo. Esempio. Date le parole random access memory, costruire l acronimo RAM. Soluzione. Dobbiamo estrarre da ogni parola la sottostringa iniziale di lunghezza 1, concatenarle tra loro e trasformarle poi in maiuscolo. 25
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 26