Programmazione per TWM: Esercitazione di laboratorio #18 (30/04)

Gli obiettivi di questa esercitazione sono: capire i concetti di polimorfismo e late-binding, prendere confidenza con l'ereditarietà e saper definire semplici gerarchie di classi (capitolo 9).

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 definire gerarchie di classi.

Attività:

  1. (**) Definite la classe o le classi per rappresentare SMS normali (massimo 160 caratteri) e lunghi (senza limite di caratteri).
    Fornite la possibilità di ottenere un array di messaggi normali (qelli limitati a 160 caratteri) da un SMS lungo, spezzandolo opportunamente (dovete scrivere il metodo spezza()).
    Un messaggio deve permettere di impostare (anche in questo caso dovete definire i metodi e gli attributi opportuni).
    Un messaggio deve avere un metodo aggiungi per aggiungere un carattere. Nel caso degli SMS normali, questo metodo deve restituire false se non si possono più aggiungere caratteri.
    Il metodo toString() deve restituire il messaggio sotto forma di stringa così come verrebbe mostrato su un telefonino con un display che può contenere al massimo 25 caratteri per riga.
    Non dovete mai scrivere due volte lo stesso codice!
    Suggerimento: prima scrivete le classi con tutti i loro metodi, anche duplicati, poi decidete la gerarchia.
  2. Scrivete il programma UsaSMS che vi permettere di inserire da tastiera un SMS normale ed uno lungo e poi li stampa a video.
    L'output del programma deve essere simile al seguente (il testo inserito da tastiera è quello in rosso):
    >java UsaSMS
    Inserisci il tuo numero di telefono: 333123123
    Che giorno è oggi? 30/04/2003
    
    Scrivi un messaggio breve (max 160 caratteri)
    Butta la pasta che sto arrivando!
    
    Che ore sono? 12:30
    Inserisci il numero di telefono a cui inviare il messaggio: 348012012
    
    Ora scrivi un messaggio lungo
    
    Buuuuuuuuuttttttttttttttaaaaaaaaaaaaaaaaaa    laaaaaa    paaaaaaaaaaasssssstaaaaaaaaa 
     cheeeeeeee sssssssssstoooooooooooooooo aaaaaaaaarrrrrrrrrrrrrrriiiiiiiiiiiiiiiiiivvv
    vvvvvaaaaaaaaaannnnnnnnnnnnnnndoooooooooooooooooooooooooooooooo!!!!!!!!!!!!!!
    
    Che ore sono? 12:33
    Inserisci il numero di telefono a cui inviare il messaggio: 348014014
    
    Il primo messaggio, quello breve, è il seguente:
    Da: 333123123
    A: 348012012
    Data: 30/04/2003 12:30
    Butta la pasta che sto ar
    rivando!
    
    Il secondo messaggio, quello lungo, è il seguente:
    Da: 333123123
    A: 348014014
    Data: 30/04/2003 12:33
    Buuuuuuuuutttttttttttttta
    aaaaaaaaaaaaaaaaa    laaa
    aaa    paaaaaaaaaaassssss
    taaaaaaaaa cheeeeeeee sss
    ssssssstoooooooooooooooo 
    aaaaaaaaarrrrrrrrrrrrrrri
    iiiiiiiiiiiiiiiiivvvvvvvv
    aaaaaaaaaannnnnnnnnnnnnnn
    doooooooooooooooooooooooo
    oooooooo!!!!!!!!!!!!!!
    
    Suggerimento: leggete il messaggio da tastiera con EasyIn.readString(), poi ricavate un array di char utilizzando il metodo toCharArray(). Ad esempio
    String x = EasyIn.readString();
    char[] caratteri = x.toCharArray();
    for (....)
      ... messaggio.aggiungi(caratteri[i])...
    
  3. Definire la classe o le classi per implementare un carrello della spesa in cui possono essere aggiunti o tolti libri o cd. Il carrello deve mantenere in un unico array, inizialmente vuoto, la lista dei prodotti aggiunti e dovete implementare il metodo prodotti() che restituisce un array contenente tutti i prodotti presenti nel carrello. Implementate anche i metodi o il metodo per aggiungere e togliere libri e cd dal carrello.
    I libri e i cd devono avere un metodo che restituisce il loro prezzo. Il prezzo deve essere impostato quando l'oggetto viene creato.
  4. (*) Aggiungete la classe che rappresenta i messaggi vocali (senza testo) a quelle definite al punto 1. Un messaggio vocale ha un campo byte[] audio, un destinatario, il mittente e l'ora e data di partenza. Non ha metodi per aggiungere e togliere caratteri.
    Se siete costretti a duplicare del codice vuol dire che dovete modificare la gerarchia che avete definito durante l'attività 1.
  5. Modificate il programma UsaSMS dell'attività 2 per fare in modo che i messaggi mostrati all'utente prima dell'inserimento dei dati da tastiera (Inserisci il tuo numero di telefono: , Che giorno รจ oggi? , Scrivi un messaggio breve (max 160 caratteri) , ecc.) vengano scritti in dialetto o in un'altra lingua. Se non riuscite a farlo modificando solo il codice di UsaSMS, ma siete costretti a modificare anche quello degli SMS, vuol dire che era stato progettato male.

Esercizio 2

Obiettivo: comprendere polimorfismo e late-binding.

Attività:

  1. Considerate le seguenti classi:
    class A {
      public int m1() {
        return 2;
      }
    }
    
    class B extends A {
      public int m1() {
        return 5;
      }
    }
    
    class C extends A {
      public int m1() {
        return 13;
      }
    }
    class Esercizio2 {
      public static void main(String[] args) {
        A   pippo = new A();
        ... pluto = new B();
        prova(pluto);
      }
      static void prova(A a) {
        System.out.println(a.m1());
      }
    }
    
    Cosa si deve sostituire ai puntini del programma Esercizio2 per fargli stampare 5 (possono essere giuste anche più risposte)? Controllate le vostre risposte ricompilando ed eseguendo il programma.
  2. Considerate le classi A, B e C dell'attività precedente. Se si modifica il programma Esercizio2 in questo modo
    class Esercizio2 {
      public static void main(String[] args) {
        ... pippo = new ...;
        ... pluto = new ...;
        prova(pippo);
        prova(pluto);
      }
      static void prova(A a) {
        System.out.print("("+a.m1()+")");
      }
      static void prova(C c) {
        System.out.print(c.m1()+","+c.m1());
      }
    }
    
    cosa si deve sostituire ai puntini per ottenere (5)13,13 (possono essere corrette anche più risposte)? Controllate le vostre risposte ricompilando ed eseguendo il programma.
  3. Considerate le classi definite all'attività 3 dell'esercizio precedente. Implementare la classe Cassa con un metodo public int conto(Carrello c) che dato un carrello pieno restituisce il conto da pagare.
    Non potete usare if,switch e operatore condizionale.
    Il codice di conto deve essere simile al seguente:
    public int conto(Carrello c) {
      ...
      ... prodotti = c.prodotti();
      for (... prodotti ...) {
        ...
        ... ...[i].prezzo();
        ...
      }
      ...
      return totale;
    }
  4. (*) Scrivere il programma UsaCarrelloECassa che vi permette di acquistare 5 prodotti e poi calcola il conto. L'output del programma deve essere simile al seguente:
    >java UsaCarrelloECassa
    Quanti libri vuoi acquistare? 3
    Inserisci il prezzo del libro 1: 12
    Inserisci il prezzo del libro 2: 10
    Inserisci il prezzo del libro 3: 14
    Inserisci il prezzo del cd 1: 20
    Inserisci il prezzo del cd 2: 26
    
    Totale: 82 
    

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