Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.225 Beiträge
 
Delphi 12 Athens
 
#18

Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl

  Alt 16. Sep 2009, 16:42
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:
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;
Die ZIP enthält die EXE und den wie hier gekürzten QuellCode.
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.
Miniaturansicht angehängter Grafiken
taschenrechner_257.png  
Angehängte Dateien
Dateityp: 7z taschenrechner_komplett_302.7z (151,5 KB, 17x aufgerufen)
Dateityp: zip taschenrechner_409.zip (193,3 KB, 14x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat