Algorithmen und Programmierung II


SS 2001 Hannes Federrath
Übung 6 Lars Knipping
Abgabe bis zum 21.06.01.

Aufgabe 1 (7 P.)

In der Vorlesung wurde externes Sortieren mit direktem Mischen (straight merge) und ausgeglichenen Mischen (balanced merge) vorgestellt. Der Quellcode einer Java-Implementierung des direkten Mischens mit drei Bändern für binäre integers findet sich hier.

Schreibe ein Java-Programm, daß eine Binärdatei von shorts mittels ausgeglichenen Mischens sortiert (mit vier Bändern, also je zwei für Aus- und Eingabe).

Zur Erinnerung: beim ausgeglichenen Mischen werden die Läufe bereits in der Mischphase gleichmässig auf die Ausgabebänder verteilt, welche dann in der nächsten Mischphase als Eingabebänder dienen. Eine Verteilungsphase (distribute) ist daher zwischendurch nicht mehr notwendig, lediglich ganz am Anfang muß die Eingabe einmal verteilt werden.

Zum Testen hier ein paar Dateien, zu Kontrollzwecken auch mit bereits sortierten Daten:

Die Sortierergebnisse kann man sich mit einem Hexeditor ansehen oder über einen Hexdump, z.B. unter Unix mit dem Befehl od -x Datei. Achtung: Zuerst kommt das Low- und dann das Highbytes, beispielsweise der short-Wert 1 erscheint als 0100.

Außerdem kann man die Ergebnisse mit den vorsortierten Daten vergleichen mittels des Unixbefehls cmp Datei1 Datei2, der das erste die beiden Dateien unterscheidende Bytepaar ausgibt.

Aufgabe 2 (14 P.)

Schreibe einen Textformatierer. Die Eingabe sind Texte, bei denen die Absätze durch mindestens eine Leerzeile getrennt sind und innerhalb der Absätze Wörter durch whitespaces (Leerzeichen, Tabulator '\t', Zeilenumbruch '\n' oder Wagenrücklauf '\r').

Die Ausgabe soll in Seiten zu je 50 Zeilen erfolgen, wobei die oberste und unterste Zeile einer Seite leer sein soll. Jede Textzeile hat 78 Zeichen, wovon links und rechts je zwei Leerzeichen als Rand gelassen werden.

Der Textformatierer soll die Ausgabe ein- und zweispaltig produzieren können, und den Text dabei linksbündig, rechtsbündig, zentriert und im Blocksatz ausgeben können. Spalten haben einen Abstand von zwei Leerzeichen zueinander. Absätze werden in der Ausgabe durch genau eine Leerzeile oder durch einen Spalten- bzw. Seitenumbruch getrennt.

Beispiel für zweispaltige Formatierung mit Blocksatz.

java.io.BufferedReader (siehe auch Übung 5, Aufgabe 4), java.lang.String, java.lang.StringBuffer, java.util.StringTokenizer und java.util.Vector sind ein paar Javaklassen, die hier nützlich sein können.

Zum Testen ein paar Texte: