AGB  ·  Datenschutz  ·  Impressum  







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

Taschenrechner->Graphen zeichenen

Ein Thema von Delphi-Narr · begonnen am 24. Okt 2009 · letzter Beitrag vom 24. Okt 2009
 
Benutzerbild von Delphi-Narr
Delphi-Narr

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

Taschenrechner->Graphen zeichenen

  Alt 24. Okt 2009, 10:54
Hallo,

ich hab ja jetzt einen Taschenrechner mit Punkt vor Strich (s. Taschenrechner Term in FLießkommazahl)

Dieses Prinzip möchte ich verwenden, um auch eine Variable einzubauen, die vom Programm immer verändert wird.
So soll ein Graph zu einer Funktion entstehen.

Hier mein Ansatz:
Delphi-Quellcode:

Function TForm1.ParseAndCalc(Const X:Real;Const S: String): String; //X hat jetzt den Beispielwert 1 (s.u)
  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;
            '*', '/', '+', '-','X': Begin //X wird hier in eine eigene Zeile geschrieben, damit nicht so etwas wie 3X entsteht
              If SL[SL.Count - 1] = 'Then Begin
              SL.Delete(SL.Count - 1);
              End;
              SL.Add(S[i]);
              SL.Add('');
              SL.SaveToFile('Dateipfad\SL.txt');//Nur zum Test, wie die SL erstellt wird:
               {Hier ist das Problem: Eingabe von X+1 wird nur gespeichert:
              X
              +
             
              Die 1 fehlt. 1+X ist kein Problem...??? Also ist wahrscheinlich hier der Fehler.
               Wenn ich jetzt auf den Button klicke kommt die Meldung, X sei kein gültiger Gleitkommawert...}

            End;
            ' ': ; // ignoriere Leerzeichen
            Else Raise Exception.CreateFmt('Ungültiges Zeichen "%s" gefunden.', [S[i]]);
          End;
          begin
               begin
               i:=0;
               while i < SL.Count do
                  begin
                      if SL[i]='*then
                         begin
                               SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])*StrToFloat(SL[i+1])));
                               {Zahl vor und nach dem * werden multipliziert und in die Zeile der ersten Zahl geschrieben???} 
                               SL.Delete(i);
                               {Jetzt soll die Zeile des Operators gelöscht werden} 
                               SL.Delete(i);{und die der zweiten Zahl} 
                               {etwas wurde gefunden - fange von vorn an} 
                               i := i-1;
                         end
                      else
                      if SL[i]='/then
                         begin
                               SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])/StrToFloat(SL[i+1])));
                               SL.Delete(i);
                               SL.Delete(i);
                               i := i-1;
                         end
                      else
                         i := i + 1;
                  end;
               i:=0;
               while i < SL.Count do
                  begin
                      if SL[i]='+then
                         begin
                               SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])+StrToFloat(SL[i+1])));
                               {Zahl vor und nach dem * werden multipliziert und in die Zeile der ersten Zahl geschrieben???} 
                               SL.Delete(i);
                               {Jetzt soll die Zeile des Operators gelöscht werden} 
                               SL.Delete(i);{und die der zweiten Zahl} 
                               {etwas wurde gefunden - fange von vorn an} 
                               i := i-1;
                         end
                      else
                      if SL[i]='-then
                         begin
                               SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])-StrToFloat(SL[i+1])));
                               SL.Delete(i);
                               SL.Delete(i);
                               i := i-1;
                         end
                      else
                         i := i + 1;
                  end;

                   
          end;
          end;
      Finally
            
        Result := '';
        For i := 0 to SL.Count - 1 do Result := Result + SL[i];
        
      End;
    Finally
      SL.Free;
    End;
  End;


procedure TForm1.Tabelle;
var X:real;

begin
     X:=1;
     Rechnen.Caption:=ParseAndCalc(X,Formel.text);//Rechnen ist ein Labelfeld, auf dem jetzt '2' stehen sollte
end;


procedure TForm1.BZeichnenClick(Sender: TObject);
begin
     Tabelle;
end;

Wenn ich jetzt auf den Button klicke kommt die Meldung, X sei kein gültiger Gleitkommawert...
Also wie im Quelltext erwähnt klappt das mit dem Schreiben der SL nicht richtig...

Liebe Grüße!

__________

Sorry wegen den vielen Edits, war ein Quellcode fehler...
  Mit Zitat antworten Zitat
 


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 13:09 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 by Thomas Breitkreuz