Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Term (Zeichenfolge 1+2*3) in Fließkommazahl (https://www.delphipraxis.net/140346-term-zeichenfolge-1-2%2A3-fliesskommazahl.html)

Delphi-Narr 16. Sep 2009 14:09

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???

Forlan 16. Sep 2009 14:10

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

Zitat von Delphi-Narr
Oh...

Dann muss ich halt den Term zerlegen und die Zeichen suchen, wie beschrieben - nur wie???

Das hat Himitsu doch bereits geschrieben und imho auch gut erklärt :roll:

freak4fun 16. Sep 2009 14:13

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

Zitat von Uwe Raabe
Übrigens bekommt der bei der Eingabe "1+2*3=" eine 9 heraus, während ein Formelinterpreter eine 7 auswerfen würde.

Nicht unter Win7. ;)

hugo1990 16. Sep 2009 14:20

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

Zitat von freak4fun
Zitat:

Zitat von Uwe Raabe
Übrigens bekommt der bei der Eingabe "1+2*3=" eine 9 heraus, während ein Formelinterpreter eine 7 auswerfen würde.

Nicht unter Win7. ;)

Der Taschenrechner unter XP sollte auch eine 7 ausspucken, man muss ihn nur auf Wissensschaftlich stellen.


Zitat:

Zitat von Forlan
Zitat:

Zitat von Delphi-Narr
Oh...

Dann muss ich halt den Term zerlegen und die Zeichen suchen, wie beschrieben - nur wie???

Das hat Himitsu doch bereits geschrieben und imho auch gut erklärt :roll:

Ich schätze mal er weiß nicht, wie er in dem Term nach den Zeichen suchen soll. Hierzu wäre zu sagen, dass man auf einzelne Zeichen in einem String folgendermaßen zugreifen kann:

Delphi-Quellcode:
S[1] // greift auf das erste Zeichen im String S zu
Weiterhin wären vielleicht noch die Befehle Copy und Pos hierfür interessant.

himitsu 16. Sep 2009 14:27

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

Zitat von freak4fun
Nicht unter Win7. ;)

in XP (SP3) auch nicht

wo kommt denn die andere Antwort plötzlich her?

OK, hab zufällig ihn auch immer auf Wissenschaftlich stehen :angel2:

Delphi-Narr 16. Sep 2009 14:29

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...

hugo1990 16. Sep 2009 14:39

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.

himitsu 16. Sep 2009 16:42

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:
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.

himitsu 18. Okt 2009 22:46

Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl
 
bevor ich's noch vergesse ... das höchst geheime Paßwort ist
Zitat:

das geheime Passwort

Delphi-Narr 19. Okt 2009 11:25

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:
Uses StrUtils;
liegen? Ich dachte das wäre bei Delphi 5 sysUtils...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 Uhr.
Seite 2 von 5     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz