Gli obiettivi di questa esercitazione sono: saper utilizzare e riscrivere il
metodo equals della classe Object, saper utilizzare
le eccezioni e le parole riservate try, catch, finally, throw, throws,
saper utilizzare le classi File, FileInputStream e FileOutputStream
del package java.io (capitolo 11 da 11.3 fino a 11.6.2).
Raccomandazioni: Ove non altrimenti indicato, rispondete alle domande prima ragionando su carta e poi provando a editare, compilare ed eseguire. Gli esercizi etichettati con l'asterisco (*) sono più difficili: affrontateli dopo aver risolto gli altri.
Obiettivo: saper utilizzare e sovrascrivere il metodo equals
della classe Object.
Attività:
public class PrenotazioneAerea {
private String nominativo;
private String numeroVolo;
private String data; //in formato aaaa/mm/gg
private int prezzo; //in euro
public PrenotazioneAerea(String nominativo, String numeroVolo,
String data, int prezzo) {
this.nominativo = nominativo;
this.numeroVolo = numeroVolo;
this.data = data;
this.prezzo = prezzo;
}
public String toString() {
return "*"+nominativo+"*"+numeroVolo+"*"+data+"*"+prezzo+"**";
}
}
Sovrascrivete (aggiungendolo alla classe PrenotazioneAerea) il
metodo boolean equals(Object), ereditato dalla classe Object,
che restituisce true quando due prenotazioni sono uguali. (Suggerimento:
utilizzate il metodo equals della classe String
per sapere se due stringhe sono uguali.)UsaPrenotazioneAerea usando equals
oppure ==:
public class UsaPrenotazioneAerea {
public static void main(String[] args) {
String nome;
String volo;
String data;
int prezzo;
System.out.print("Inserisci nome ");
nome = EasyIn.readString();
System.out.print("Inserisci volo ");
volo = EasyIn.readString();
System.out.print("Inserisci data [aaaa/mm/gg] ");
data = EasyIn.readString();
System.out.print("Inserisci prezzo [in euro] ");
prezzo = EasyIn.readInt();
PrenotazioneAerea p1 = new PrenotazioneAerea(nome,volo,data,prezzo);
PrenotazioneAerea p2 = p1;
PrenotazioneAerea p3 = new PrenotazioneAerea(nome,volo,data,prezzo*2);
PrenotazioneAerea p4 = new PrenotazioneAerea(nome,volo,data,prezzo);
if (p1...p2...)
System.out.println(p1+" e "+p2+" sono uguali");
else
System.out.println(p1+" e "+p2+" sono diversi");
if (p1...p3...)
System.out.println(p1+" e "+p3+" sono uguali");
else
System.out.println(p1+" e "+p3+" sono diversi");
if (p3...p2...)
System.out.println(p3+" e "+p2+" sono uguali");
else
System.out.println(p3+" e "+p2+" sono diversi");
if (p1...p4...)
System.out.println(p1+" e "+p4+" sono uguali");
else
System.out.println(p1+" e "+p4+" sono diversi");
}
}
equals della classe PrenotazioneAerea
per fare in modo che il programma UsaPrenotazioneAerea possa
stampare quattro messaggi che dicono che le prenotazioni sono uguali.equals oppure ==
ai puntini di UsaPrenotazioneAerea per fare in modo che il secondo
messaggio affermi che sono uguali e il terzo che sono diversi.Obiettivo: saper utilizzare le eccezioni.
Attività:
public class EccezionePila extends Exception {
public EccezionePila(String s) {super(s);}
}
class EccezionePilaVuota extends EccezionePila {
public EccezionePilaVuota(String s) {super(s);}
}
class EccezionePilaPiena extends EccezionePila {
public EccezionePilaPiena(String s) {super(s);}
}
Modificate il codice di PilaInteriLimitata per fare in modo che
i metodi metti ed estrai lancino le opportune eccezioni
invece di stampare messaggi di errore:
public class PilaInteriLimitata {
private int[] pila;
private int top = 0;
public PilaInteriLimitata(int max) {
this.pila = new int[max];
}
public boolean vuota() {return top <= 0;}
public boolean piena() {return top > pila.length-1;}
public int estrai() {
if (vuota()) {
System.out.println("Errore: la pila e' vuota");
return -1;
}
return pila[(top--)-1];
}
public void metti(int x) {
if (piena()) {
System.out.println("Errore: la pila e' piena");
return;
}
pila[top++] = x;
}
}
UsaPilaInteriLimitata per far catturare
le eccezioni. Il programma (non il TDA) deve stampare messaggi
di errore quando cattura le eccezioni:
public class UsaPilaInteriLimitata {
public static void main(String[] args) {
PilaInteriLimitata pila = new PilaInteriLimitata(5);
for (int i = 0; i<7; i++)
pila.metti(i);
for (int i = 0; i<7; i++)
System.out.println(pila.estrai());
}
}
UsaPilaInteriLimitata per far in
modo che i metodi metti ed estrai non usino if,
ma l'eccezione ArrayIndexOutOfBoundsException che viene generata
automaticamente dalla JVM se durante l'esecuzione di un programma si tenta
di accedere ad un indice fuori dai limiti di un array.Obiettivo: saper utilizzare le classi File, FileInputStream
e FileOutputStream del package java.io.
Attività:
VisualizzaFile e CopiaFile
a pagina 259. Compilateli ed eseguiteli.VisualizzaFile per farlo fermare ogni 25 caratteri
e farlo aspettare la pressione del tasto invio.VisualizzaFile per farlo fermare ogni 5 righe
e farlo aspettare la pressione del tasto invio.Esercizio3 qui di seguito, il metodo
statico void stampaTrama(OutputStream f, int dimensione) che
stampa una trama di + e o su un FileOutputStream:
import java.io.*;
public class Esercizio3 {
public static void main(String[] args) {
System.out.print("Inserisci il nome del file ");
File f;
do {
f = new File(EasyIn.readString());
if (f.exists())
System.out.print(f+" esiste gia'. Inserisci il nome di un file nuovo ");
} while(f.exists());
try {
FileOutputStream fos = new FileOutputStream(f);
for (int i=6; i<9; i++)
stampaTrama(fos,i);
fos.close();
} catch(IOException e) {
System.out.println("Errore!\n"+e);
}
}
}
La trama è fatta a scacchiera. Ad esempio, stampaTrama(...,4)
deve stampare
+o+o o+o+ +o+o o+o+
stampaTrama(...,3) deve stampare
+o+ o+o +o+Suggerimento: se l'indice di riga più l'indice di colonna è pari si deve stampare un carattere, altrimenti l'altro...
FileInpuStreamConRighe e FileOutputStreamConRighe
che, oltre ad avere tutti i metodi di FileInputStream e FileOutputStream,
hanno anche i metodi String leggiRiga() e void scriviRiga(String).
Paolo Coppola