| Autor |
Beitrag |
wayne123
      
Beiträge: 52
|
Verfasst: Mo 17.10.11 19:53
Also, ich möchte, wenn ich zb. im Edit-Feld (x(yx)y) stehen habe, mit pos oder einer nicht allzu schweren Alternative die die Stelle, an der die letzte öffnende Klammer '(' steht herausfinden. Die dazugehörige Klammer müsste von dieser aus ja eig. immer die dazugehörige Klammer sein, wodurch ich diese ausrechnen kann, die Klammer durch das Ergebnis ersetzen kann und das ganze dann wieder von vorne beginnen kann. Nur wie soll ich die letzte Klammer finden, denn Pos sagt mir ja nur die Stelle, wo die erste ist und alle durchzugehen ist ja zu aufwendig.
|
|
Niko S.
      
Beiträge: 566
Erhaltene Danke: 10
Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
|
Verfasst: Mo 17.10.11 20:00
hm.. Also entweder schaust du Zeichen für Zeichen von hinten durch. Oder mit PosEx.
Der Funktion kannste einen start-wert geben, ab wo sie suchen soll.
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Mo 17.10.11 20:04
Du kannst den String auch einfach einmal umdrehen und dann mit Pos arbeiten.
|
|
wayne123 
      
Beiträge: 52
|
Verfasst: Mo 17.10.11 20:17
Jann1k hat folgendes geschrieben : | | Du kannst den String auch einfach einmal umdrehen und dann mit Pos arbeiten. |
Wie kann man denn den String umdrehen? Und wenn, dann hab ich ja eine verfälschte Stelle für die erste Klammer.
|
|
rushifell
      
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Mo 17.10.11 20:42
Hallo, wenn ich das richtig verstehe, möchtest Du im Grunde wissen, an welcher Position sich die Klammer (yx) befindet?
Ich würde das folgendermaßen machen. Mit einer For-Schleife nach der schließenden Klammer suchen, also ")". Vielleicht ungefähr so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Var i:Integer; ka,kz:Integer; S:String; begin ka:=-1; kz:=-1; For i:=1 to Length(S) do BEGIN IF S[i]='(' then ka:=i; IF S[i]=')' then kz:=i; IF kz<>-1 then break; END; end; |
|
|
wayne123 
      
Beiträge: 52
|
Verfasst: Mo 17.10.11 20:58
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ahh, okay, das Beispiel war doof gewählt, denn es sollte nämlich auch in dem Fall'((xy)x)y(yx)' die letzte Klammer finden und das würde ja hier(glaub ich) nicht funktionieren. Oder würde es so funktionieren, dass bei einer Rechnung immer eine Klammer entnommen wird, die keine weitere Klammer enthält?
|
|
rushifell
      
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Mo 17.10.11 21:08
Also, ich weiss ja nicht, was Du genau vorhast, aber in Deinem Beispiel werden die Klammer in folgender Reihenfolge aufgelöst:
( (xy )x)y(yx)
((xy)x )y(yx)
((xy)x)y (yx )
Wenn Du wirklich die letzte Klammer zuerst finden willst, musste Du den String, wie schon oben vorgeschlagen, von hinten nach vorne durchsuchen:
Delphi-Quelltext 1: 2:
| For i:=Length(S) downto 1 do ... |
Für diesen Beitrag haben gedankt: wayne123
|
|
wayne123 
      
Beiträge: 52
|
Verfasst: Mo 17.10.11 21:19
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
So in der Art wollt ichs auch zuerst machen, aber dein Weg erscheint mir doch viel sinvoller als immer hinten anzufangen, obwohl man das ja garnicht muss. Danke dafür.
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Mo 17.10.11 22:07
| Zitat: | | Wie kann man denn den String umdrehen? Und wenn, dann hab ich ja eine verfälschte Stelle für die erste Klammer. |
Die Funktion StringReverse in StrUtils dreht dir einen String um. Den Index kannst du ja einfach anpassen (Länge - falscher index + 1 = richtiger index).
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 18.10.11 07:11
Wie wäre es mit einer rekursiven Funktion?
Für mich schreit das geradezu danach. Aber ist natürlich Geschmackssache. 
|
|