Selezione Stringhe
2 Stringhe Tipo di dato che rappresenta un insieme ordinato di caratteri. String saluto = "Ciao"; String saluto2 = new String("Ciao"); Operazioni: Concatenazione: String messaggio = saluto + " a tutti!"; Calcolo della lunghezza: int lunghezza = saluto.length(); Indice della prima occorrenza di un carattere (o di una sottostringa): int posizione = messaggio.indexof("a tutti"); Indice dell ultima occorrenza di un carattere: int ultimaposizione = messaggio.lastindexof("a tutti"); Estrazione dell'i-esimo carattere: char primalettera = messaggio.charat(0);
3 Attenzione a: Posizione dei caratteri nella stringa: la posizione si conta a partire da 0 e non da 1 char c = "Ciao".charAt(1); Il carattere c vale 'i' e non 'C'! Confronto tra stringhe: le stringhe non sono tipi di dati primitivi come i numeri interi o reali l'operatore == non funziona per verificare l'uguaglianza di due stringhe String s1 = "ciao"; String s2 = new String("ciao"); System.out.println(s1 == s2);
4 Stringhe vs Tipi primitivi In memoria: Nel caso delle stringhe, l'operatore == verifica che le variabili facciano riferimento alla stessa area di memoria non dà sempre il risultato corretto.
5 Confronto tra stringhe Metodo compareto int risultato = s1.compareto(s2); risultato è un intero che vale 0 se le due stringhe sono uguali, è negativo se s1 viene prima (in ordine alfabetico) di s2, positivo altrimenti. Metodo equals boolean risultato = s1.equals(s2); risultato vale true se il contenuto delle due stringhe è uguale, false altrimenti. Attenzione: in java "Ciao" è diverso da "ciao" Metodo equalsignorecase boolean risultato = s1.equalsignorecase(s2); risultato vale true se il contenuto delle due stringhe è uguale (ignorando la differenza tra maiuscole e minuscole).
6 Esempio Scrivere un programma che: Chieda all'utente di inserire nome e cognome. Stampi a video le iniziali dell'utente. Calcoli e stampi le lunghezze del nome e del cognome Indichi quale, tra nome e cognome, è più lungo Stampi una possibile email dell'utente, nella forma nome.cognome@studio.unibo.it
7 Altre operazioni sulle stringhe substring(int x, int y) estrae la sottostringa composta dai caratteri dalla posizione x alla posizione y (esclusa): String sottostringa = s1.substring(1,2); startswith(string s) verifica che la stringa cominci con la stringa s: boolean inizio = s1.startswith("ci"); endswith(string s) verifica che la stringa finisca con la stringa s: boolean fine = s1.endswith("iao");
8 Lettura di stringhe Metodo next() della classe Scanner: String s1 = tastiera.next(); s1 è il contenuto della console fino al primo spazio bianco Metodo nextline() della classe Scanner: String s2 = tastiera.nextline(); s2 è un intera riga della console
9 Esercizio 1 In ambiente Windows, il tipo del file è determinato dalla sua estensione:.doc indica un documento di testo.ppt indica una presentazione.xls indica un foglio di calcolo. Scrivere un programma che chieda all utente il nome completo (nome.estensione, ad esempio «Documento 1.doc»), e stampi a video: Il nome del file («Documento 1») Il tipo del file («documento di testo») Il programma consigliato per aprire il file («Microsoft Word»)
10 Esercizio 1: schema di soluzione
Esercizio 2: Voto dell esame Scrivere un programma che permetta di calcolare il voto finale di un esame. Lo studente può svolgere solo la prova scritta finale, oppure svolgere anche due prove parziali. Se lo studente non ha sostenuto i due parziali, il voto finale è determinato solo dalla prova scritta. Altrimenti: se il voto della prova scritta è maggiore della media dei parziali, il voto finale è quello della prova scritta Altrimenti, il voto finale è determinato per 1/3 dal voto della prova scritta, per 2/3 dalla media dei parziali I voti della prova scritta e delle prove parziali sono numeri reali, il voto finale è un numero intero (arrotondato per eccesso). Per ipotesi, sia nella prova scritta che nella prova parziale il voto massimo è 30. 11
12 Esercizio 2: cast e arrotondamenti L ultimo punto dell esercizio prevede la trasformazione di un numero reale in un numero intero, arrotondato per eccesso. Il solo cast da double a int non è sufficiente, poichè il valore viene sempre arrotondato per difetto. Occorre quindi utilizzare la funzione Math.round(): int a = (int)math.round(3.1415);
Esercizio 2: schema 13