AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Delphi-Narr · begonnen am 16. Sep 2009 · letzter Beitrag vom 10. Nov 2009
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#11

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

  Alt 16. Sep 2009, 15:09
Oh...

Dann muss ich halt den Term zerlegen und die Zeichen suchen, wie beschrieben - nur wie???
  Mit Zitat antworten Zitat
Benutzerbild von Forlan
Forlan

Registriert seit: 17. Feb 2008
Ort: Herford
265 Beiträge
 
Delphi 2007 Architect
 
#12

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

  Alt 16. Sep 2009, 15:10
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
Marcel
マルセル
www.youtube.com/beethoven1990
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#13

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

  Alt 16. Sep 2009, 15:13
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.
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#14

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

  Alt 16. Sep 2009, 15:20
Zitat von freak4fun:
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 von Forlan:
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
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:

S[1] // greift auf das erste Zeichen im String S zu Weiterhin wären vielleicht noch die Befehle Copy und Pos hierfür interessant.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 16. Sep 2009, 15:27
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#16

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

  Alt 16. Sep 2009, 15:29
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...
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#17

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

  Alt 16. Sep 2009, 15:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 16. Sep 2009, 17: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, 18x aufgerufen)
Dateityp: zip taschenrechner_409.zip (193,3 KB, 14x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 18. Okt 2009, 23:46
bevor ich's noch vergesse ... das höchst geheime Paßwort ist
Zitat:
das geheime Passwort
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#20

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

  Alt 19. Okt 2009, 12:25
Danke! Also von Schleifen hab ich gehört, klar...
Ich bau das dann mal ein...





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

Uses StrUtils; liegen? Ich dachte das wäre bei Delphi 5 sysUtils...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr.
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