Programmazione 2008/2009

Informatica Multimediale, Verona

Docente: Fausto Spoto (fausto.spoto@univr.it), disponibile su skype come fausto.spoto per informazioni o ricevimenti brevi.
Ricevimento: martedì dalle 10:30 alle 12:30.
Testo di riferimento: Giovanni Pighizzini, Mauro Ferrari: Dai Fondamenti agli Oggetti: Corso di Programmazione Java, Pearson/Addison-Wesley
Prima prova parziale (senza iscrizione!): 22 gennaio alle 10:30 Secondo prova parziale e primo compito completo (con iscrizione!): 2 aprile alle 10:00
Le classi di ausilio del libro: prog.tar da scaricare e scompattare con tar -xf prog.tar.
Descrizione dei principali comandi emacs.
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.


Lezione 1 (4 novembre 2008, 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
  • Dichiarazione di variabili
    Lezione 2 (5 novembre 2008, 9:30 - 11:30)
  • Oggetti, classi, messaggi, segnature e prototipi
  • Classi ConsoleOutputManager e ConsoleInputManager
  • Direttiva di importazione import
  • Classe String
  • Dichiarazioni di variabili
    Laboratorio 1 (5 novembre 2008, 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.
  • Scrittura di un programma InputOutput.java che legge un numero n e stampa n se esso è pari e 2n se esso è dispari
  • Scrittura di un programma MettiE.java che domanda una frase all'utente e la stampa identica a meno del primo carattere che deve diventare e
    Lezione 3 (6 novembre 2008, 8:30 - 10:30)
  • Tipi primitivi e tipi riferimento
  • Esempi di programmi che manipolano stringhe
  • Il condizionale if...else
  • Il tipo primitivo boolean
  • Annidamento dei condizionali: risoluzione dell'ambiguità dell'else
  • Operatori di confronto fra tipi numerici
  • Differenza fra l'operatore == e il metodo equals()
    Laboratorio 2 (6 novembre 2008, 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 4 (18 novembre 2008, 8:30 - 10:30)
  • Operatori booleani o logici
  • I cicli do...while e while...
  • La classe prog.utili.Intero
  • Esempi di condizionali: Numerali.java, Aggettivi.java, Rima.java
    Lezione 5 (19 novembre 2008, 9:30 - 11:30)
  • Il massimo comun divisore fra due numeri positivi: l'algoritmo di Euclide GCD.java e un algoritmo di ricerca GCD2.java
  • Esempi di cicli: MangiaFrase.java, MangiaFraseDestra.java
    Laboratorio 3 (19 novembre 2008, 14:30 - 16:30)
    Lezione 6 (20 novembre 2008, 8:30 - 10: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
  • Numeri corti e numeri lunghi: CortiLunghi.java
  • Conta corti e lunghi: QuantiCortiLunghi.java
    Laboratorio 4 (20 novembre 2008, 14:30 - 16:30)
    Lezione 7 (25 novembre 2008, 8:30 - 10:30)
  • Il ciclo for
  • Disegno di una V: Disegno.java
  • I metodi indexOf e charAt sulle stringhe
  • Controllo di e-pangramma: EPangramma.java
  • Iterazioni sulle stringhe
    Lezione 8 (26 novembre 2008, 9:30 - 11:30)
  • Il comando break dentro ai cicli
  • 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
    Laboratorio 5 (26 novembre 2008, 14:30 - 16:30)
    Lezione 9 (27 novembre 2008, 8:30 - 10: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 (27 novembre 2008, 14:30 - 16:30) Lezione 10 (2 dicembre 2008, 8:30 - 10:30)
  • Addizione come concatenazione di stringhe
  • Promozioni implicite da tipi numerici a tipo String nella concatenazione
  • Promozione implicita da tipo riferimento a tipo String nella concatenazione, con chiamata del metodo toString()
  • Il tipo primitivo char: esempi d'uso
  • Il comando switch
  • Metodi statici: classe java.lang.Math
    Lezione 11 (3 dicembre 2008, 9:30 - 11:30)
  • Traduzione da stringa a intero: StringToInt.java
  • Traduzione da binario a decimale: BinarioDecimale.java
  • Generazione di numeri a caso e approssimazione Montecarlo di pi greco: Cerchio.java
  • Plottaggio del seno: Plot.java
    Laboratorio 7 (3 dicembre 2008, 14:30 - 16:30)
    Lezione 12 (4 dicembre 2008, 8:30 - 10:30)
  • Esempio: somma di numeri binari visti come stringhe: SommaBinari.java
  • Inversione minuscole/maiuscole: InvertiMinMaiu.java
  • Costanti statiche
  • Classi involucro
  • Array di oggetti: dichiarazione, creazione, lunghezza e accesso agli elementi
    Laboratorio 8 (4 dicembre 2008, 14:30 - 16:30) Lezione 13 (9 dicembre 2008, 14:30 - 16:30 aula D)
  • Esercizi sugli array di oggetti
  • 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
    Lezione 14 (10 dicembre 2008, 9:30 - 11:30)
  • Condivisione fra elementi di un array
  • Array di tipi primitivi: non condivisione degli elementi
  • Ordinamento per ricerca iterata del minimo: MinSort.java
  • Crivello di Eratostene per la determinazione dei numeri primi: Eratostene.java
  • Creazione di un array di Intero i cui elementi rappresentano i numeri di Fibonacci: ArrayFibonacci.java
  • Array multidimensionali: creazione completa e incompleta
  • Condivisione fra le righe di un array multidimensionale

    Laboratorio 9 (10 dicembre 2008, 14:30 - 16:30)

    Laboratorio 10 (11 dicembre 2008, 14:30 - 16:30)
    Lezione 15 (17 dicembre 2008, 9:30 - 11:30)
  • Assegnamento fra variabili di tipo array: copia del riferimento, non dell'array
  • Estensione di un array tramite creazione di un nuovo array più lungo
  • Esercizi sul tipaggio di espressioni che coinvolgono gli array

    Laboratorio 11 (17 dicembre 2008, 14:30 - 16:30)
    Simulazione di compitino

    Laboratorio 12 (18 dicembre 2008, 14:30 - 16:30)
    Simulazione di compitino

    Primo compitino: 22 gennaio 2009 alle 10:30 (senza iscrizione)


    Fine del periodo uno


    Lezione 16 (26 gennaio 2009, 8:30 - 10:30)

  • Visione dei compitini
  • 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

    Lezione 17 (27 gennaio 2009, 8:30 - 10:30)
  • Concatenazione dei costruttori con la notazione this()
  • Esempio di classe: Led.java
  • Miglioramento della classe Frazione del libro
  • Esempio di classe: Safe.java
    Laboratorio 13 (28 gennaio 2009, 14:30 - 16:30) Il risultato dovrebbe essere:
    11 agosto 2008
    13 gennaio 1973
    false
    true
    224
    13


    Laboratorio 14 (29 gennaio 2009, 9:30 - 11:30) Il programma dovrebbe comportarsi alla fine come segue:

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


    Lezione 18 (29 gennaio 2009, 11:30 - 13:30)
  • Campi e metodi statici
  • Costanti final static
  • Esempi di classe: Salvadanaio.java e Semaforo.java
  • I funghi che sanno contarsi: Fungo.java
    Lezione 19 (2 febbraio 2009, 8:30 - 10:30)
  • La classe Orario del libro
  • 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
    Lezione 20 (3 febbraio 2009, 8:30 - 10:30)
  • Il concetto di sottoclasse
  • Ereditarietà e ridefinizione di metodi
  • Chiamata polimorfa di metodo
  • Esempio di definizione di sottoclassi: il caso di Quadrato
    Laboratorio 15 (4 febbraio 2009, 14:30 - 16: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

    Laboratorio 16 (5 febbraio 2009, 9:30 - 11:30) Il programma dovrebbe stampare:
    499.5
    999.0
    0.0
    -499.5
    0.0
    -999.0
    0.0
    999.0
    -999.0

    Lezione 21 (5 febbraio 2009, 11:30 - 13:30)
  • L'operatore instanceof
  • Cast fra tipi riferimento: controllo a tempo di esecuzione
  • Esercizi sulla gerarchia delle classi
  • La classe Geometra.java
    Lezione 22 (10 febbraio 2009, 8:30 - 10:30)
  • 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()
  • Adombramento di variabili. Disambiguazione tramite this.v e super.v
  • 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.
  • Classi astratte
  • 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 2009, 14:30 - 16: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

    Laboratorio 18 (12 febbraio 2009, 9:30 - 11: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 23 (12 febbraio 2009, 11:30 - 13: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.
    Lezione 24 (16 febbraio 2009, 8:30 - 10:30)
  • Documentazione JavaDoc
  • Overloading e scelta della segnatura a tempo di compilazione
  • Overriding e scelta dell'implementazione a tempo di esecuzione
    Lezione 25 (17 febbraio 2009, 8:30 - 10:30)
  • Il metodo equals() di Object e sue ridefinizioni
  • 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 2009, 14:30 - 16:30)
  • Si crei il package istogrammi all'interno del quale inserire:
    Laboratorio 20 (19 febbraio 2009, 9:30 - 11: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 26 (19 febbraio 2009, 11:30 - 13:30)
  • Ricorsione su interi: il caso della successione di Fibonacci
  • Ricorsione su stringhe
  • Ricorsione su stringhe: la fusione di due stringhe
    Lezione 27 (23 febbraio 2009, 8:30 - 10:30)
  • Ricorsione sugli array
  • Ricorsione: il caso della torre di Hanoi: Hanoi.java
    Lezione 28 (24 febbraio 2009, 8:30 - 10:30)
  • Strutture dati ricorsive: le liste
  • Ricorsione sulle liste: List.java
    Laboratorio 21 (25 febbraio 2009, 14:30 - 16:30)
    Si scriva una classe Ricorsione.java con i seguenti metodi:
    Lezione 29 (26 febbraio 2009, 11:30 - 13:30)
  • Esempio di utilizzo delle liste
  • Esempi di ricorsione sulle liste: clonaggio, clonaggio alternato, fusione, concatenazione, inversione
    Laboratorio 22 (4 marzo 2009, 14:30 - 16: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


    Laboratorio 23 (5 marzo 2009, 9:30 - 11:30)
    Si consideri la classe Main.java, da inserire in un package t9, che crea un dizionario di parole italiane a partire dal libro (file testo) promessi.txt (scaricatelo sul vostro computer). Quindi usa questo dizionario per decodificare le parole dalla sequenza di tasti del telefonino che le codificano. Tale classe usa una classe Dizionario.java che contiene una lista di parole e una classe List.java che implementa tale lista, entrambe da inserire nel package t9. Alcuni metodi di tali classi devono ancora essere completati. Procedete a completarli secondo la specifica. In particolare: Se avete implementato tutto correttamente, l'esecuzione di Main.java dovrebbe comportarsi come segue:

    1 = ' 2 = abcàABC 3 = deféèDEF
    4 = ghiìGHI 5 = jklJKL 6 = mnoòMNO
    7 = pqrsPQRS 8 = tuvùTUV 9 = wxyzWXYZ

    Immetti la sequenza di tasti premuti sul telefonino: 5146
    codifica: l'ho


    Soluzione: List.java e Dizionario.java.

    Lezione 30 (5 marzo 2009, 11:30 - 13: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 31 (9 marzo 2009, 8:30 - 10: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
    Lezione 32 (10 marzo 2009, 8:30 - 10:30)
    Risoluzione di compiti passati.

    Laboratorio 24 (11 marzo 2009, 14:30 - 16: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 e compito completo: 2 aprile 2009 alle 10:00 (con iscrizione)