Note di rilascio della versione 1.0

Premessa

Queste note vanno pensate per chi voglia non solo usare il programma ma studiarsi il codice, magari per produrne una nuova versione modificata.

Funzionamento

Il programma proposto si occupa della risoluzione del famoso rompicapo matematico delle Torri di Hanoi, costituito da tre paletti e da un certo numero di dischi di grandezza decrescente.
Lo scopo del rompicapo è quello di spostare tutti i dischi dal primo paletto al terzo, utilizzando il secondo come paletto d'appoggio. Considerando il fatto che un disco più grande non può essere messo sopra un disco di dimensione minore. Il programma eseguendo operazioni in background scritte in Java, evidenzia le istruzioni presenti in una TextArea che sarebbero state effettuate in linguaggio Assembly del Pentium IV.
Viene implementata quindi un' interfaccia grafica, che aiuta la comprensione di ciò che avviene.


L'esecuzione dell'algoritmo di risoluzione avviene step by step, in modo tale da evidenziare in un' apposita TextArea, dettegliate informazioni dei passi ricorsivi.

È possibile andare avanti con l'esecuzione premendo un pulsante apposito: testo

Struttura codice

Il programma è strutturato in due classi: Esegui e Gui2.
Esegui contiene il Main che fa partire il programma, mentre la classe Gui2 si occupa di tutta la gestione dell'interfaccia grafica.



Tecniche di programmazione

Ho riscontrato alcune difficoltà nella gestione del pulsante Next e la simulazione step by step dell'algoritmo ricorsivo di Hanoi, (infatti risultava difficile fermare in maniera elegante l'esecuzione dopo ogni passo e farla ripartire quando il pulsante Next veniva premuto). Per evitare l'utilizzo di thread, sapendo che i numeri di passi dell'algoritmo sono limitati, a causa di una scelta limitata del numero di dischi, ho pensato di memorizzare in Array tutte le informazioni necessarie per eseguire il programma, risolvendo così il problema.

I 2 Array in questione: passi[][] e testo[][], memorizzano rispettivamente quale passo ricorsivo viene eseguito in quell'istante, e quale parte di codice in Assembly evidenziare nella TextArea. Gli Array sono gestiti nel metodo mouseClicked.
Nel metodo mouseClicked si gestiscono inoltre i click effettuati su Next.

La parte grafica è così composta: le immagini relative alle colonne e ai dischi non sono altro che dei JLabel in cui viene messo uno sfondo, che in base alle esigenze viene modificato.
Il bottone Next è un JButton che cattura l'evento di un MouseListener.
Sono presenti due jTextArea: JTextArea1 fornita di JScrollPane, mostra il codice in Assembly, JTextArea2 che mostra le informazioni dettagliate dei singoli passi ricorsivi.

Dato che il programma può essere eseguito in schermi con risoluzioni diverse, per avere una certa versatilità sono stati usati dei layout che gestiscono i vari componenti, ridimensionandoli in base alla grandezza della finestra. In base alla risoluzione dello schermo dell'utente che esegue il programma vengono scelte delle immagini con dimensione diversa.(Risoluzione ottimale: 1366x768. Risoluzione minima:800x600)
In particolare la finestra è gestita da un GridLayout, il Panel1 e Panel2 da un GridBagLayout.


Layout Componenti

I componenti del JFrame principale sono organizzati tramite un GridLayout. Nel panel principale (Panel1) la gerarchia è cosi composta: JScrollPane con TextArea1 a ovest, JButton al centro-nord, JScrollPane con TextArea2 a nord-est, al centro è presente il Panel2 contenente i vari JLabel. Nel JPanel1 e JPanel2 ho utilizzato un GridBagLayout.
Nella finestra di selezione grandezza è stato utilizzato un GridBagLayout.

Collaudi

Il programma è stato collaudato senza riscontrare nessuna problematica nei seguenti sistemi operativi: Windows 7 e Ubuntu 10.10

UML

asd asd
Classi
La classe Esegui contiene un' istanza della classe Gui2, la inizializza e richiama il seguente metodo:

1. setVisible(true) che rende visibile la finestra principale;
La classe Esegui oltre al Main non contiene alcun metodo.

La classe Gui2 crea l'interfaccia grafica della finestra principale con un JFrame, un JPanel che contiene JTextArea e JButton e
un ulteriore JPanel che contiene i JLabel.
I JLable contengono le immagini che formano le colonne con i dischi. La finestra di scelta della grandezza è composta da JButton, la finestra delle Info da un Jlabel e da un TextFiel.

Metodi contenuti in Gui2
1. initComponents() inizializza tutte le componenti sopra descritte creando la finestra completa di tutte le componenti.
2. info() crea la finestra delle info che appare premendo JMenuItem "About".
3. sceltaG() crea la finestra iniziale di scelta numero dischi.
4. insertColumn() inserisce N dischi iniziali in base al numero scelto dall'utente, in particolare cambia
le immagini contenute nei JLabel con le relative immagini dei dischi.
5. setColonne(String,String) gestito in MouseClicked cambia lo sfondo dei JLabel, sposta i dischi
da una colonna all'altra in ordine delle chiamate ricorsive.
6. resolve(int,int,int,String,String,String) è l'algoritmo che risolve il problema di Hanoi, memorizza i passi ricorsivi
e quale parte di testo nella JtextArea1 evidenziare.
7. MouseCliked(MouseEvent) gestisce i click sul pulsante Next, consentendo di simulare l'algoritmo step by step.
Utilizzando l'Array testo[][] evidenzia le relative istruzioni Assembly in relazione alla simulazione sopra descritta.
8. ActionPerformed(ActionEvent) gestisce i click sui MenuItem.


I seguenti metodi non sono stati implementati.
mouseEntered(MouseEvent )
mouseReleased(MouseEvent)
mousePressed(MouseEvent)
mouseExited(MouseEvent)

Codice Progetto


Scritto e compilato con "SciTE". Per l'implementazione dell'algoritmo di Hanoi è stato preso uno spunto dal libro:
Strutture dati e algoritmi in Java Autore: M.T. Goodrich, R. Tamassia


Codice in Assembly



FONTE: Architettura dei calcolatori - Un approccio strutturale (Andrew S. Tanenbaum).


Alcuni Screenshots

Situazione iniziale.
asd asd
Fase intermedia. asd asd asd asd Situazione finale.


Possibili miglioramenti futuri


1. Possibilità di scelta di un numero maggiore di dischi.
2. Utilizzo di thread per stoppare l'esecuzione dell'algoritmo Hanoi e farlo ripartire con il pulsante next, in alternativa all'utilizzo di array.
3. Ulteriore implementazione del menù con altre funzionalità.
4. Possibilità di scelta di un diverso layout dei componenti.


Valid HTML 4.01 Transitional