Gepostet: |
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 | ||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
|||||||||||
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 | ||||||||||
Gepostet: |
|||||||||||
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 | ||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||