Autor Beitrag
ImbaPanda
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
BeitragVerfasst: Mo 24.09.07 20:39 
Also ich bin dabei mir einen Matheparser zu schreiben.
Da ich das aber zuerst Schritt für Schritt machen will, sind bei meinem Projekt die Punkt vor Strich Rechnung sowie Potenzen und Klammer erst einmal außer Betracht gelassen.
So nu erstmal mein Code:

Mein Button zum ausführen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
begin
procedure TForm1.Button1Click(Sender: TObject);
begin
Rechenzeichen:='';
Ausgabefeld.Caption:=FLoatToStr(StringBerechnen(Eingabefeld.Text));
end;
end;

Nu die Funktion zum Berechnen des Strings:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
begin
Function TForm1.StringBerechnen(Rechnung:String):Real;
Begin
If Rechenzeichen=''
  Then
   //Erster Durchlauf
   Begin
   //Rechenzeichen Suchen
   RechenzeichenSuchen(Rechnung);
   //ZahlA Suchen
   ZahlA:=StrToFLoat(Copy(Rechnung,0,PosA-1));
   //Rechenzeichen Setzen
   RechenzeichenSetzen(Rechnung);
   //Neue Rechnung Ausgeben
   Rechnung:=Copy(Rechnung,PosA+1,Length(Rechnung));
   //Neue Rechnung Auswerten
   StringBerechnen(Rechnung);
   End
  Else
   //Weiterer Durchlauf
   Begin
   //Rechenzeichen Suchen
   RechenzeichenSuchen(Rechnung);
   //ZahlB Suchen
   If PosA<>0
     Then ZahlB:=StrToFloat(Copy(Rechnung,0,PosA-1))
     Else ZahlB:=StrToFloat(Rechnung);
   //Neue Zahl Berechnen
   If Rechenzeichen='+'
     Then ZahlA:=ZahlA+ZahlB;
   If Rechenzeichen='-'
     Then ZahlA:=ZahlA-ZahlB;
   If Rechenzeichen='*'
     Then ZahlA:=ZahlA*ZahlB;
   If Rechenzeichen='/'
     Then ZahlA:=ZahlA/ZahlB;
   //Abfrage Für Weitere Durchgänge
   If PosA<>0
     Then
      Begin
      //RechenzeichenSetzen
      RechenzeichenSetzen(Rechnung);
      //Neue Rechnung Ausgeben
      Rechnung:=Copy(Rechnung,PosA+1,Length(Rechnung));
      //Neue Rechnung Auswerten
      StringBerechnen(Rechnung);
      End;
   End;
Result:=ZahlA;   
End;
end;

Weiterhin sind 2 Funktionen enthalten:
RechenzeichenSuchen --> Dient dazu um die Länge der Zahl heraus zu finden
RechenzeichenSetzen --> Setzt das Rechenzeichen was für den nächsten Durchlauf der Funktion wichtig ist

Jetzt zu meinem Problem
Sobald ich eine Rechnung eingebe und das berechnen will, gibt der mir nen Konvertierungserror: ''' ist kein gültiger Fließkommawert

Und hier häng ich im Moment fest.


Moderiert von user profile iconNarses: Topic aus Algorithmen, Optimierung und Assembler verschoben am Mo 24.09.2007 um 22:41
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 25.09.07 00:43 
Moin!

user profile iconImbaPanda hat folgendes geschrieben:
Sobald ich eine Rechnung eingebe und das berechnen will, gibt der mir nen Konvertierungserror: ''' ist kein gültiger Fließkommawert


Lass dir doch mal das Ergebnis einer Copy()-Operation:
user profile iconImbaPanda hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
//ZahlA Suchen
ZahlA:=StrToFLoat(Copy(Rechnung,0,PosA-1));

z.B. per ShowMessage ausgeben: :idea:
ausblenden Delphi-Quelltext
1:
2:
3:
//ZahlA Suchen
ShowMessage(Copy(Rechnung,0,PosA-1));
ZahlA:=StrToFLoat(Copy(Rechnung,0,PosA-1));

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Mi 26.09.07 09:14 
Hi
Ich glaube fast, hier fehlen ein paar Grundlagen...
Du verwendest ein paar Variablen, die vermutlich global definiert sind in einer Function. Zum Beispiel
ZahlA. Diese Variable ist nicht in der Function vereinbart, ist aber Rückgabewert. Du solltest dir zum Grundsatz machen, das in einer Function benutzte Variablen möglichst lokal vereinbart und von Außen mit Parameterwerten besetzt werden. Damit ist deine Function einmal geprüft immer wieder einsetzbar.
Dann versteh ich nicht, wer dir gesagt hat, vor Procedures und Functions gehört ein "Begin" und hinten dran wieder ein "End". Wundert mich, das der Compiler das nicht anmeckert, aber gut, ich hab's nicht ausprobiert.
Auch einrücken und Kommentare sollen der Übersichtlichkeit dienen.
z.B.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
Form1.MyFunc(ErsterParam: String; ZweiterParam:Integer):Real;// Rückgabewert ist vom Typ Real
Var   AWert  : Integer; // lokale Variablendeklaration
      BWert  : String;
      CWert  : ....   ; //Was auch immer 
Begin                   // hier ist der Begin des Function-Programmes
  AWert:=ZweiterParam;  // Parameterübernahme
  BWert:=ErsterParam+IntToStr(ZweiterParam);  // so auch denkbar....
  If BWert='' then 
  Begin
    ....  // alles was bei If erledigt werden muß
    CWert:=Ergebnis_Aus_einer_anderen_Function('leer',0); // CWert aus 'leer'+0

  end else  // ende if, Anfang Else
  begin
    .....  // alles was unter else passt
    CWert:=Ergebnis_Aus_einer_anderen_Function(BWert,AWert); // CWert aus BWert und AWert

  end;  // ende Else
  Result:=CWert; // allerdings vom Typ der Function
End; // Ende derFunction....

TForm1.MyNextFunc(....): ....
Begin
  .........
  ........
end;

Richtig eingerückt und richtig kommentiert ist die halbe Miete..... So kannst du Haltepunkte setzen und Werte prüfen.
Gruß oldmax

_________________
Zier dich nich so, ich krieg dich schon....