![]() |
Re: Taschenrechner Ausgabe
Folgende Deklaration im TForm1 muss weg
Delphi-Quellcode:
Dazu fehlt die passende Methode. Für die SpeedButton +,-,* und / weist du im Objektinspektor das KlickEreignis "spZahlKlick" zu.
procedure SpZeichenClick(Sender: TObject);
Dann entfernst Du die // in der Methode spResultKlick, denn die Zeile da ist so richtig. *** Soweit so gut, er funktioniert, aber in function BerechneTerm wird jetzt nur noch falsch gerechnet. Also von allem anderen nach den oben genannten Änderungen die Finger lassen und außschließlich auf BerechneTerm konzentrieren, damit richtig gerechnet wird. |
Re: Taschenrechner Ausgabe
Ich habe den Eindruck, dass die eigentliche BerechneTerm-Funktion vom Grundsatz her korrekt ist (vor allem im Hinblick auf den rekursiven Aufruf und die Übernahme der Zwischenergebnisse). Aber das fehlt immer noch:
Zitat:
Was läuft denn konkret falsch, wenn du diese Zeile aktivierst? Aber die Copy-Funktion ist falsch. Du musst zum Index die gewünschte Anzahl von Zeichen hinzufügen. Beim zweiten Teil nimmst du immer die Gesamtlänge. Übrigens solltest du Pos nicht wiederholt aufrufen, sondern mit einer Variablen position einmal benutzen:
Delphi-Quellcode:
Jürgen
position := Pos(Op,Formular);
if (position > 1) then ... /Edit Mist, so einfach ist es auch nicht. Wenn der Parameter "Count" zu groß ist, wird der Rest-String einfach bis zum Ende genommen. Aber in diesem Bereich würde ich nach dem Fehler suchen. Hast du es schon einmal mit dem Debugger oder auf Papier probiert? |
Re: Taschenrechner Ausgabe
Also er gibt mir keine Fehlermeldung an, das Programm startet aber die Rechnungen funktionieren nicht. Bei jeder plus rechnung kommt 0"null" raus, bei jeder - rechnung eine 1, bei der multiplikation eine extrem hohe zahl usw.
|
Re: Taschenrechner Ausgabe
Schau dir das Programm mal im Debugger Schritt für Schritt an
|
Re: Taschenrechner Ausgabe
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Was in BerechneTerm falsch laufen könnte hat zwei Posts oben dran Jürgen Thomas geschrieben. Für die anderen hier das falsch rechnende, aber immerhin laufende Project zum probieren (safak67, du brauchst es nicht zu laden, du solltest die Version bei Dir so stehen haben!) |
Re: Taschenrechner Ausgabe
.. was mir bisher aufgefallen ist.
result hat einen undefinierten Wert wenn kein Op mehr im String vorhanden ist. Angenommen Formular ist: 3+1 Seg1:=BerechneTerm(3); Seg1 bekommt nicht den Wert 3 weil result keine Zuweisung bekommt. Grüße Klaus |
Re: Taschenrechner Ausgabe
So ist es und die Case-Zuweisungen der Operatoren war auch nicht identisch (+ = * usw.)
Delphi-Quellcode:
Es fehlt noch Feinarbeit, nach einem Ergebnis muss neue Zahleingabe das Eingabefeld löschen usw. aber rechnen sollte er jetzt besser
function TFormTR.BerechneTerm(Formular: string): Double;
var Seg1,Seg2 : double; index : integer; Op : string; OpFound : Boolean; begin OpFound := False; for index := 0 to 3 do begin case index of 0: Op := '*'; 1: Op := '/'; 2: Op := '+'; 3: Op := '-'; end; if pos(Op,Formular) > 1 then begin OpFound := True; Seg1 := BerechneTerm(copy(Formular,1,pos(Op,Formular) - 1)); Seg2 := BerechneTerm(copy(Formular,pos(Op,Formular) + 1,length(Formular))); case index of 0: Result := Seg1 * Seg2; 1: Result := Seg1 / Seg2; 2: Result := Seg1 + Seg2; 3: Result := Seg1 - Seg2; end; end; end; if Not OpFound then Result := StrToFloat(Formular); end; |
Re: Taschenrechner Ausgabe
Also ich habe es ein bisschen verfeinert.. jetzt berechnet er aber wenn ich mehr als zwei Operanden habe ist das Ergebnis falsch, ich weiß auch wo der fehler ist aber weiß nicht wie ich das korrigieren soll. wenn ich z.B 6-8 * 3+2 eintippe gibt er mir als Ergebnis -10, weil 6-8 als Seg1 nimmt und 3+2 als Seg2. Was muss ich jett ändern und wie muss ich es..?
Delphi-Quellcode:
function TFormTR.BerechneTerm(Formular: string): Double;
var Seg1,Seg2 : double; index, ipos : integer; Op : string; begin iPos := 0; index := 0; while (iPos = 0) and (index < 4) do begin case index of 0: Op := 'x'; 1: Op := '/'; 2: Op := '+'; 3: Op := '-'; end; iPos := Pos(Op, Formular); inc(index); end; if iPos > 0 then begin Seg1 := BerechneTerm(copy(Formular,1,iPos - 1)); Seg2 := BerechneTerm(copy(Formular,iPos + 1,length(Formular))); case index - 1 of 0: Result := Seg1 * Seg2; 1: Result := Seg1 / Seg2; 2: Result := Seg1 + Seg2; 3: Result := Seg1 - Seg2; end end else begin Result := StrToFloat(Formular); end; |
Re: Taschenrechner Ausgabe
Hallo,
versuche mal diesen Code.
Delphi-Quellcode:
Grüße
function BerechneTerm(Formular: string): Double;
const // Array mt den möglichen Operatoren opCodes : Array[0..3] of char = ('*','/','+','-'); var Seg1,Seg2 : double; index : integer; opCodeFound : Boolean; begin opCodeFound := false; result := 0; // durchlaufe das array bis zum Ende for index := 0 to high(opCodes) do begin // opCodes[index] gibt den Operator an der Stelle index aus if pos(opCodes[index],Formular) > 1 then begin opCodeFound := true; // es wurde ein Operator gefunden, Formalar besteht nicht nur aus einer Zahl Seg1 := BerechneTerm(copy(Formular,1,pos(opCodes[index],Formular) - 1)); Seg2 := BerechneTerm(copy(Formular,pos(opCodes[index],Formular) + 1,length(Formular))); // Hier wird abgefragt welcher Operator benutzt wurde. case opCodes[index] of '+': Result := Seg1 + Seg2; '-': Result := Seg1 - Seg2; '*': Result := Seg1 * Seg2; '/': Result := Seg1 / Seg2; end; end; end; if not opCodeFound then result :=StrToFloat(Formular); end; Klaus |
Re: Taschenrechner Ausgabe
Direkt über Safak67's letzten Post steht das korrekte BerechneTerm
Die Variante von Klaus könnte auch funktionieren... aber Leute... Ihr verändert den kompletten Quellcode. Wie soll er kapieren, woran es gelegen hat, wenn er nicht nur ein/zwei Änderungen sieht, sondern eine komplett umgebaute Funktion? @safak67 Wenn Du BerechneTerm durch meine oder Klaus01 Version ersetzt hast, kannst Du Dir nochmal Gedanken machen. Nach einer Berechnung muss die Anzeige bei der ersten Zahleingabe auch gelöscht werden... das gäbe aber dann einen neuen Thread, wenn du nicht selber drauf kommst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 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-2025 by Thomas Breitkreuz