Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » klammern in einem string suchen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.12.2005, 19:05 Uhr
~mimi_parapluie
Gast


hallo!

hab bei meinem programm folgendes teilproblem:

gegeben ist ein string [zb: text = "a * (b + c * (d + 1) + x)"], der nach klammern durchsucht werden soll. genauer gesagt wird die funktion mit text[index] aufgerufen und soll den kürzesten geklammerten arithmethischen teilausdruck liefern, der text[index] enthält.

ich geb einfach mal ein konkretes beispiel dazu an:
(das unterstrichene ist jeweils text[index])

text Ergebnis
-------------------------------------------------------
»a * (b + c * (d + 1) + x)« »a * (b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »a * (b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »a * (b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »a * (b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(b + c * (d + 1) + x)«
»a * (b + c * (d + 1) + x)« »(d + 1)«
...usw

falls der ausdruck für text[index] falsch geklammert sein sollte (etwa weil eine klammer fehlt), dann soll nur " " ausgegeben werden.
ob zwischen den klammern ein gültiger ausdruck steht braucht nicht überprüft werden, relevant sind nur die klammern.

ich komm einfach nicht drauf, wär super wenn von euch mir jemand weiterhelfen könnte.
tia,
mimi.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.12.2005, 19:18 Uhr
predator



Benutzt du C++ und std::string?
Dann schau dich mal hier ein bisschen um, z.B. find und substr
Wegen den Klammernfehlern:
Du könntest z.B. einen Counter für die Klammern anlegen, eine öffnende Klammer erhöht ihn um eins, eine schließende senkt ihn um eins. Wenn am Schluss nicht der Anfangswert herauskommt, weißt du, dass irgendwo ein Klammerfehler ist.
--
Gruß
predator
Zitat von Edsger W. Dijkstra:
Es ist praktisch unmöglich, einem Studenten gutes Programmieren beizubringen, wenn er vorher in BASIC programmiert hat. Als potenzielle Programmierer sind sie geistig verstümmelt ohne Hoffnung auf Erholung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.12.2005, 20:15 Uhr
~mimi_parapluie
Gast


ja ich benutz c++ und std::string.

auf die seite, die du mir ans herz gelegt hast, bin ich auch schon gestoßen. leider weiß ich nicht wie ich die einzelnen sachen kombinieren soll.

mein problem ist ja, dass ich es nicht allgemeingültig formulieren kann.

ein ansatz, den ich mir überlegt hätte, wär sozusagen "ebenen" zu schaffen, in denen klammern ignoriert werden.
zb string text = "a * (b + c * (d + 1) + x)"
ebene2 wäre dann (d + 1), also der innerste ausdruck (hier gibts keine klammern zu ignorieren)
ebene1 wäre (b + c * (d + 1) + x), wobei hier die inneren klammern zu ignorieren wären.
ebene2 wäre der ganze string text.

aber wie ich das in c++ umsetzten soll...keine ahnung?!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.12.2005, 21:33 Uhr
predator



Du musst halt überprüfen, ob text[index] eine öffnende Klammer ist; wenn ja musst du jedes nachfolgende Zeichen auf Klammern überprüfen: wenn eine schließende Klammer kommt, kannst du den Teilstring mit substr zurückgeben, wenn eine öffnende Klammer kommt, brauchst du eben zwei schließende Klammern und gibst dann den Teilstring von der ersten öffnenden Klammer bis zur zweiten schließenden Klammer zurück.
Wenn text[index] keine Klammer ist, musst du eben solange im String zurückgehen (Richtung Anfang), bis eine öffnende Klammer kommt und dann die oben genannten Schritte anwenden; wenn keine öffnende Klammer kommt, gibst du einfach den ganzen String zurück.
Was dabei aber nicht beachtet wird, ist die Rangfolge der Operatoren, also z.B. Punkt vor Strich; es wird nur nach Klammern gegangen.
--
Gruß
predator
Zitat von Edsger W. Dijkstra:
Es ist praktisch unmöglich, einem Studenten gutes Programmieren beizubringen, wenn er vorher in BASIC programmiert hat. Als potenzielle Programmierer sind sie geistig verstümmelt ohne Hoffnung auf Erholung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.12.2005, 23:55 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das riecht irgendwie stark nach grammatik und daraus nen Abstrakten Syntaxbaum basteln...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.12.2005, 00:25 Uhr
(un)wissender
Niveauwart


Geh schlafen....
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: