![]() |
while-Schleife funktioniert nicht
Hi Leutz,
Im Zuge von Automaten, unendlichen wie endlichen, sollen wir einen Termüberprüfer basteln. Ich sitze grade an den Klammern, aber irgendwie hab' ich ein Problem mit dem folgenden Code:
Code:
Dazu ist zu sagen, dass EEingabe mein Eingabeeditfeld, K meine Klammervariable ist, ein Integer. Die ist quasi mein Keller, bzw. Stack. Geht das?
procedure TFTerm.BPruefenClick(Sender: TObject);
var i: integer; n: integer; begin i := 1; n := EEingabe.SelLength; if n > 0 then begin while i<n do begin if EEingabe.Text[i] = '(' then K := K+1 else if ((EEingabe.Text[i] = ')') and (K>0)) then K := K-1 else if EEingabe.Text[i] = ')' then K := K+1; Label1.Caption := inttostr(K); inc(i); end end; end; Vorher habe ich noch
Code:
gesetzt.
procedure TFTerm.FormCreate(Sender: TObject);
begin K := 0; end; Wieso funktioniert die Überprüfung nicht? Wäre über Antwort erfreut! ^^ |
Re: while-Schleife funktioniert nicht
Hallo Arc,
ich verstehe den Code nicht. Warum wir k inkrementiert, wenn das Zeichen ein ')' ist und k nicht größer als 0 ist? Erklär doch mal, was du machen willst. |
Re: while-Schleife funktioniert nicht
Delphi-Quellcode:
bist du dir sicher, dass du nicht lieber die Eigenschaft Text nehmen willst?
n := EEingabe.SelLength;
So wie es aussieht ist die Bedingung:
Delphi-Quellcode:
sinnlos, da sie bei:
if n > 0 then
Delphi-Quellcode:
schon abgedeckt wird.
while i<n do
Keine Ahnung ob ich's richtig verstanden hab. Trotzdem viel spaß beim proggen |
Re: while-Schleife funktioniert nicht
Guten Abend,
vielleicht geht es so?
Delphi-Quellcode:
oder so:
procedure TFTerm.BPruefenClick(Sender: TObject);
var i: integer; n: integer; begin i := 1; n := length(EEingabe.Text); // Länge des textes if n > 0 then begin while i < n do begin if EEingabe.Text[i] = '(' then K := K+1 else if (EEingabe.Text[i] = ')' then K := K-1 Label1.Caption := inttostr(K); inc(i); end end; end;
Delphi-Quellcode:
Grüße
function KlammernPruefen(str:String):boolean;
var i: Integer; k: Integer; begin if length(str) > 0 then begin k:=0; for i:=1 to length(str) do begin case str[i] of '(' : inc(k); ')' : dec(k); end; end; result := (k = 0); end else result :=false; end; Klaus |
Re: while-Schleife funktioniert nicht
Also:
K wird als Keller benutzt, das heißt, für jede geöffnete Klammer wird eine "Marke" in den Keller gelegt, bzw. sie K um eins erhöht. Wenn K < 0 ist, heißt das, dass mehr geschlossene Klammern als geöffnete da stehen. Und das muss falsch sein, bei einem aritmethischen Term. n ist für die Klammerüberprüfung die Länge des Texts. Ich will ja jedes Zeichen einzeln überprüfen. Im Moment hab' ich halt nur Aktionen, wenn das Klammern sind ^^ Später sollen auch Zeichen wie +-*/ eingebaut werden und auch überprüft. @ Klaus01: Nein, so geht's nicht, da überprüft er das erste oder letzte Zeichen nicht. Alle Klarheiten beseitigt? €dit: Man muss i <= n schreiben, dann geht's. Thx Leute! |
Re: while-Schleife funktioniert nicht
Hallo,
die Initialisierung von K gehört unbedingt in die Prüfroutine, sonst werden nach Eingabe eines falschen Ausdrucks folgende richtige Ausdrücke als falsch erkannt. Die Prüfroutine trennst du besser von der Benutzerschnittstelle:
Delphi-Quellcode:
Vielen Dank, dass wir an deinen Problemen teilhaben dürfen.
uses
StrUtils; function ValidExpression(const s: string): Boolean; var i, k: Integer; begin k := 0; for i := 1 to Length(s) do case s[i] of '(': Inc(k); ')': Dec(k); end; Result := k = 0; end; procedure TDemoForm.CheckButtonClick(Sender: TObject); begin ShowMessage(IfThen(ValidExpression(TermEdit.Text), 'okay', 'rats')); end; Grüße vom marabu |
Re: while-Schleife funktioniert nicht
Delphi-Quellcode:
Äh, was soll denn das sein? IfThen? Kenn' ich net. Und mein Delphi auch net ^^
procedure TDemoForm.CheckButtonClick(Sender: TObject);
begin ShowMessage(IfThen(ValidExpression(TermEdit.Text), 'okay', 'rats')); //<<< *** end; Hlp, pls? |
Re: while-Schleife funktioniert nicht
Hast Du, wie Achim geschrieben hat, StrUtils eingebunden?
Grüße Klaus |
Re: while-Schleife funktioniert nicht
Jetzt schon ;) thx Leute
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz