Esercitazioni di laboratorio

In questa pagina vengono riassunte tutte le esrcitazioni fatte in laboratorio. Viene messo a disposizione degli studenti del corso il materiale didattico usato durante le esercitazioni (lucidi, codici sorgenti, testi degli esercizi).

In caso di problemi contattare Luca Ferrari: ferrari.luca@unimo.it


Come ottenere le parentesi graffe su una tastiera italiana
Errori comuni che possono capitare nell'esecuzione di programmi Java
Individuare gli errori interpretando le eccezioni
Come produrre la documentazione Javadoc
Confronto fra le prestazioni di versioni successive delle JVM SUN


ESERCITAZIONE 1
Data dell'esercitazione Riassunto degli argomenti trattati
23/04/2004,
aula magna
Programmazione ad oggetti: motivazioni e vantaggi. Astrazione di dati e implementazione mediante linguaggi non orientati agli oggetti; discussione su vantaggi e svantaggi.
Implementazione di un dato astratto e di un tipo di dato astratto per la gestione di un conto corrente in C.
Storia di Java e cenni alle motivazioni che hanno portato alla nascita di tale linguaggio.
Introduzione all'installazione degli strumenti di sviluppo Java (compilatore, virtual machine) e dell'ambiente JCreator su piattaforma Windows.
Download
Realizzazione di un dato astratto in C: main1.c
cc.c
cc.h
Realizzazione di un tipo di dato astratto in C: main2.c
ccADT.c
ccADT.h
Lucidi sull'installazione di Java e JCreator: installazione_java.pdf

ESERCITAZIONE 2
Data dell'esercitazione Riassunto degli argomenti trattati
30/04/2004,
laboratorio base
Introduzione all'ambiente di sviluppo JCreator: progetti, file sorgenti, compilazione ed esecuzione.
Implementazione di un semplice conto corrente in Java: variabili private di istanza e metodi di accesso. Implementazione di una classe contenitore per il metodo main, creazione di vettori (array) di dati primitivi e di oggetti. Utilizzo di this per risolvere l'ambiguita'.
Download
Realizzazione di un conto corrente semplice: testo dell'esercizio
ContoCorrente.java
StartCC1.java
(classe che contiene il main)
Realizzazione di un conto corrente con titolare: testo dell'esercizio
ContoCorrente2.java
Cliente.java
StartCC2.java
(classe che contiene il main)
Lucidi sull'utilizzo di base dell'ambiente JCreator: utilizzo_jcreator.pdf
Invocazione ricorsiva del metodo main: test.java
(invocazione ricorsiva del metodo main)


ESERCITAZIONE 3
Data dell'esercitazione Riassunto degli argomenti trattati
7/05/2004,
laboratorio base
Ereditarieta', classi astratte, specificatori di accesso.
Classi astratte contro classi adapter: vantaggi e svantaggi. Specificatori di accesso protected contro private: vantaggi e svantaggi.
Implementazione di una catena di ereditarieta' di veicoli.
Utilizzo dell'operatore super come riferimento esplicito alla classe base o ai costruttori della classe base.
Download
Implementazione di una gerarchia di veicoli: testo dell'esercizio
figura con lo schema delle classi
Veicolo.java
VeicoloTerrestre.java
Auto.java
Barca.java
VeicoliPrinter.java
MainVeicoli.java
(classe che contiene il main)

ESERCITAZIONE 4
Data dell'esercitazione Riassunto degli argomenti trattati
14/05/2004,
laboratorio base
Input ourtput di testo su file mediante le classi FileWriter/FileReader e gli stream bufferizzati. Implementazione di un semplice meccanismo per il salvataggio/caricamento di parametri per applicazioni simulando il comportamento delle Properties di Java.
Serializzazione di oggetti: scrittura e lettura dello stato degli oggetti su stream, con particolare riferimento ai file. Scrittura di codice pulito mediante clausole try-catch ordinate.
Download
Input/Ouput di proprieta' su file di testo: testo dell'esercizio
Parametri.java
(classe che contiene il main)
Serializzazione di oggetti, il caso della Famiglia: testo dell'esercizio
Persona.java
Famiglia.java
MainFamiglia.java
(classe che contiene il main)

ESERCITAZIONE 5
Data dell'esercitazione Riassunto degli argomenti trattati
21/05/2004,
laboratorio base
Controllo dei parametri delle funzioni:IllegalArgumentException.
Concetti generali di programmazione di interfacce grafiche. Come utilizzare i pannelli per disegnare.
JFrame e menu, concetti di base.
Classi adapter e gestione della chiusura delle finestre di applicazione.
Gestione degli eventi AWT.
Download
Programma per disegnare grafici di funzioni: libreria di base
Documentazione Javadoc della libreria di base
Lucidi sull'importazione di librerie in formato Jar

testo dell'esercizio
schema delle classi
Funzione.java
Sin.java
Retta.java
XQuadro.java
Exp.java
WindowCloser.java
MainFunzioni.java
(classe che contiene il main)
Posizionamento indipendente dalla risoluzione dello schermo: Finestra che si visualizza al centro dello schermo



Come ottenere le parentesi graffe su una tastiera italiana



Le tastiere con un layout differente da quello americano non hanno dei tasti con le parentesi graffe. E' possibile ottenere tali parentesi in uno dei seguenti modi (alcuni potrebbero non funzionare a seconda del programma usato):







Principali errori nell'esecuzione di programmi Java






Individuare gli errori mediante le eccezioni



Le eccezioni rappresentano errori di esecuzione. Il sistema di eccezioni di Java è molto completo e complesso, per una sua trattazione si rimanda alle lezioni del prof.Cabri. Tuttavia, anche senza conoscere i dettagli di funzionamento del meccanismo ad eccezioni, è possibile utilizzarle per scovare gli errori nei programmi e quindi correggerli.
Ecco come si presenta l'output di un programma che genera un'eccezione.

Exception in Thread "main": java.lang.ArrayIndexOutOfBoundsException: 10
at jaas.Untitled1.main(Untitled1.java:18)
Exception in thread "main"


La prima riga riporta la classe che identifica il tipo di eccezione/errore (in questo caso java.lang.ArrayIndexOutOfBoundsException). E' possibile cercare nella documentazione Javadoc il significato attribuito alla classe di eccezione, ossia le condizioni in cui tale errore si verifica.
La seconda riga indica il punto in cui l'eccezione si è verificata, in modo che il programmatore possa trovare corrispondenza nel codice sorgente. L'indicazione sull'errore è formattata nel seguente modo:

package.nome_classe.nome_metodo(nome_file:riga)

ossia viene indicato il nome della classe nella quale si è verificato l'errore, il nome del metodo (l'etichetta che precede le parentesi), il nome del file e la riga di codice che ha generato l'errore. Basta aprire nome_file e portarsi alla riga riga per individuare la riga di codice che ha generato il problema.







Come produrre la documentazione Javadoc



Per produrre la documentazione Javadoc si puo' utilizzare il comando javadoc da una finestra prompt dei comandi o, in alternativa, si puo' impostare l'ambiente JCreator affinchè esegua javadoc direttamente.
In entrambi i casi è consigliata la configurazione del PATH in maniera opportuna per gli strumnti del compilatore Java (si vedano a tal proposito i lucidi
installazione_java.pdf).

Da prompt dei comandi:

  1. spostarsi nella directory che contiene i sorgenti Java interessati
  2. digitare javadoc -private *.java
  3. il risultato dovrebbe essere come nella figura sotto riportata. Al termine i file HTML con la documentazione saranno presenti nella directory corrente.



All'interno di Jcreator:
  1. impostare un tool per l'esecuzione di Javadoc: selezionare il menu configure, options e cliccare sulla voce tools.


  2. cliccare sul pulsante new e selezionare DOS command. Nella finestra di dialogo che si apre digitare javadoc *.java. Confermare con il pulsante OK e chiudere la finestra delle opzioni.


  3. selezionando il tool apposito dalla barra dei tool la compilazione Javadoc viene avviata, e la finestra di output mostra i risultati.







Confronto fra le prestazioni di versioni successive delle JVM SUN



Quelli che seguono sono alcuni semplici risultati di un confronto fatto su versioni differenti delle JVM prodotte da SUN. Tali risultati non sono da considerarsi definitivi e/o professionali, e sono forniti al solo scopo di dare un'idea dei tempi di esecuzione delle singole JVM.
Il frammento principale del codice Java utilizzato e' il seguente:
for(int i=0;i<500;i++)
for(int j=0;j<500;j++)
for(int k=0;k<500;k++)
Math.sqrt( (double) i+j+k );

ove si faceva variare l'indice comune ai cicli for per ottenere un numero complessivo di radici calcolate differente. I programmi sono stati compilati con il compilatore a corredo della JVM, al fine di usufruire di tutte le ottimizzazioni possibili. I test sono stati eseguiti su una workstation SUN Ultra Sparc con sistema operativo SUN Solaris 5.8

Test eseguito JVM 1.2.2 JVM 1.4.2 JVM 1.5.0 beta
50^3 26-28 msec 117-147 msec 152-164 msec
500^3 26,533 sec 27,178 sec 27,601 sec
500^3 + apertura di un JFrame 32,709 sec 31,059 sec 33,193 sec