Programmazione per TWM: Esercitazione di laboratorio #16 (23/04)

L'obiettivo di questa esercitazione è quello di prendere confidenza con la notazione e la programmazione a oggetti (capitolo 8 fino a 8.5 compreso).

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 la notazione puntata.

Attività:

  1. Considerate il TDA Scatola definito come segue:
    class Scatola {
      private int altezza;
      private int larghezza;
    
      public Scatola(int altezza, int larghezza) {
        this.altezza = altezza;
        this.larghezza = larghezza;
      }
    
      public Scatola(int lato) {
        this(lato,lato);
      }
      
      public void allunga() {
        this.altezza++;
      }
      
      public void allarga() {
        this.larghezza++;
      }
      
      public void ruota() {
        int temp = this.larghezza;
        this.larghezza = this.altezza;
        this.altezza = temp;
      }
    }
    Aggiungete il metodo toString.
  2. In quali punti del codice si potrebbe eliminare la parola this mantenendo inalterato il funzionamento del TDA? Perché? Verificate (ricompilando) la correttezza delle vostre risposte.
  3. Cosa fa il costruttore Scatola(int lato)? Cosa fa il metodo allunga()? Cosa fa il metodo allarga()? Cosa fa il metodo ruota()? Sono scritti con approccio funzionale? Sono scritti con approccio procedurale?
  4. Scrivere il programma UsoScatola che
    1. crei una scatola s1 alta 13 e larga 16;
    2. crei una scatola s2 alta e larga 4;
    3. allarghi fino a 6 s2. Si può fare con una sola riga di codice? Perché?
    4. Stampi entrambe le scatole;
    5. ruoti s1 e la stampi;
    6. modifichi s2 allungandola di 2, ruotandola e allargandola di 3. Si può fare con una sola riga di codice? Perché?
  5. Modificate il TDA Scatola sostituendo i metodi allunga, allarga e ruota nel seguente modo:
      public Scatola allunga() {
        this.altezza++;
        return this;
      }
      
      public Scatola allarga() {
        this.larghezza++;
        return this;
      }
      
      public Scatola ruota() {
        int temp = this.larghezza;
        this.larghezza = this.altezza;
        this.altezza = temp;
        return this;
      }
      
    UsoScatola funziona ancora? Se sì, perché? Se no, modificatelo per farlo funzionare correttamente con la nuova versione del TDA.
    Considerate i punti c. ed f. dell'attività 4: è possibile scrivere una sola riga di codice?
  6. Modificate il TDA Scatola sostituendo i metodi allunga, allarga e ruota nel seguente modo:
      public static Scatola allunga(Scatola s) {
        s.altezza++;
        return s;
      }
      
      public static Scatola allarga(Scatola s) {
        s.larghezza++;
        return s;
      }
      
      public static Scatola ruota(Scatola s) {
        int temp = s.larghezza;
        s.larghezza = s.altezza;
        s.altezza = temp;
        return s;
      }
      
    UsoScatola funziona ancora? Se sì, perché? Se no, modificatelo per farlo funzionare correttamente con la nuova versione del TDA.
    Considerate i punti c. ed f. dell'attività 4: è possibile scrivere una sola riga di codice?
  7. Modificate il TDA Scatola sostituendo i metodi allunga, allarga e ruota nel seguente modo:
      public static void allunga(Scatola s) {
        s.altezza++;
      }
      
      public static void allarga(Scatola s) {
        s.larghezza++;
      }
      
      public static void ruota(Scatola s) {
        int temp = s.larghezza;
        s.larghezza = s.altezza;
        s.altezza = temp;
      }
      
    UsoScatola funziona ancora? Se sì, perché? Se no, modificatelo per farlo funzionare correttamente con la nuova versione del TDA.
    Considerate i punti c. ed f. dell'attività 4: è possibile scrivere una sola riga di codice?

Esercizio 2

Obiettivo: saper definire e usare oggetti.

Attività:

  1. Definire il TDA Secchio che rappresenta un contenitore di liquidi che può contenere solo un numero intero di litri.
    Il costruttore del TDA ha un unico parametro che definisce la capacità del secchio. Un secchio appena creato è vuoto.
    I metodi del TDA sono i seguenti:
  2. Scrivere il programma UsoSecchio che
    1. crei un secchio s1 di capacità 10 litri;
    2. stampi il contenuto di s1;
    3. riempia s1;
    4. stampi il contenuto di s1;
    5. crei un secchio s2 di capacità 4 litri;
    6. stampi il contenuto di s2;
    7. travasi s1 in s2;
    8. stampi il contenuto di s1 e s2;
    9. travasi s1 in s2 per la seconda volta;
    10. stampi il contenuto di s1 e s2;
    11. svuoti s2;
    12. travasi s1 in s2 per la terza volta;
    13. stampi il contenuto di s1 e s2;
    14. svuoti s2;
    15. travasi s1 in s2 per la quarta volta;
    16. stampi il contenuto di s1 e s2;
    L'output del programma deve essere il seguente:
    >java UsoSecchio 
    s1 contiene 0 litri
    s1 contiene 10 litri
    s2 contiene 0 litri
    s1 contiene 6 litri, s2 ne contiene 4
    s1 contiene 6 litri, s2 ne contiene 4
    s1 contiene 2 litri, s2 ne contiene 4
    s1 contiene 0 litri, s2 ne contiene 2
      
  3. (*) Divertitevi a completare il seguente codice:
    class UsoSecchio {
      public static void main(String[] args) {
        Secchio s1 = new Secchio(5);
        Secchio s2 = new Secchio(3);
        ...
        ...
        System.out.println("s1 contiene "+s1.quanto()+" litri");
      }
    }  
      
    in modo che l'output del programma sia il seguente:
    >java UsoSecchio
    s1 contiene 4 litri
    Non dovete modificare il TDA Secchio e non dovete chiamare nuovi costruttori. Per risolvere l'esercizio dovete usare solamente i metodi riempi, svuota e travasaIn di s1 e s2.

Fate l'amore e non la guerra!Valid HTML 4.01! Valid CSS! Paolo Coppola
Last modified: 2003-04-22