Fondamenti di informatica T-A
Esercitazione 5 : Stringhe ed array
AA 2012/2013
Tutor : Domenico Di Carlo
<[email protected]>
String
• La classe String :
▫ Rappresenta una sequenza di caratteri.
▫ Ha una classe ad hoc, vista la sua importanza.
▫ Permette la concatenazione tramite l’operatore ‘+’
(…che abbiamo visto utilizzando
System.out.print(“val: ” + s.getValue))
▫ Ha moltissimi metodi di utilità, ne vedremo alcuni ma è
caldamente consigliato dare uno sguardo alla documentazione :
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
▫ Si può instanziarne un oggetto in due differenti modi :
 String s1 = new String(“Stringa uno”);
 String s2 = “Stringa due”;
Fondamenti di informatica A-K - Domenico Di Carlo
Immutabilità
• Le stringhe sono costanti ed immutabili, questo vuol dire
che il loro valore non può essere modificato dopo essere
state create. Infatti tutti i metodi che effettuano delle
modifiche (trim(), concat(), etc) non modificano l'oggetto
su cui è invocato il metodo ma creano e ritornano una
nuova stringa.
Fondamenti di informatica A-K - Domenico Di Carlo
Immutabilità, esempio
Questo vuol dire che in memoria, oltre
alla stringa cui si riferisce a, verrà
creato un nuovo oggetto tramite il
metodo replace. Questa stringa non
avrà, però, alcuna
variabile reference associata.
Agendo in questo modo invece,
andiamo a cambiare la variabile
reference e quindi non a modificare la
stringa ma a crearne un’altra lasciando
in balìa del garbage collector la prima
Fondamenti di informatica A-K - Domenico Di Carlo
Alcuni metodi visti in pratica
Fondamenti di informatica A-K - Domenico Di Carlo
Alcuni esempi
• Scrivere un programma che concateni due stringhe s1 ed s2 e rimpiazzi
tutte le ‘i’ contenute nella stringa risultante s3 = s1+s2 con delle ‘Z’ :

public static void main(String[] args) {
String s1 = "L'esame di informatica";
String s2 = " è il mio preferito!!!";
String s3 = s1.concat(s2);
System.out.println("La stringa s3 prima del rimpiazzamento è : " + s3);
s3 = s3.replace('i', ‘Z');
System.out.println("La stringa s3 dopo il rimpiazzamento è : " + s3);
}
• Scrivere un programma che data una stringa di almeno 2 caratteri, s1s2
costruisca la stringa s2s1, cioè speculare rispetto al carattere medio.
Esempio : Ciao -> aoCi.
informatica -> maticainfor :

public static void main(String [] args) {
java.util.Scanner sc = new java.util.Scanner(System.in);
System.out.println("Inserisci una stringa");
String parola = sc.nextLine();
int lunghezza, m;
lunghezza = parola.length();
m = lunghezza/2;
System.out.print(parola.substring(m,lunghezza));
System.out.print(parola.substring(0,m));
}
Fondamenti di informatica A-K - Domenico Di Carlo
Tassonomia
• La classe Object è la superclasse, diretta o indiretta, di ogni
classe e definisce lo stato ed il comportamento base che
ciascun oggetto deve avere e cioè l’abilità di :
 confrontarsi con un altro oggetto
 convertirsi in una stringa … etc etc etc
Fondamenti di informatica A-K - Domenico Di Carlo
toString
• E’quindi evidente che è sempre opportuno ridefinire i comportamenti
dei metodi della classe Object per adattarli al caso specifico.
• Il metodo :
public String toString()
• ritorna una rappresentazione testuale dell’oggetto del tipo
ClassName@HashCode che, in molte occasioni, non ci dice nulla di
significativo.
• Potremmo ad esempio ridefinire il metodo toString nella classe
Contatore :
public class Contatore {
int valore;
[costruttori]
[altri metodi]
public String toString() {
return ““ + valore;
}

}
Fondamenti di informatica A-K - Domenico Di Carlo
Equals
• E’importante sapere inoltre che due stringhe non si comparano tramite
l’operatore ‘==‘ come visto, ad esempio, per gli interi.
• Il codice :

String s1 = “Ciao mamma“; String s2 = “Ciao mamma“;
if ( s1 == s2 ) System.out.println(“Le due stringhe sono uguali.“);
Non funziona come atteso perché l’operatore ‘==‘ controlla se le variabili referenziano lo stesso oggetto (cioè se è
puntata la stessa area di memoria), non se il valore della stringa è lo stesso.
• Se vogliamo sapere se due stringhe sono uguali dobbiamo usare il metodo

public boolean equals(String s);
• Ad esempio potremmo aggiungere il seguente codice all’interno della
classe Contatore per confrontare se due contatori sono uguali :
public boolean equals (Contatore c) {
if (value == c.getValue())
return true;
return false;
}
Fondamenti di informatica A-K - Domenico Di Carlo
Array
• Gli array sono dei contenitori che ospitano un numero
prestabilito di oggetti dello stesso tipo :
• Il codice che segue, ad esempio, crea un array capace di
contenere al più 10 numeri interi
 int[] arrayInteri;
arrayInteri = new int[10];
• La dimensione dell’array è definita all’atto della
inizializzazione (con la new) e memorizzata nell’attributo
length. Ad esempio l’array ‘arrayInteri’ appena creato può
contenere non più di 10 elementi !
• Non si può estendere dinamicamente un array (bisogna
ricrearlo). Per fare questo esistono delle classi apposite che
vedremo più avanti nel corso.
Fondamenti di informatica A-K - Domenico Di Carlo
Array di oggetti
• E’possibile definire array di qualsiasi tipo di oggetto (purché sia lo
stesso oggetto).
• Possiamo creare un array di interi, di stringhe, di classi Persona, di
classi Contatore (basta con sti contatori, non ne posso più) :
 public class TestArrayContatore {
public static void main(String args[]){
Contatore[] contatori = new Contatore[3];
contatori[0].inc ();
}
}
• Il codice appena visto non funziona, lancia un NullPointerException
perché sta tentando di accedere ad un oggetto non ancora
inizializzato. Per farlo funzionare bisogna inizializzare ogni singolo
contatore con una new!!
 Contatore[] contatori = new Contatore[3];
for(int i=0; i<contatori.length; i++)
contatori[i] = new Contatore();
contatori[0].inc();
Fondamenti di informatica A-K - Domenico Di Carlo
Una migliore visione degli array
Fondamenti di informatica A-K - Domenico Di Carlo
Esercizio 1
• Realizzare una applicazione java (classe Esercitazione 51)
che:
▫ Contenga un array di stringhe che modellino dei libri, del tipo :
 String[] libri = new String[7];
libri[0] = "Camere Separate";
…
libri[3] = new String("Un libro a caso");
…
libri[6] = "La Divina Commedia";
▫ Chieda all’utente un titolo di libro
▫ Verifichi se il libro è presente nell’elenco (utilizzare la equals)
▫ In caso affermativo, stampi a video la posizione (indice
dell’array) in cui è il titolo stato trovato
▫ In caso negativo, stampi “Libro non trovato”
Fondamenti di informatica A-K - Domenico Di Carlo
Esercizio 2 e 3
• Dato un array di N interi inizializzato in modo tale da
contenere in ogni indice l’intero corrispondete :
▫ arrayInteri[0] = 0;
…
▫ arrayInteri[4] = 4;
…
▫ arrayInteri[N] = N;
scrivere un algoritmo (classe Esercitazione 52) per sommare
tutti gli elementi ad indici multipli di 3.
• Dato un array di N caratteri scrivere un algoritmo (classe
Esercitazione 53) per verificare se l’ordine dei caratteri
determina una sequenza palindroma (cioè che non cambia
se letta al contrario; ad esempio ‘anna’ è palindroma,
‘mamma’ non è palindroma).
Fondamenti di informatica A-K - Domenico Di Carlo
Esercizio 4
• Un libro è identificato dal suo titolo e dal suo autore.
• Definire la classe Libro che:
▫
▫
▫
▫
▫
Possieda due campi di tipo stringa che identifichino autore e titolo
Possieda un costruttore con parametri, definito opportunamente
Presenti metodi che permettono di accedere ai campi interni
Presenti il metodo “toString” che fornisca una descrizione del libro
Presenti il metodo “equals” che verifichi se il libro sia uguale a
quello passato come parametro (l’uguaglianza va verificata sul
titolo). Nota bene : è possibile utilizzare equals all’interno del
metodo equals, in quanto i campi interni sono già delle stringhe.
• Definire un’altra classe che (Esercitazione 54)
▫ Chieda all’utente il nome di un autore
▫ Se ci sono, stampi a video tutti i libri scritti da quell’autore
Fondamenti di informatica A-K - Domenico Di Carlo
Esercizio 5
• Si estendano le funzionalità della classe Libro (definita
nell’Esercizio4) aggiungendo il seguente metodo statico:
▫ public static int conta(Libro lib, Libro[] bib);
che restituisca il numero di libri in biblioteca che sono uguali
a “lib” (si utilizzi il metodo equals definito in precedenza).
• Si realizzi poi una applicazione (Esercitazione55) che:
▫
▫
▫
▫
chieda all’utente un titolo ed un autore di libro
controlli quante copie ne sono presenti in biblioteca
se ve ne è almeno una, informi l’utente che il libro è presente
in caso contrario, lo informi della sua assenza.
Fondamenti di informatica A-K - Domenico Di Carlo
Esercizio 6, difficilissimo quasi impossibile
• Realizzare una classe Studente composta da :
 Un array di 5 interi che modellino 5 voti dello studente
 Tre stringhe rappresentati il nome, cognome e numero di matricola
 I metodi :
▫ public int[] getVoti()
◦
che permetta di ritornare i voti conseguiti dallo studente
▫ public String getNome(), public String getCognome(), public String getMatricola()
▫ public boolean inserisciVoto(int voto)
◦
che permetta di di popolare l’array dei voti con dei numeri compresi tra 18 e 30
▫ public double calcolaVotoDiPartenza(int annoDiLaurea)
◦
che calcoli il voto di partenza per la laurea triennale in 110esimi. Il calcolo deve essere effettuato tenendo
conto degli anni impiegati per conseguire la laurea. Se ci si è laureati in tempo, il voto di laurea deve
essere moltiplicato per 1.0325, se ci si è impiegato 4 anni deve essere moltiplicato per 1.01. In ogni altro
caso deve essere semplicemente essere x = media*110/30;
• Realizzare un’altra classe (Esercitazione56) che :




istanzi uno studente tramite apposito costruttore
chieda all’utente di inserire i voti dello studente
chieda all’utente gli anni necessari al conseguimento della laurea
calcoli il voto di partenza della laurea espresso in 110esimi
Fondamenti di informatica A-K - Domenico Di Carlo
Scarica

Fondamenti di informatica T