Metodologie di Programmazione a.a. 2010-2011 (canale M-Z)
Diario delle lezioni e delle esercitazioni
Martedì 15 marzo 2011
Informazioni sul corso. Cenni sulla storia del linguaggio Java. La Java Virtual Machine (JVM),
il compilatore Java e il linguaggio dei bytecodes.
Il primissimo programma Java: files, classi pubbliche (class
), metodi statici
(static
),
cenni sulla classe System
e
il metodo di stampa println()
. I tipi primitivi, le stringhe (cenni sulla classe String
e i
metodi length()
e charAt()
), le variabili e i principali operatori.
Input tramite la classe Scanner
(metodi next()
,
nextLine()
, nextInt()
, nextDouble()
). Cenni sui packages
e la direttiva import
(i packages java.lang
e java.util
).
Esempio di un programma che legge in input una linea di testo e stampa il numero di vocali
in essa contenute. Uso di if-else
e for
.
Esercizi Stringa_verticale, Parole_verticali e
Vocali (nella prima parte delle dispense).
Mercoledì 16 marzo 2011
Laboratorio
Scrittura, compilazione ed esecuzione di un programma Java: il programma HelloWorld
in Java.
Esercitazione su stringhe, input, output, strutture di controllo base.
Svolgimento assistito degli esercizi visti a lezione:
Parole_verticali e
Vocali.
Piccole variazioni sul tema: conteggio delle occorrenze di ciascuna vocale, verifica se due stringhe sono una l'anagramma dell'altra.
Venerdì 18 marzo 2011
Gli operatori aritmetici/logici/relazionali e il controllo del flusso (if-else
, for
, while
,
do-while
, switch-case
e l'operatore condizionale ( ? : )
) nel linguaggio Java
sono direttamente derivati da quelli del linguaggio C.
Metodi ricorsivi: esempio fattoriale.
Alcuni metodi e campi della classe Math
(in java.lang
).
La direttiva import static
. Struttura di un programma Java: la direttiva
package
. Nomi semplici e nomi completi.
Discussione circa il ruolo dei linguaggi di programmazione nello sviluppo di
sistemi software (complessi).
Confronto tra la programmazione procedurale e la programmazione orientata agli oggetti:
decomposizione in parti più semplici, separazione interfaccia-implementazione.
Definizione di una classe: campi, metodi e costruttori. signature di un metodo e
overloading. Modificatori di accesso public
,
private
e accesso ristretto al package. Differenze tra metodi/campi della classe, cioè statici,
(modificatore static
) e metodi/campi relativi agli oggetti.
Creazione di oggetti: l'operatore new
e i costruttori.
Esempio: la classe Studente
.
Esercizi
Frasi_palindrome,
Date e
Date+ (nella prima parte delle dispense).
Martedì 22 marzo 2011
Soluzioni degli esercizi Frasi_palindrome,
Date e
Date+ (dispense - prima parte).
Esercizio
Razionali
(dispense - prima parte).
Mercoledì 23 marzo 2011
Laboratorio
Svolgimento assistito degli esercizi proposti a lezione:
Razionali.
Osservazioni su: rappresentazione canonica di un tipo di dato, invariante di tipo di dato, utilità del mascheramento
della rappresentazione.
Giovedì 24 marzo 2011
Classe di esempio CharRect
(dispense - prima parte). Le costanti e la parola chiave
final
.
Discussione sui tipi: tipi primitivi, tipi classe e tipi riferimento.
Comportamento rispetto ad assegnamenti e confronti. Inizializzazioni e valori di default (null
).
Classi nidificate statiche. Esempio relativo alla classe Studente
. Definizione di una classe
che gestisce liste di interi e implementazione tramite liste (vedi esercizio
Liste_di_interi). Discussione circa
l'importanza di ben delineare le responsabilità di una classe e di favorire l'incapsulamento.
Esercizi
Scacchiera,
Piramidi e
Pile_di_interi&stringhe
(dispense - prima parte).
Martedì 29 marzo 2011
Soluzione esercizi Scacchiera e
Pile_di_interi&stringhe. Il tipo array: dichiarazione di variabili e creazione di array.
Relazione tra i tipi array, i tipi classe e i tipi riferimento. Array multidimensionali: array di array,
matrici triangolari. Inizializzatori di array. Argomenti dalla linea di comando. Metodi con un numero variabile
di parametri.
Esercizi Duplicati,
Grafico_a_barre e
Costellazioni_di_caratteri
(dispense - seconda parte).
Mercoledì 30 marzo 2011
Laboratorio:
Esercizi su array e matrici:
1. Duplicati,
2. Verifica di un quadrato magico;
3. Data una scacchiera e una casella (x,y), stampare una matrice in cui in ciascuna casella c'è il numero minimo di mosse che un cavallo
impiegherebbe a raggiungerla da (x,y). [in corrispondenza della cella (x,y) c'è il numero 0].
Giovedì 31 marzo 2011
Raffinamento della classe CharRect
: disaccoppiamento
del mezzo di stampa dagli algoritmi di tessitura del rettangolo tramite l'astrazione di una interfaccia
comune per i mezzi di stampa. Introduzione della classe PrintMedium
.
Errori al runtime e le eccezioni (exceptions). Il percorso di una
eccezione. Cattura delle eccezioni: try {...} catch () {...} finally {...}
.
Lancio di eccezioni (throw
). Eccezioni controllate (checked) e
non controllate (unchecked), dichiarazione di lancio eccezioni (throws
).
Esercizi Cascata
e Digitando_interi
(dispense - seconda parte).
Martedì 5 aprile 2011
Soluzioni esercizi Cascata
e
Digitando_interi.
Tipi per dati persistenti. La classe File
(in java.io
): i principali costruttori e metodi,
abstract pathnames. Esempio d'uso della classe File
. File ad accesso sequenziale (file di testo).
Lettura tramite la classe Scanner
. Eccezione controllata (checked exception):
FileNotFoundException
.
Scrittura tramite la classe PrintStream
e la classe FileOutputStream
. Esempio:
classe che gestisce un file di log.
Esercizi
Conta_file e
Log
(dispense - seconda parte).
Mercoledì 6 aprile 2011
Laboratorio
1. Lettura da file: contare numero di parole, caratteri e righe di un file di testo.
2. Lettura da file: leggere da file una matrice opportunamente formattata e verificare se si tratta di un quadrato magico.
Venerdì 8 aprile 2011
Estensione di una classe (parola chiave extends
) e discussione in relazione
ai concetti di specializzazione (o raffinamento), generalizzazione e interfaccia. Ereditarietà dei metodi e
campi (pubblici). Ridefinizione (override) dei metodi ereditati. La parola chiave super
e suoi usi nei costruttori e nei metodi. I concetti di superclasse/sottoclasse e supertipo/sottotipo. Il polimorfismo:
dynamic binding e static binding.
Esempio di classe base, di classe estesa e di uso del polimorfismo. Gli upcast e i
downcast e la relazione
tipo-sottotipo per gli array.
Soluzione degli esercizi
Conta_file e
Log.
Esercizi
Titoli_incorniciati e Titoli_verticali (dispense - terza parte).
Martedì 12 aprile 2011
Esempio di gerarchia di classi e suo utilizzo. Discussione circa i vantaggi offerti dall'ereditarietà e dal
polimorfismo. Il modificatore di accesso protected
.
La classe Object
. L'operatore instanceof
.
Soluzione esercizio Titoli_incorniciati.
Esercizio Biblioteca (negli
esercizi
di preparazione alla prova intermedia).
Mercoledì 13 aprile 2011
Laboratorio
Ereditarietà: Insiemi di anagrammi come sottoclasse di insiemi generici.
Venerdì 15 aprile 2011
Esempi d'uso del tipo Object
: metodi "generici" per copiare array. Il metodo copyOf()
della classe Arrays
(in java.util
). Il significato e la ridefinizione dei
metodi equals()
e toString()
. Soluzione esercizio
Biblioteca
Martedì 19 aprile 2011
Simulazione di prova intermedia:
Mercoledì 4 maggio 2011
Laboratorio: soluzioni esercizi prova intermedia.
Venerdì 6 maggio 2011
Classi e metodi astratti (abstract
). Discussione circa i motivi che favoriscono
l'uso di classi astratte.
Esempio d'uso di classi astratte: gerarchie CharShape
e PrintMedium
(nella terza parte
delle dispense).
Esercizi Strisce_verticali e Collisione2 (dispense - terza parte).
martedì 10 maggio 2011
Discussione degli esercizi Strisce_verticali e Collisione2. Il design pattern Template. Esempio
di uso di tale design pattern: classe che fornisce un "template" per semplici applicazioni con menu testuali.
Interfacce (interface
) e il concetto di contratto.
Implementazione (implements
). Ereditarietà multipla.
Esempio: l'interfaccia StrSet
.
Esercizio Menu (dispense - terza parte).
Mercoledì 11 maggio 2011
Laboratorio: preparazione progetto.
Venerdì 13 maggio 2011
Discussione esercizio Menu. Esempio di ereditarietà multipla da classe e interfaccia.
Esempio di interfaccia per insiemi di stringhe (modificabili) e implementazioni tramite array e liste.
Esempio d'uso.
Esercizi Ricerca_prefissi e
Code_oggetti
(dispense - terza parte).
Martedì 17 maggio 2011
Discussione esercizi Ricerca_prefissi e
Code_oggetti.
Esempio di interfaccia per insiemi di stringhe ordinati e modificabili (unione di due interfacce) e implementazione
tramite liste.
Conversione Boxing/Unboxing: i tipi riferimento
corrispondenti ai tipi primitivi. Il tipo Number
. Genericità: variabili di tipo.
Metodi generici: esempi di metodi generici e confronto con le corrispondenti versioni non generiche che
usano Object
.
Tipo inferito dal compilatore.
Esercizio Elementi_comuni (dispense - quarta parte).
Mercoledì 18 maggio 2011
Laboratorio: preparazione progetto.
Venerdì 20 maggio 2011
Discussione esercizio Elementi_comuni. Metodi generici: esempi e restrizioni sull'uso
delle variabili di tipo. Tipi generici: variabili di tipo e tipi parametrici. Relazioni
di sottotipo tra tipi parametrici. Esempi. Interfacce generiche. Esempio: l'interfaccia Comparable<T>
.
Limitazione extends
su una variabile di tipo.
Esercizi Minmax e Insiemi_generici (dispense - quarta parte).
Martedì 24 maggio 2011
Discussione esercizi Minmax e Insiemi_generici.
Wildcards: esempi di uso per entrambe le limitazioni
extends
e super
. Relazioni di supertipo/sottotipo per i
tipi wildcard e i tipi parametrici.
Esercizi Componenti_comuni e
Unione
(dispense - quarta parte).
Mercoledì 25 maggio 2011
Laboratorio: preparazione progetto.
Venerdì 27 maggio 2011
Discussione esercizi Componenti_comuni e
Unione.
Le interfacce Iterable<E>
e Iterator<E>
.
Esempio di implementazione dell'interfaccia Iterable<E>
tramite classe nidificata statica. Il for-each:
esempi con array e con oggetti che implementano Iterable<E>
.
Classi locali e anonime: implementazione
di Iterator
tramite classe locale e anonima.
Esercizi Rimuovi_array e
Max_ripetizioni
(dispense - quarta parte).
Martedì 31 maggio 2011
Discussione esercizi Rimuovi_array e
Max_ripetizioni. Le principali interfacce e classi del framework
Collections
(in java.util
): Collection<E>
,
Set<E>
, List<E>
, Queue<E>
,
SortedSet<E>
, HashSet<E>
, TreeSet<E>
,
ArrayList<E>
, LinkedList<E>
, Map<K,V>
e HashMap<K,V>
. Il metodo hashCode()
di Object
in relazione alla ridefinizione di equals
e le implementazioni tramite tabelle hash.
Esempio di uso delle mappe (Map<K,V>
) per implementare alberi generici.
Esercizi Conta_ripetizioni e
Anagrammi_in_file (dispense - quarta parte).
Mercoledì 1 giugno 2011
Laboratorio: preparazione progetto.
Venerdì 3 giugno 2011
Discussione esercizi Conta_ripetizioni e
Anagrammi_in_file. Interfacce grafiche: le origini di AWT e
Swing. Principi di base dell'architettura di Swing/AWT: albero delle componenti e
design pattern model-view-controller (MVC). Gestione degli eventi: design pattern Observer,
"ascoltatori di eventi" in Swing/AWT, esempio per JButton
(ActionEvent
, ActionListener
,
addActionListener()
). Panoramica sui principali componenti di Swing.
Mercoledì 8 giugno 2011
Laboratorio: preparazione progetto.
Venerdì 10 giugno 2011
Versione migliorata dell'applicazione Rate
con campi di testo formattati
per valori numerici e con controllo in fase di editing. Discussione circa i vantaggi di
individuare le parti del codice che possono essere riusate e di definirle in modo tale da
favorire il riuso (ad es. definendole in classi a sè stanti). Definizione di una
classe NumberField
che gestisce campi di testo formattati per
valori numerici: la classe JFormattedTextField
, la definizione
di un filtro per caratteri e la definizione ed uso di formattatori (NumberFormat
in
java.text
, NumberFormatter
e DefaultFormatterFactory
in javax.swing.text
). I sorgenti commentati e la descrizione dell'applicazione sono nell'archivio JAR
Rate.jar.
Martedì 14 giugno 2011
Esercizi di preparazione alla prova scritta:
Mercoledì 15 giugno 2011
Laboratorio: preparazione progetto.
Venerdì 17 giugno 2011
Simulazione di prova scritta:
This topic: Metod_prog/EO
> WebHome > MPdiario
Topic revision: r108 - 2015-06-18 - RiccardoSilvestri