![]() |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Oh...
Dann muss ich halt den Term zerlegen und die Zeichen suchen, wie beschrieben - nur wie??? |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Zitat:
|
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Zitat:
|
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Zitat:
Zitat:
Delphi-Quellcode:
Weiterhin wären vielleicht noch die Befehle Copy und Pos hierfür interessant.
S[1] // greift auf das erste Zeichen im String S zu
|
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Zitat:
wo kommt denn die andere Antwort plötzlich her? OK, hab zufällig ihn auch immer auf Wissenschaftlich stehen :angel2: |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Danke, ich habe noch nicht sooo viel Ahnung. Also wenn ich jetzt rTerm[1] und der Term ist 1+2*3 dann würde der die 1 wählen???
Dann muss ich noch wissen, was ist, wenn im Term steht, 12+3 Der soll ja dann auf zwei Zeichen zugreifen... |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Ich hoffe, dass du schon mal was von Schleifen gehört hast, besonders von for-Schleifen, denn diese wirst du hier benötigen. Du läufst also mit Hilfe der for-Schleife durch den String durch und prüfst, ob das aktuelle Zeichen ein Operator ist. Wenn dies der Fall ist, dann fügst du die Zeichen zwischen diesem Operator und dem letzten Operator bzw. dem Start, hierfür solltest du dir die Positon in einer extra Variablen merken, in deine StringListe ein, hierfür ist der Befehl Copy sehr nützlich. Außerdem musst du noch den Operator in die Stringliste einfügen, das geht ja recht einfach, da du die Position davon sowieso grad weißt. Jetzt noch die Position des aktuellen Operators merken und dann geht das ganze wieder von vorn los.
|
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Liste der Anhänge anzeigen (Anzahl: 3)
Das Parsen ist recht einfach ... wie es schon genannt wurde, kann man einfach von vorn nach hinten Zeichen für Zeichen durchgehn und sie entsprechend ihrem Typ (Zahl oder Operator) auf ein Array oder eine StringListe aufteilen.
Ein etwas effektiverer Weg mittels Copy steckt in dem ebenfalls schon verlinkten MatheParser, aber die Geschwindigkeit der Einzelzeichenbehandlung ist für diesen Zweck hier auch vollkommend ausreichend.
Delphi-Quellcode:
Die ZIP enthält die EXE und den wie hier gekürzten QuellCode.
Function ParseAndCalc(Const S: String): String;
Var SL: TStringList; i: Integer; Begin SL := TStringList.Create; Try Try SL.Add(''); For i := 1 to Length(S) do Case S[i] of '0'..'9', ',', '.': Begin SL[SL.Count - 1] := SL[SL.Count - 1] + S[i]; End; '*', '/', '+', '-': Begin If SL[SL.Count - 1] = '' Then Begin // eine leere Zeile kommt vor, wenn mehrere Operatoren // hintereinander liegen, z.B. bei '1*+2' bzw. '1 * +2' SL.Delete(SL.Count - 1); End; SL.Add(S[i]); SL.Add(''); End; ' ': ; // ignoriere Leerzeichen Else Raise Exception.CreateFmt('Ungültiges Zeichen "%s" gefunden.', [S[i]]); End; // hier alles in SL ausrechnen Finally Result := ''; For i := 0 to SL.Count - 1 do Result := Result + SL[i]; End; Finally SL.Free; End; End; Procedure TForm1.Button1Click(Sender: TObject); Begin Edit2.Text := ParseAndCalc(Edit1.Text); End; In der passwortgeschützen 7-Zip steckt der komplette Code. Das Paswort gebe ich gern an nicht Schüler und andere Interessenten raus, wo ich das Gefühl hab, daß sie es nicht als Hausaufgabenlösung mißbrauchen. PS: Es sind da auch nur 64 zusätzliche Zeilen mit je 7-8 Zeilen pro Operator (+ - * / und den Vorzeichen + -). und zum Ausprobieren kennt die Demo also diese Operatoren und den Dezimalpunkt (deutsches Windows = "," und englisches Windows = "."), so wie es halt von StrToFloat behandelt wird. Wie es ausgerechnet hab ich oben erklärt und es wird einfach nur nacheinander je Operator in einer For-Schleife geschaut ob der Operator vorhanden und berechenbar ist und dann wird wie oben beschrieben vorgegangen. |
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
bevor ich's noch vergesse ... das höchst geheime Paßwort ist
Zitat:
|
Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
Danke! Also von Schleifen hab ich gehört, klar...
Ich bau das dann mal ein... :bounce1: Edit:
Delphi-Quellcode:
procedure TForm1.ButtonGleichClick(Sender: TObject);
begin Ausgabefeld.text:=ParseandCalc(Rechenfeld.text); end; //Hier der Parser Function TForm1.ParseAndCalc(Const S: String): String; Var SL: TStringList; i: Integer; Begin SL := TStringList.Create; Try Try SL.Add(''); For i := 1 to Length(S) do Case S[i] of '0'..'9', ',', '.': Begin SL[SL.Count - 1] := SL[SL.Count - 1] + S[i]; End; '*', '/', '+', '-': Begin If SL[SL.Count - 1] = '' Then Begin // eine leere Zeile kommt vor, wenn mehrere Operatoren // hintereinander liegen, z.B. bei '1*+2' bzw. '1 * +2' SL.Delete(SL.Count - 1); End; SL.Add(S[i]); SL.Add(''); End; ' ': ; // ignoriere Leerzeichen Else Raise Exception.CreateFmt('Ungültiges Zeichen "%s" gefunden.', [S[i]]); End; // hier alles in SL ausrechnen Finally Result := ''; For i := 0 to SL.Count - 1 do Result := Result + SL[i]; End; Finally SL.Free; End; End; Aber wenn ich dann jetzt bspw. 124+2 eingebe steht im Ausgabefeld ebenfalls 124+2 und nicht 126 Könnte das an
Delphi-Quellcode:
liegen? Ich dachte das wäre bei Delphi 5 sysUtils...
Uses StrUtils;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 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