Donnerstag, 23. Mai 2013

 

Graph Algorithms (POS1:3BHIF)

Erstellen Sie ein Java-Programm zum Zeichnen von gerichteten Graphen. Das folgende Bild zeigt ein mögliches User-Interface.

Anforderungen

Die Nummerierung dient nur, um auf die einzelnen Anforderungen zu referenzieren.
  1. Anlegen von Knoten - Knoten sollen durch einfachen Klick auf die leere Zeichenfläche angelegt werden. Die Beschriftung soll automatisch erfolgen (A, B, C, ...). Die Knoten dürfen sich nicht überlappen.
  2. Anlegen von gerichteten Kanten - durch Ziehen mit der rechten Maustaste soll eine Kante von einem Knoten zu einem anderen Knoten gezeichnet werden können (gerade Linie mit Pfeilspitze). Alternativ kann die linke Maustaste mit gedrückter Strg-Taste verwendet werden.
  3. Die Gewichtung einer Kante soll eingegeben werden können.
  4. Die Gewichtung einer Kante soll geändert werden können.
  5. Knoten sollen durch ziehen verschoben werden können (linke Maustaste), die Kanten von/zu diesem Knoten müssen entsprechend neu gezeichnet werden können. Die Knoten dürfen sich nicht überlappen!
  6. Knoten sollen (de-)selektiert/markiert werden können (Mausklick). Markierung/Selektion soll umgeschaltet werden (toggle).
  7. Kanten sollen (de-)selektiert/markiert werden können (Mausklick). Markierung/Selektion soll umgeschaltet werden (toggle).
  8. Markierte Elemente sollen gelöscht werden können (Menüpunkt, Shortcut Entf).
  9. Ein Graph soll in einer Datei gespeichert werden können.
  10. Ein Graph soll aus einer Datei geladen werden können.
  11. Die Zeichenfläche soll gelöscht werden können.
  12. Im Hilfemenü soll eine Infobox mit Ihrem Namen, der Klasse und dem Erstellungsjahr aufgerufen werden können.
  13. Optional: Eine Hilfe zur Bedienung (Dialogfenster mit HTML-Text).
  14. Optional: Die Sprache soll geändert werden können (Englisch, Deutsch, weitere mit Sprachdateien). Standard ist die Systemeinstellung.
  15. Scrollbars sollen eingeblendet werden, wenn das Fenster kleiner als die benötigte Zeichenfläche ist.
  16. Ein Graph soll gedruckt werden können. Gegebenenfalls auf eine Seite skalieren.
  17. Simulation der Tiefensuche - Ist ein Knoten markiert, so soll die Tiefensuche beginnend nur mit diesem Knoten durchgeführt werden und die einzelnen Schritte dargestellt werden (weiß/grau/schwarz). Ist kein Knoten markiert, so soll der Algorithmus auf alle Knoten angewendet werden.
    Verwenden Sie dazu einen Thread.
  18. Simulation der Breitensuche - Ist ein Knoten markiert, so soll die Breitensuche beginnend nur mit diesem Knoten durchgeführt werden und die einzelnen Schritte dargestellt werden (weiß/grau/schwarz). Ist kein Knoten markiert, so soll der Algorithmus auf alle Knoten angewendet werden.
    Verwenden Sie dazu einen Thread.
  19. Optional: Die Simulation(en) sollen abgebrochen werden können.
  20. Optional: Es soll eine undo/redo-Funktionalität implementiert werden (Command Pattern).
  21. Das Programm soll als "ausführbare" Jar-Datei geliefert werden, d.h. alle nötigen Klassen, Bibliotheken, Grafiken und Konfigurationsdateien (Sprachdateien) sollen sich in dem Jar-Archiv befinden. Aufruf soll nur über java -jar graph.jar möglich sein (meist kann man die graphische Oberfläche so einstellen, dass ein Klick auf die Datei genügt).

Links

Literatur

Labels: , , , , ,


Montag, 13. Mai 2013

 

Übung zu Klassen und Testen (POS1: 2BHIF)

Erstellen Sie eine Klasse IntTable, welches das folgende Interface IIntTable implementiert. Die nötigen Methoden und deren Zweck ist im Interface in den Kommentaren beschrieben.
// @formatter:off
/**
 * Project: IntTable
 * Package: bo
 * File:    IIntTable.java
 * Created: May 13, 2013, Harald R. Haberstroh
 */
// @formatter:on
package bo;

/**
 * Describe interface of IntTable.
 * 
 * @author Harald R. Haberstroh (May 13, 2013)
 *
 */
public interface IIntTable {
    /**
     * Add one empty row (extend the table by one row).
     */
    public void addRow();
    
    /**
     * add an int array as new row (at the end).
     * numCols will be increased by one.
     * @param row int array with data
     * @throws IllegalArgumentException if row.size != numCols()
     */
    public void addRow(int[] row) throws IllegalArgumentException;
    
    /**
     * Add one empty column (extend the table by one column).
     */
    public void addCol();
    
    /**
     * add an int array as new column (at the right end).
     * numRows will be increased by one.
     * @param col
     * @throws IllegalArgumentException if col.size != numRows()
     */
    public void addCol(int[] col) throws IllegalArgumentException;

    /**
     * @return number of rows
     */
    public int numRows();
    
    /**
     * @return number of columns
     */
    public int numCols();
    
    /**
     * get element denoted by row and column.
     * @param row
     * @param column
     * @return element at given position
     * @throws NoSuchElementException if row or column invalid
     */
    public int get(int row, int column) throws NoSuchElementException;
    
    /**
     * set element denoted by row and column.
     * @param row
     * @param column
     * @param value
     * @throws NoSuchElementException if row or column invalid
     */
    public void put(int row, int column, int value) throws NoSuchElementException;
    
    /**
     * get whole row.
     * @param row index
     * @return array of values at given row
     * @throws IllegalArgumentException if row is invalid
     */
    public int[] getRow(int row) throws IllegalArgumentException;
    
    /**
     * get whole column.
     * @param column index
     * @return array of values at given column
     * @throws IllegalArgumentException if row is invalid
     */
    public int[] getCol(int column) throws IllegalArgumentException;
    
    /**
     * generate string containing the whole table in python format
     * (list of list in brackets).
     * For example:
     * [
     *   [ 1, 2, 3, 4],
     *   [ 2, 4, 6, 8],
     *   [ -1, 3, 6, 9]
     * ]
     * @return readable table
     */
    public String toString();
}
Ergänzen Sie die Klasse IntTable um folgende Konstruktoren:
    /**
     * default matrix has no elements at all.
     */
    public IntTable() { }

    /**
     * initialize with given 2 dimensional array
     * @param matrix
     */
    public IntTable(int[][] matrix) { }

    /**
     * create new table filled with zeros.
     * @param rows number of rows
     * @param columns number of columns
     */
    public IntTable(int rows, int columns) { }
Warum können Konstruktoren nicht über das Interface vorgegeben werden?

Schreiben Sie eine main() mit der die Funktionsweise der Klasse getestet werden soll. Testen Sie auch die Exceptions, indem Sie diese auslösen (und abfangen). Beachten Sie auch Grenzfälle (leere Tabelle: Zugriff, addRow(), toString() usw.)

Ergänzen Sie Ihr Projekt gegebenenfalls um fehlende Exceptions.

Labels: ,


 

Aufgabe Gruppenwechsel (POS1: 2BHIF)

Schreiben Sie eine Java-Klasse Grw.java, welches aus dem Datenbestand ski.csv die beigelegte Statistik erzeugt.

Ausschnitt csv-Datei ski.csv als Bild

Lesen Sie die csv -Datei zeilenweise und erstellen Sie aus jeder Zeile ein Objekt einer Klasse SkiDaten, die alle notwendigen Attribute (Klasse, Name, Geb.Datum,....) enthält.
Nennen Sie das Projekt grwski (also insgesamt z.B. 2ad-haberstroh-grwski).
Sollte eine neue Sortierung des Sätze notwendig sein, bitte mit OpenOffice Calc oder Excel sortieren. 1-er Kandidaten sortieren bitte mit eigenem Sortprogramm.
INFO: es handelt sich um einen zweistufigen Gruppenwechsel mit den Gruppen
KLASSE und GESCHL
und einer Gesamtdarstellung des Durchschnitts!
Eine Einführung in den Gruppenwechsel finden Sie in der Datei gruppenwechsel.pdf
Aufruf des Programms:
java Grw [-h | -o ausgabedat] [-d] eingabedatei

Die Option -d bewirkt die Ausgabe der Detailzeilen, ohne -d nur Summenzeilen ausgeben!
Beispiel Statistik:
------------------------------------------------------------------
STATISTIK zum Schuelerrennen der HTL am SKIKURS 2006 in OBERTAUERN
------------------------------------------------------------------

AMINGER                   Georg                            0.02
ELIAS                     Thomas                           0.97
GALAVICS                  Marcus                           0.15
GALLAUNER                 Alexander                        0.26
HECHER                    Markus                           0.58
HERMANN                   Gregor                           0.65
KAMPER                    Raphael                          0.55
KRIVOKUCA                 Milan                            7.73
MOSER                     Christoph                        2.34
NEPOLA                    René                             0.14
PRIELER                   Stefan                           0.63
RECHBERGER                Christian                        3.11
RIEGLER                   Mario                            0.87
SCHNEEBERGER              Joerg                            1.22
SENN                      Bernhard                         0.65
WIESSNER                  Maximilian                       1.61
ZENZ                      Markus                           2.04

die durchschnittliche Zeitdifferenz bei den MAENNERN betraegt:  1.38

die KLASSE 2AHDV   erreichte eine Durchschnittsdifferenz von  1.38 Sekunden


CMUND                     Katharina                        2.81
HARATHER                  Alice                            1.87
KONLECHNER                Viktoria                         0.39
RIEGER                    Jennifer                         0.63
RINNHOFER                 Elisabeth                        1.65
...........................................................

...........................................................
REICHHART                 Thomas                           0.30
RIEDER                    Dominik                          1.07
SCHERMANN                 Georg                            0.85
STANGL                    Stefan                           1.48
STAUFER                   Andreas                          0.47

die durchschnittliche Zeitdifferenz bei den MAENNERN betraegt:  2.38

die KLASSE 3CHDV   erreichte eine Durchschnittsdifferenz von  2.36 Sekunden
************************************************GESAMT-Differenz :  1.93

Achtung: Die obige Ausgabe stellt nur einen Ausschnitt dar (Aufruf mit Option -d) und es wurde die vorletzte Zeile (Hüpfner) gelöscht, da dort extrem abweichende Zeiten vorkommen (die Schülerin ist scheinbar gestürzt). Die Gesamt-Different würde mit dieser Zeile 11,37 Sekunden betragen.

Binäres Dateiformat für Eingabe


Erstellen Sie ein neues Programm so, dass sie statt der CSV-Eingabedatei auch eine Datei im binären Datenformat verwenden können. Die Daten sind wie folgt gespeichert (C-Datentypen):
typedef struct umsatz {
    char artikel[25];
    char verkaeufer[25];
    int  vkpreis;
    int  monat; 
} umsatz_t;
Dabei ist char artikel[25] ein maximal 24-Zeichen langer String, bei dem jedes Zeichen (ASCII) als ein Byte gespeichert wird. Das Ende des Strings wird durch das Zeichen '\0' abgeschlossen (das hat tatsächlich den Wert 0). D.h. es müssen bis zu 25 Bytes gelesen werden, wobei nur die Zeichen bis exklusive '\0' (direkt) in Java-chars umgewandelt werden können (verwenden Sie z.B. RandomAccessFile.read(byte[] buf)).
int entspricht einem 32-Bit-Integer und passt zum Java-Typ int.
Die passende Datei mit Testdaten finden Sie hier: daten.dat.

Den Inhalt dieser Datei kann man nur mit einem Programm öffnen, das die Daten binär lesen kann und sinnvoll, z.B. im Hexadezimalsystem, anzeigen kann. khexedit oder das Konsolenprogramm hexdump eignen sich dafür.

Die Ausgabe von hexdump könnte so aussehen (gekürzt):
hp@L211 $ hexdump -C daten.dat 
00000000  50 72 6f 64 30 31 00 01  4c 00 ba 01 e5 e2 e6 b7  |Prod01..L.......|
00000010  00 00 00 00 e4 98 04 08  28 4d 61 69 65 72 00 08  |........(Maier..|
00000020  a0 fc f5 b7 dc e9 b9 bf  48 e9 b9 bf f1 86 04 08  |........H.......|
00000030  90 8b f8 b7 dc 00 00 00  01 00 00 00 50 72 6f 64  |............Prod|
00000040  30 32 00 01 4c 00 ba 01  e5 e2 e6 b7 00 00 00 00  |02..L...........|
00000050  e4 98 04 08 28 4d 61 69  65 72 00 08 a0 fc f5 b7  |....(Maier......|
00000060  dc e9 b9 bf 48 e9 b9 bf  f1 86 04 08 90 8b f8 b7  |....H...........|
00000070  90 01 00 00 02 00 00 00  50 72 6f 64 30 33 00 01  |........Prod03..|
00000080  4c 00 ba 01 e5 e2 e6 b7  00 00 00 00 e4 98 04 08  |L...............|
00000090  28 48 75 62 65 72 00 08  a0 fc f5 b7 dc e9 b9 bf  |(Huber..........|

Es soll wieder ein 2-stufiger Gruppenwechsel programmiert werden (Artikel und Verkäufer).
Zum Vergleich können Sie die Daten auch im CSV-Format verwenden: daten.csv.

Versuchen Sie, die beiden Varianten, jene mit den Ski-Daten und jene mit den (binären) Umsatzdaten, so zu gestalten, dass nur geringe Teile unterschiedlich sind (am Besten austauschbare Klassen mit gleichem Namen für die Daten und für die Formatierung). Der Hauptalgorithmus bleibt ja gleich.

Labels: , , ,


This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]