www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Anfaenger

Gepostet:
02.12.2010 19:51

Paare von Klammern sollen ein Bool wert ausgeben (Lexing und Parsing)  
Guten Abend,

ich soll eine Funktion schreiben, die erkennt ob nicht mehr und nicht weniger "Klammern zu" wie "Klammern auf" in einem String enthalten sind und das als Boolschen Wert ausgeben.
Funktionsname und Typendeklaration: paren :: String -> Bool

Ein Beispiel:
paren "(()(()))" == True
paren "(()))())" == False

Als wäre das nicht schon schwer genug, so sollen wir keine Biblitotheksfunktionen benutzen und Ascii Codes sind auch nicht erwünscht.

Jetzt hab ich mir schon Gedanken gemacht wie ich das machen könnte, aber ich weiß nicht wie ich das in Haskell schreibe. Zuerst würde ich eine Hilfsfunktion schreiben, die alle Klammern zählt, die auf und zu sind. Anschließend würde ich eine Funktion schreiben die beide werte vergleicht und nach dem verglichenen Ergebnis den jeweiligen Wert ausgibt.
Mit dem ganzen habe ich auch schon angefangen aber es will nicht laufen :-(

Kann mir jemand ein Tip geben was ich falsch gemacht habe?

Leibe Grüße Matthias
Zum Seitenanfang ICQ    
 
Siracusa

Gepostet:
03.12.2010 20:51

   
Hallo,

der Algorithmus ist an sich richtig, ohne den bisherigen Code wird es allerdings schwierig den Fehler zu finden ;-)


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Anfaenger

Gepostet:
04.12.2010 16:42

   
Hallo,

ok ich hab mir weite Gedanken gemacht und bin dann so ziemlich selbst drauf gekommen. ;-)
Ist eigentlich ganz klar, wenn ich nur eine einzige Funktion schreibe um "(" und ")" zu zählen, und die zu vergleichen wird es wohl etwas kompliziert.
Also dacht ich mir ich mach aus eine aufgabe drei Funktionen, das sieht dann so aus.

paren :: String -> Bool
paren (x) = if (length2 (x)) == (length3 (x)) then True else False

-- Hilfsfunktion zum Klammern zählen
length2 :: String -> Int
length2 [] = 0
length2 (x:xs) =if x == '(' then 1 + length2 xs else length2 xs

length3 :: String -> Int
length3 [] = 0
length3 (x:xs) =if x == ')' then 1 + length3 xs else length3 xs

die erste Hilfsfunktion zählt alle "(" und die zweite Hilfsfunktion zählt alle ")" und die Hauptfunktion vergleicht die beiden Ergebnisse.

Ich hoffe es ist ok dass ich mir jetzt selbst die Antwort gegeben habe, ist leider nicht in allen Foren gern gesehen. Es ist bestimmt gut zu wissen wo man nachlesen kann, wennwieder das oder ein ähnliches Problem auftritt ;-)

Liebe Grüße Matthias
Zum Seitenanfang ICQ    
 
Anfaenger

Gepostet:
05.12.2010 12:36

   
Hallo,

jetzt habe ich ein neues Problem, wir sollen nämlich nun die Funktion so umschreiben, dass das Programm auch weiß in welcher reihen folge die Klammern angeordnet sind.

Beispielsweise müsste die Funktion False ausgeben wenn sie diesen Eingabewert bekommt "))((" unsre Funktion gäbe True aus, weil genau so viele "(" wie ")" da sind aber leider in der falschen reihen folge.

Hat jemand eine Idee wie ich das abändern könnte?

Ich denke mal was getan werden muss ist klar, man müsst in der Funktion z.B. schreiben head (x) muss "(" sein und head(tail(x) sollte muss aber nicht ")" das ist mein Problem denn so was ist auch korrekt "(())"

Danke für eure Hilfe viele Grüße Matthias
Zum Seitenanfang ICQ    
 
Siracusa

Gepostet:
05.12.2010 17:47

   
Hallo,

da du nur eine Art von Klammern hast, ist die Funktion relativ einfach zu realisieren. Was du brauchst ist eine Hilfsfunktion, die einen zusätzlichen Int-Parameter erhält, der die bereits gelesenen öffnenden Klammern zählt. Dann läuft die Funktion rekursiv durch den String und unterscheidet folgende Fälle:

1.) Eine öffnende Klammer wurde gelesen, dann wird der Zähler um eins erhöht und weitergelaufen;
2.) eine schließende Klammer wurde gelesen und der Zähler ist größer als 0, dann wird der Zähler um eins erniedrigt und es wird weitergelaufen;
3.) eine schließende Klammer wurde gelesen und der Zähler ist gleich 0, dann endet die Funktion mit einem Fehler bzw. gibt False zurück.

Zudem muss noch der leere String betrachtet werden, der immer True zurückliefert, und die Hilfsfunktion mit einem leeren Zählerstand initalisiert werden.

Dieses Verfahren liefert also einen Fehler, sobald im String irgendwo eine schließende Klammer auftritt und zuvor alle öffnenden Klammern bereits geschlossen wurden.


Viele Grüße,

Siracusa
Zum Seitenanfang