Programmazione per TWM: Esercitazione di laboratorio #21 (13/05)

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.

Esercizio 1

Obiettivo: saper utilizzare e sovrascrivere il metodo equals della classe Object.

Attività:

  1. Considerate la seguente classe che rappresenta i dati di una prenotazione aerea:
    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.)
  2. Completate il programma 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");
      }
    }
    
  3. Modificate il metodo equals della classe PrenotazioneAerea per fare in modo che il programma UsaPrenotazioneAerea possa stampare quattro messaggi che dicono che le prenotazioni sono uguali.
  4. Sostituite in modo opportuno equals oppure == ai puntini di UsaPrenotazioneAerea per fare in modo che il secondo messaggio affermi che sono uguali e il terzo che sono diversi.

Esercizio 2

Obiettivo: saper utilizzare le eccezioni.

Attività:

  1. Considerate la seguente gerarchia di eccezioni:
    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;
      }
    }
    
  2. Modificate il programma 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());
      }
    }
    
  3. (*) Modificate il codice di 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.

Esercizio 3

Obiettivo: saper utilizzare le classi File, FileInputStream e FileOutputStream del package java.io.

Attività:

  1. Copiate i programmi VisualizzaFile e CopiaFile a pagina 259. Compilateli ed eseguiteli.
  2. Modificate VisualizzaFile per farlo fermare ogni 25 caratteri e farlo aspettare la pressione del tasto invio.
  3. (*) Modificate VisualizzaFile per farlo fermare ogni 5 righe e farlo aspettare la pressione del tasto invio.
  4. Aggiungete al programma 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...
  5. (*) Definite le classi FileInpuStreamConRighe e FileOutputStreamConRighe che, oltre ad avere tutti i metodi di FileInputStream e FileOutputStream, hanno anche i metodi String leggiRiga() e void scriviRiga(String).

Valid HTML 4.01! Valid CSS! Paolo Coppola
Last modified: 2003-05-12