Uso di classi

  1. Scrivere un programma che: i) richieda all'utente di immettere un numero intero n, ii) richieda successivamente all'utente di immettere n valori interi, iii) memorizzi questi valori in un'istanza della classe Sequenza e successivamente iv) calcoli e stampi il massimo, il minimo, la somma e la media dei valori contenuti nella sequenza (suggerimento: se non ricordate i dettagli relativi ai metodi implementati dalla classe Sequenza potete consultare la sua documentazione).
  2. Risolvere il problema precedente considerando, al posto di numeri interi, istanze della classe Frazione.
  3. Scaricare dal sito del corso il file ShapeHierarchy.jar e copiarlo in una directory appositamente creata. Verificare che la copia creata è scompattabile usando l'utility unzip (leggete la documentazione di questa utility tramite man nel caso non sappiate come eseguirla).
  4. Sempre all'interno della directory creata al punto precedente, scrivere un programma TestRectangle.java che crea un'istanza della classe Rectangle (leggendo la documentazione delle classi contenute in ShapeHierarchy.jar nel caso in cui non si ricordasse come creare l'istanza). Verificare che il programma viene compilato ed è eseguibile.
  5. Cancellate la directory creata negli esercizi precedenti (avendo cura di verificare, prima, che il file originariamente scaricato sia ancora a posto e di salvare in un posto sicuro il programma scritto al punto precedente). Leggere la documentazione di javac e java cercando il significato dell'opzione -cp. Sulla base di quanto letto, ricompilare e rieseguire TestRectangle.java senza scompattare ShapeHierarchy.jar.
  6. Per evitare di ricorrere a una delle due soluzioni, poco comode, viste nei punti precedenti, il modo migliore di utilizzare classi contenute in un file .jar è quello di assicurarsi che il nome del file stesso sia contenuto nell'elenco specificato in $CLASSPATH. Modificare opportunamente questa variabile di ambiente e verificare che è ancora possibile compilare ed eseguire TestRectangle.java. Modificare poi il codice sorgente in modo da utilizzare tutti i metodi pubblici della classe. Verificare anche quali tra le classi indicate nella documentazione è effettivamente possibile utilizzare e commentare i risultati.
  7. Disegnare su carta un diagramma che rappresenti le relazioni che sussistono tra tutte le classi contenute in ShapeHierarchy.jar.
  8. Considerare il seguente frammento di codice:
    Rectangle r = new Rectangle(6,7); 
    Square s = new Square(7);
    È possibile eseguire l'assegnamento r = s? E l'assegnamento s = r? Perché?
  9. Scrivere la classe ReadArrayOfShapes che permetta di introdurre da tastiera le figure che compongono un array di Shape di 15 elementi. Dopo aver letto tutte le figure, usare il metodo draw() per stampare l'array contenente le figure lette. L'introduzione delle singole figure deve permettere di scegliere quale figura introdurre e quindi adeguare le proprie richieste di conseguenza. I dati introdotti da tastiera saranno quindi usati per istanziare la figura corrispondente.

    Esempio di esecuzione:

    Shape 1 (Circle [C], Square [S] or Rectangle [R]): R
    Shape 1 is a Rectangle, please introduce:
    Height: 25
    Width: 7
    Shape 2 (Circle [C], Square [S] or Rectangle [R]): C
    Shape 2 is a Circle, please introduce:
    Radius: 3.14
    ...
    Shape 15 (Circle [C], Square [S] or Rectangle [R]): S
    Shape 15 is a Square, please introduce:
    Side: 2.83
    
    [01] I'm a Rectangle! My sides are: 25.0,7.0
    [02] I'm a Circle! My radius is: 3.14
    ...
    [15] I'm a Square! My side is: 2.83

    Notare che il metodo draw() fornito si limita a visualizzare la stringa "I'm a ...", mentre la numerazione tra parentesi quadre dipende dal vostro programma. Inoltre le cifre e le lettere in neretto nell'esempio sono da interndersi introdotte da tastiera durante l'esecuzione.

  10. Modificare ReadArrayOfShapes.java in modo che legga n figure geometriche, dove n è un numero intero specificato dall'utente all'inizio dell'esecuzione.
  11. Modificare ReadArrayOfShapes.java in modo che legga n figure geometriche, dove n è un parametro passato al metodo main.
  12. Modificare il programma scritto al punto precedente in modo da non dover chiedere il numero di figure all'inizio dell'elaborazione, ma stabilendo un'opportuno protocollo che indichi la fine dell'immissione dati.
  13. Risolvere il problema al punto 9 utilizzando la classe Sequenza al posto di un array.
  14. Scrivere un programma che dopo avere letto una serie di figure geometriche stampa l'area massima.
  15. Scrivere un programma che dopo avere letto una serie di figure stampa il perimetro della figura avente area minima.
  16. Verificare che i tre esercizi precedenti si possono risolvere senza utilizzare array o istanze di Sequenza.
  17. Leggere la documentazione della classe java.util.Arrays e in particolare quella del metodo Arrays.sort. Utilizzare tale metodo per scrivere un programma che legge un insieme di numeri interi e li stampa dal più piccolo al più grande.
  18. Scrivere un programma che legge una serie di figure geometriche e successivamente stampa le corrispondenti aree dalla più piccola alla più grande.
  19. Scrivere un programma che legge una serie di figure geometriche, le riordina per area non decrescente e stampa i perimetri delle figure così riordinate.
  20. Risolvere il problema al punto precedente utilizzando la classe SequenzaOrdinata.
  21. Data una sequenza di valori x1, ... xn ordinati in modo crescente, la mediana M è l'elemento che occupa il posto centrale nella sequenza ordinata se il numero di elementi è dispari, altrimenti è la media dei due valori centrali. La moda è invece il valore che compare il maggior numero di volte nella sequenza. Scrivere un programma che legge una sequenza di figure geometriche e ne visualizza mediana e moda delle corrispondenti aree. È più opportuno considerare Arrays o SequenzaOrdinata per implementare la soluzione?
  22. La definizione di moda data nel problema precedente non è univoca nel caso in cui vi siano due o più valori differenti che occorrono lo stesso numero di volte, e tale numero rappresenta la frequenza massima. Per tengere conto di questo fatto considerare le seguenti modifiche della definizione di moda: Verificare se il programma realizzato al punto precedente è o meno compatibile con ognuna di queste definizioni, e in caso negativo modificare opportunamente il codice realizzato.