| |
CGI Programmierug mit Haskell
[
Inhaltsverzeichnis ] ... [ Fazit ]
Fallbeispiel Damenproblem
Wie schon an anderer Stelle besprochen handelt es sich beim sogenannten Damenproblem
um die Frage wie sich n Damen auf einem n*n großen Schachbrett anordnen
lassen, ohne daß sie sich gegenseitig bedrohen. Das bedeutet, daß pro Zeile und
Spalte genau eine Dame stehen muß und daß nicht zwei Damen auf einer Diagonalen
stehen dürfen. Das Hauptaugenmerk liegt in diesem Fallbeispiel nicht auf dem Algorithmus,
sondern vielmehr in der Darstellung der Lösung.
Die Aufgabe besteht aus zwei Teilen. Zum einen soll der Benutzer über ein
Formular folgende Parameter einstellen können:
- Die Anzahl der Damen(Freitext)
- Die wievielte ermittelte Lösung soll angezeit werden(Freitext)
- Umrandung der Tabelle? (Ja/Nein)(Radiogroup)
- Welches Zeichen soll für die Damen verwendet werden(Auswahlliste)

Für die Eingabe der oben beschrieben Parameter wird ein Formular verwendet, bei
dem alle einzutragenen Felder untereinander aufgeführt sind. Die Entscheidung
darüber, ab das Formular oder die Lösung angezeigt wird, wird anhand des Parameters
Anzahl gefällt. Ist dieser Wert nicht gesetzt, erscheint das Formular. Anderenfalls
wird eine Lösung berechnet.
Wie einfach es ist Fomularelemente zu erzeugen, läßt sich am besten anhand
zweier Beispiele belegen. Das Textfeld in dem der Benutzer angeben kann für
wie viele Damen er eine Lösung berechnet haben möchte wird durch den Aufruf
set [("SIZE", "2"), ("VALUE", "4")] (textfield "anzahl")
erzeugt. Hierbei handelt es sich um ein Textfeld namens anzahl und den
durch die Funktion set zusätzlich hinzugefügten Attributen
und .
Die Listbox für die Auswahl des Zeichens für die Dame läßt sich sehr einfach
durch
menu "zeichen" ["O", "X", "+", "0"]
bewerkstelligen. Der daraus resultierende HTML Quellcode sieht folgendermaßen
aus.
<SELECT NAME="zeichen" >
<OPTION> O </OPTION>
<OPTION> X </OPTION>
<OPTION> + </OPTION>
<OPTION> 0 </OPTION>
</SELECT>
Nachdem durch Auswertung der Parameter eine Lösung der Form [2,4,1,3] ermittelt
wurde, ist es nun an der Zeit, diese in einer Tabelle abzubilden. Die Lösung
soll wie folgt interpretiert werden. In Zeile 1 steht die Dame in Spalte 2,
in den Zeilen 2, 3 und 4 entsprechend in den Spalten 4, 1 und 3.

Die Generierung der Lösungstabelle vollzieht sich in mehreren Schritten. Mit
Hilfe von Rekursion bildet die Funktion werte eine Liste von Listen
von Listen von Elementen des Typs HTML. Dies ist nötig, da eine Tabelle aus
Listen von Zeilen besteht, die ihrerseits eine Liste von Zellen sind, die wiederum
eine Liste von HTML Elementen sind. Als Parameter bekommt werte die
Anzahl der Damen (also Zeilen und Spalten), das Zeichen für eine Dame und die
Lösung selbst.
werte :: Int -> String -> [Int] -> [[[HTML]]]
werte a z (x:[]) = [zeile x a z]
werte a z (x:xs) = [zeile x a z] ++ (werte a z xs)
Mit Hilfe von Pattern Matching wird überprüft, ob es noch weitere Lösungszeilen
zu formatieren gilt. Ist dies der Fall, wird die aktuelle Zeile formatiert und
die Funktion mit dem Rest der Lösungsliste erneut aufgerufen. Das Formatieren
einer Zeile erfolgt durch die Funktion zeile, die als Parameter die Spalte
in der sich die Dame befindet, die Anzahl aller zu erzeugender Spalten und das
Zeichen, mit dem die Dame dargestellt werden soll, erhält. Wiederum durch Rekursion
ruft sie für jede zu erstellende Spalte die Funktion zeichen auf und
generiert somit eine Liste von Zellen (die wie erwähnt eine Liste von HTML Elementen
ist).
zeile :: Int -> Int -> String -> [[HTML]]
zeile m 1 dame = [[zeichen m 1 dame]]
zeile m n dame = (zeile m (n - 1) dame) ++ [[zeichen m n dame]]
Die Funktion zeichen
zeichen m n dame
| m == n = prose dame
| otherwise = prose "."
vergleicht lediglich die beiden hereingegebenen Zahlen und liefert bei Gleichheit
das gewünschte Zeichen für die Dame, sonst einen ".".
Den vollständigen Quelltext finden Sie unter [
Download ].
[
Inhaltsverzeichnis ] ... [ Fazit ]
|
| |
|
|