Programmazione 2007/2008

Informatica Multimediale, Verona

Docente: Fausto Spoto (fausto.spoto@univr.it), disponibile su skype come fausto.spoto per informazioni o ricevimenti brevi.
Ricevimento: mercoledì dalle 16:30 alle 18:30.
Testo di riferimento: Giovanni Pighizzini, Mauro Ferrari: Dai Fondamenti agli Oggetti: Corso di Programmazione Java, Pearson/Addison-Wesley
Le classi di ausilio del libro: prog.tar da scaricare e scompattare con tar -xf prog.tar.
Prima prova parziale del 14/12/2005 e sua soluzione.

Seconda prova parziale del 20/03/2006 e sua soluzione.

Esame del 30/03/2006 e sua soluzione.

Prima prova parziale del 14/12/2006 e sua soluzione.

Seconda prova parziale dell'8/3/2007.

Esame del 22/03/2007 e sua soluzione.


Ogni anno ci sono due borse erasmus da 5 a 9 mesi ciascuna per l'Isola della Réunion (Oceano Indiano, Francia). Quest'anno andranno perse? Clicca qui per saperne di piú.


Lezione 1 (30 ottobre 2007, 8:30 - 10:30)
  • Computer e algoritmi
  • L'algoritmo di Euclide
  • La macchina di Von Neumann
  • Compilazione ed esecuzione
  • Java bytecode e indipendenza dall'architettura del codice eseguibile
  • Variabili e tipo, assegnamento distruttivo
  • Strutture di controllo degli algoritmi
  • Esempio di algoritmo: la soluzione delle equazioni di secondo grado
    Lezione 2 (31 ottobre 2007, 9:30 - 11:30)
  • Dichiarazione di variabili
  • Esempi di algoritmo
  • Algoritmi su sequence di numeri interi: massimo, minimo, media
    Laboratorio 1 (31 ottobre 2007, 14:30 - 16:30)
  • Utilizzo di emacs
  • La prima classe Java: compilazione (javac) ed esecuzione (java)
  • Implementazione di semplici algoritmi su numeri interi: lettura e scrittura di somma, sottrazione e simili: InputOutput.java
    Lezione 3 (6 novembre 2007, 8:30 - 10:30)
  • Oggetti, classi, messaggi, segnature e prototipi
  • Classi ConsoleOutputManager e ConsoleInputManager
  • Direttiva di importazione import
  • Classe String
  • Dichiarazioni di variabili
  • Tipi primitivi e tipi riferimento
    Lezione 4 (7 novembre 2007, 9:30 - 11:30)
  • Esempi di programmi che manipolano stringhe
  • Il condizionale if...else
  • Il tipo primitivo boolean
  • Annidamento dei condizionali: risoluzione dell'ambiguità dell'else
  • Operatori booleani o logici
  • Differenza fra l'operatore == e il metodo equals()
  • I cicli do...while e while...
    Laboratorio 2 (7 novembre 2007, 14:30 - 16:30)
  • Esercizi su lettura, scrittura e semplici elaborazioni di numeri e stringhe: si consideri la classe Cornice.java, la si scarichi, compili ed esegua. Quindi:
    Lezione 5 (8 novembre 2007, 8:30 - 10:30)
  • La classe prog.utili.Intero
  • Esempi di condizionali: Numerali.java, Aggettivi.java, Rima.java
    Laboratorio 3 (8 novembre 2007, 14:30 - 16:30)
    Lezione 6 (13 novembre 2007, 8:30 - 10:30)
  • Esempi di cicli: MangiaFrase.java, MangiaFraseDestra.java, MangiaFraseBassa.java
  • Il massimo comun divisore fra due numeri positivi: l'algoritmo di Euclide GCD.java e un algoritmo di ricerca GCD2.java
    Lezione 7 (14 novembre 2007, 9:30 - 11:30)
  • Esempi di cicli: RuotaFrase.java, InvertiFrase.java
  • La classe prog.utili.Frazione: MassimoSequenza.java e Sommatoria.java
  • Test di palindroma tramite inversione della frase: PalindromaInverti.java
  • Il ciclo for
  • Numeri corti e numeri lunghi: CortiLunghi.java
  • Conta corti e lunghi: QuantiCortiLunghi.java
    Laboratorio 4 (14 novembre 2007, 14:30 - 16:30)
    Lezione 8 (15 novembre 2007, 8:30 - 10:30)
  • Disegno di una V: Disegno.java
  • I metodi indexOf e charAt sulle stringhe
  • Controllo di e-pangramma: EPangramma.java
  • Iterazioni sulle stringhe
  • Il comando break dentro ai cicli
    Laboratorio 5 (15 novembre 2007, 14:30 - 16:30)
    Lezione 9 (20 novembre 2007, 8:30 - 10:30)
  • Test di palindroma con indici e uso del comando break
  • Cicli annidati: Pitagora.java, TrovaEPangramma.java
  • Espressioni di base e composte, letterali
  • Precedenza e associatività degli operatori
  • Espressione di assegnamento
  • Forme abbreviate di assegnamento: pre e post incremento/decremento
  • Side-effect delle espressioni di assegnamento
    Lezione 10 (21 novembre 2007, 9:30 - 11:30)
  • Tipi primitivi numerici: byte, short, int, float e double
  • Conversioni di tipo (verso l'alto) e cast (verso il basso)
  • Errori di approssimazione nelle conversioni e nei cast
    Laboratorio 6 (21 novembre 2007, 14:30 - 16:30) Lezione 11 (22 novembre 2007, 8:30 - 10:30)
  • Promozioni implicite da tipi numerici a tipo String nella concatenazione
  • Il tipo primitivo char: esempi d'uso
  • Il comando switch
  • Metodi statici: classe java.lang.Math
  • Costanti statiche
    Laboratorio 7 (22 novembre 2007, 14:30 - 16:30)
    Lezione 12 (27 novembre 2007, 8:30 - 10:30)
  • Traduzione da stringa a intero: StringToInt.java
  • Traduzione da binario a decimale: BinarioDecimale.java
  • Addizione come concatenazione di stringhe
  • Promozione implicita da tipo riferimento a tipo String nella concatenazione, con chiamata del metodo toString()
  • Generazione di numeri a caso e approssimazione Montecarlo di pi greco: Cerchio.java
  • Plottaggio del seno: Plot.java
  • Classi involucro
  • Inversione minuscole/maiuscole: InvertiMinMaiu.java
    Lezione 13 (28 novembre 2007, 9:30 - 11:30)
  • Esempio: somma di numeri binari visti come stringhe: SommaBinari.java
  • Array di oggetti: dichiarazione, creazione, lunghezza e accesso agli elementi
  • Esercizi sugli array di oggetti
  • Condivisione fra elementi di un array
  • Assegnamento a una variabile di tipo array e condivisione fra variabili di tipo array
    Laboratorio 8 (28 novembre 2007, 14:30 - 16:30) Lezione 14 (29 novembre 2007, 8:30 - 10:30)
  • Somma di frazioni in array: SommaFrazioni.java
  • Creazione di una array di stringhe che contengono a ripetute: ArrayA.java
  • Creazione di un array di fattoriali visti come stringhe in italiano: ArrayFattoriale.java
  • Array di tipi primitivi: non condivisione degli elementi
  • Assegnamento fra variabili di tipo array: copia del riferimento, non dell'array
    Laboratorio 9 (29 novembre 2007, 14:30 - 16:30)

    Lezione 15 (4 dicembre 2007, 8:30 - 10:30)
  • Creazione di un array di Intero i cui elementi rappresentano i numeri di Fibonacci: ArrayFibonacci.java
  • Ordinamento per ricerca iterata del minimo: MinSort.java
  • Estensione di un array tramite creazione di un nuovo array più lungo
  • Crivello di Eratostene per la determinazione dei numeri primi: Eratostene.java

    Lezione 16 (5 dicembre 2007, 9:30 - 11:30)
  • Array multidimensionali: creazione completa e incompleta
  • Condivisione fra le righe di un array multidimensionale
  • Esercizi sul tipaggio di espressioni che coinvolgono gli array

    Laboratorio 10 (5 dicembre 2007, 14:30 - 16:30)
    Laboratorio 11 (6 dicembre 2007, 8:30 - 10:30)
    Simulazione di compitino

    Laboratorio 12 (6 dicembre 2007, 14:30 - 16:30)
    Simulazione di compitino

    Primo compitino: 11 dicembre 2007 alle 15:00 (senza iscrizione)


    Fine del periodo uno


    Lezione 17 (28 gennaio 2008, 9:30 - 11:30)

  • Implementazione delle classi
  • Campi, costruttori e metodi
  • Esempio della classe Frazione del libro
  • Accesso ai campi, notazione punto
  • Riferimento this all'oggetto che esegue il metodo
  • Concatenazione dei costruttori con la notazione this()
  • Esempio di classe: Led.java

    Laboratorio 13 (28 gennaio 2008, 11:30 - 13:30) Il risultato dovrebbe essere:
    11 agosto 2008
    13 gennaio 1973
    false
    true
    224
    13


    Lezione 18 (29 gennaio 2008, 8:30 - 10:30)
  • Miglioramento della classe Frazione del libro
  • Campi e metodi statici
  • La classe Orario del libro
  • Esempio di classe: Safe.java
    Laboratorio 14 (30 gennaio 2008, 11:30 - 13:30) Il programma dovrebbe comportarsi alla fine come segue:

    Immetti la frase da crittare: ciao
    `jbl
    6<4:
    ciao


    Lezione 19 (31 gennaio 2008, 14:30 - 16:30)
  • Campi e metodi statici, costanti final static
  • Esempi di classe: Salvadanaio.java e Semaforo.java
  • I funghi che sanno contarsi: Fungo.java
    Lezione 20 (4 febbraio 2008, 9:30 - 11:30)
  • Package e modificatori di visibilità
  • Il package universita: Studente.java e Universita.java da inserire nella directory universita
  • La classe Incrementa.java che utilizza le classi Led.java e Cifra.java da inserire all'interno della directory display
    Laboratorio 15 (4 febbraio 2008, 11:30 - 13:30) Il programma dovrebbe stampare:
    RE SOL RE FA
    La nota piu' alta e' SOL
    D G D F
    La nota piu' alta e' G

    Lezione 21 (5 febbraio 2008, 8:30 - 10:30)
    Laboratorio 16 (6 febbraio 2008, 11:30 - 13:30) Il programma dovrebbe stampare:
    499.5
    999.0
    0.0
    -499.5
    0.0
    -999.0
    0.0
    999.0
    -999.0

    Lezione 22 (7 febbraio 2008, 14:30 - 16:30)
    Lezione 23 (11 febbraio 2008, 9:30 - 11:30)
  • Documentazione JavaDoc
  • Definizione di una sottoclasse per estensione della superclasse
  • Legame fra costruttori: la notazione super()
  • Richiamo di metodi della superclasse: la notazione super.m()
  • Costruttore di default e super()
  • Esempio di definizione di sottoclassi: il caso di Quadrato
  • Esempio di costruzione di una gerarchia di classi: felini/Felino.java, felini/Tigre.java, felini/Gatto.java, felini/Siamese.java, felini/Scozzese.java, MainFelini.java.
  • Esempio di costruzione di una gerarchia di classi con una classe astratta: monete/Moneta.java, monete/Euro.java, monete/Dollaro.java.
    Laboratorio 17 (11 febbraio 2008, 11:30 - 13:30)
  • Si scriva una classe GeneratoreFigureCasuali che fornisca: Il risultato dell'esecuzione di main dovrebbe essere qualcosa del tipo:

    base = 0.0, altezza = 4.0
    raggio = 1.0: non inclusa nella precedente
    base = 2.0, altezza = 2.0: non inclusa nella precedente
    base = 4.0, altezza = 4.0: non inclusa nella precedente
    raggio = 1.0: inclusa nella precedente
    ....
    ....
    raggio = 4.0: non inclusa nella precedente
    raggio = 0.0: inclusa nella precedente
    lato = 1.0: non inclusa nella precedente
    base = 4.0, altezza = 0.0: non inclusa nella precedente
    base = 4.0, altezza = 3.0: non inclusa nella precedente
    base = 3.0, altezza = 5.0: non inclusa nella precedente

    Figura di area massima: raggio = 5.0

    Lezione 24 (12 febbraio 2008, 8:30 - 10:30)

  • Esempio di costruzione di una gerarchia di classi con una classe astratta: nazioni/Nazione.java, nazioni/USA.java, nazioni/EuroZona.java, nazioni/Italia.java, nazioni/Francia.java, nazioni/Germania.java, MainNazioni.java.
  • Esempio di costruzione di una gerarchia di classi e di ridefinizione di metodi: ticker/Ticker.java, ticker/MyTicker.java, ticker/AlarmedMyTicker.java, MainTicker.java.
    Laboratorio 18 (13 febbraio 2008, 11:30 - 13:30)
  • Si scriva un package numeri al cui interno devono essere scritte:
  • Infine si scriva una classe MainNumeri.java, esterna al package numeri, il cui metodo main crea 19 in base 4, poi in esadecimale, poi in binario e poi in base 22; quindi li stampa tutti e quattro; quindi stampa 19 in base 22 piú 19 in esadecimale e stampa 19 in binario piú 19 in base 22.

  • Se tutto è corretto, l'esecuzione del main dovrebbe stampare:
    19 in base 4: 103
    19 in base 16: 13
    19 in base 2: 10011
    19 in base 22: j
    19 in base 22 piu' 19 in base 16: 1g
    19 in base 2 piu' 19 in base 22: 100110

    Lezione 25 (14 febbraio 2008, 14:30 - 16:30)
  • Overloading e scelta della segnatura a tempo di compilazione
  • Overriding e scelta dell'implementazione a tempo di esecuzione
  • Il metodo equals() di Object e sue ridefinizioni
  • Adombramento di variabili. Disambiguazione tramite this.v e super.v
    Lezione 26 (18 febbraio 2008, 9:30 - 11:30)
  • Modificatori di visibilità
  • Modificatore final
  • Passaggio dei parametri per valore: il caso dei tipi primitivi e quello dei tipi riferimento
  • Stack di attivazione e heap
  • Ricorsione: il caso del fattoriale
    Laboratorio 19 (18 febbraio 2008, 11:30 - 13:30)
  • Si crei il package istogrammi all'interno del quale inserire:
    Lezione 27 (19 febbraio 2008, 8:30 - 10:30)
  • Ricorsione su interi: il caso della successione di Fibonacci
  • Ricorsione su stringhe
    Laboratorio 20 (20 febbraio 2008, 11:30 - 13:30)
    (questo esercizio non prevede l'uso della ricorsione!)
  • Si crei un package stream dentro il quale inserire:
  • Si scriva quindi, fuori dal package, una classe MainStream.java che crea e stampa lo stream dei numeri maggiori o uguali a 100 e quello dei numeri positivi.
    Lezione 28 (21 febbraio 2008, 14:30 - 16:30)
  • Ricorsione su stringhe: la fusione di due stringhe
  • Ricorsione sugli array
    Lezione 29 (25 febbraio 2008, 9:30 - 11:30)
  • Ricorsione: il caso della torre di Hanoi: Hanoi.java
  • Strutture dati ricorsive: le liste
  • Ricorsione sulle liste: List.java
    Laboratorio 21 (25 febbraio 2008, 11:30 - 13:30)
    Si scriva una classe Ricorsione.java con i seguenti metodi:
    Lezione 30 (26 febbraio 2008, 8:30 - 10:30)
  • Esempio di utilizzo delle liste
  • Esempi di ricorsione sulle liste: clonaggio, clonaggio alternato, fusione, concatenazione, inversione
    Laboratorio 22 (27 febbraio 2008, 11:30 - 13:30)
    Si consideri la seguente classe per le liste:

    public class List {
      private int head;
      private List tail;
      public List(int head, List tail) {
        this.head = head;
        this.tail = tail;
      }
    }

    Si aggiunga a tale classe: Se tutto è corretto, l'esecuzione di main() dovrà stampare [5,8].
    Soluzione: List.java

    Lezione 31 (28 febbraio 2008, 14:30 - 16:30)
  • Eccezioni
  • Costrutto try/catch
  • Propagazione delle eccezioni lungo la catena di chiamata dei metodi
  • Comando throw
  • Eccezioni controllate e non controllate
  • Dichiarazione throws
    Lezione 32 (3 marzo 2008, 9:30 - 11:30)
  • Eccezioni controllate per metodi che chiamano altri metodi
  • Eccezioni controllate e ridefinizione dei metodi
  • Esempio di uso delle eccezioni: Pedina.java, Pedone.java, Alfiere.java, Cavallo.java, PosizioneIllegaleException.java, MossaIllegaleException.java, MainScacchi.java
    Laboratorio 23 (3 marzo 2008, 11:30 - 13:30)
    Si parta dalla soluzione del Laboratorio 22 e si modifichi tale classe List.java come segue: Soluzione: List.java

    Fine del corso

    Secondo compitino: 27 marzo 2008 alle 14:30 (senza iscrizione)