![]() |
Taschenrechner Ausgabe
Hallo erstmal,
ich habe Probleme mit der Ausgabe von dem Taschenrechner. Ich kriege iwi keine Ausgabe. Vllt kann einer helfen
Delphi-Quellcode:
function TFormTR.BerechneTerm(Formular: string): Double;
var Seg1,Seg2 : double; index : integer; Op : string; begin Formular := LabelAnzeige.Caption; 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 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; Result := StrToFloat(FloatToStr(BerechneTerm(LabelAnzeige.Caption))); end; |
Re: Taschenrechner Ausgabe
Vielleicht sollest du einfach deinen eigenen Sourcecode gründlich lesen.
Hast du einen Drucker? Dann bitte drucken und lesen. Hier ein kleiner verkürzter Ausschnitt:
Delphi-Quellcode:
Die markierte Zeile ist ja wohl "Quatsch" - wozu übergibst du der Funktion den Parameter "Formular",
function TFormTR.BerechneTerm(Formular: string): Double;
... begin Formular := LabelAnzeige.Caption; // *** wenn dieser Parameter sogleich in der 1. Zeile überbügelt wird? :wall: |
Re: Taschenrechner Ausgabe
Hai safak67,
schaue Dir auch mal diese Codezeile genau an:
Delphi-Quellcode:
Dir müsste hier sofort etwas auffallen.
Result := StrToFloat(FloatToStr(BerechneTerm(LabelAnzeige.Caption)));
|
Re: Taschenrechner Ausgabe
Mit dem linken Teil ist was nicht i.O
|
Re: Taschenrechner Ausgabe
Zitat:
Anderes Beispiel: Du schläfst, dann stehst du auf, dann schläfst du wieder ein. Was hat sich dadurch geändert? Jürgen PS. Ich wundere mich schon über die Geduld, mit der du über Tage hinweg immer wieder die gleichen Fragen stellst und trotzdem Antworten bekommst. PS2. Du willst das Ergebnis ausgeben. Wo und wie denn bitte? Wenn du das einmal angeben würdest, würdest du vielleicht auf eine der vielen möglichen Lösungen kommen. Bisher schreibst du aber nur, wie gerechnet werden soll. |
Re: Taschenrechner Ausgabe
Zitat:
Hier mal der Ablauf dieser Zeile: 1. Berechne den Term aus LabelAnzeige.Caption 2. Wandele dieses Fliesskommawert in einen String um 3. Wandele diesen String in einen Fliesskommawert um |
Re: Taschenrechner Ausgabe
Zitat:
![]() Zitat:
|
Re: Taschenrechner Ausgabe
Zitat:
Ausgeben willst Du das Ergebnis (wahrscheinlich) als String. Also sollte Result vom Typ String bzw. AnsiString sein.
Delphi-Quellcode:
Dein BerechneTerm liefert ein Double zurück, diesen Floatwert musst Du zu
Result := FloatToStr(BerechneTerm(LabelAnzeige.Caption));
einem String wandeln. Grüße Klaus |
Re: Taschenrechner Ausgabe
Also eines wieder vorweg.. Ich bin auch daran begeistert soviele Fragen zu stellen. Aber ich habe vorher noch nie Delphi gemacht, ich bin auch grad dran die Grundlagen nachzuholen aber es ist nicht meine Schuld das ich von heue auf morgen ein Taschenrechner basteln muss..
Ich bin halt noch ein Noob und ich will das auch lernen aber leider geht das nicht in zwei tagen. Das mit
Delphi-Quellcode:
hatte ich auch am Anfang aber dann kam ne fehlermedlung,
Result := FloatToStr(BerechneTerm(LabelAnzeige.Caption));
[DCC Fehler] Calculator_Main.PAS(79): E2010 Inkompatible Typen: 'Double' und 'string' |
Re: Taschenrechner Ausgabe
Also anscheinend ist der Typ von Result ein Double/Float.
Mit diesem Typ kannst Du aber nichts ausgeben, ohne vorher den Typen konvertiert zu haben. Also zeige mal wie und wo Du das Ergebnis ausgeben willst. Grüße Klaus |
Re: Taschenrechner Ausgabe
Delphi-Quellcode:
also wie ich das ergebnis ausgebe weiß ich auch noch nicht..
function TFormTR.BerechneTerm(Formular: string): Double;
var Seg1,Seg2 :double; index : integer; Op : string; begin Formular := LabelAnzeige.Caption; 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 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; Result := FloatToStr(BerechneTerm(LabelAnzeige.Caption)); end; |
Re: Taschenrechner Ausgabe
Ich kenne jetzt nicht den ganzen Code, aber was möglicherweise falsch läuft
Irgendwo im Code wird BerechneTerm zum ersten mal aufgerufen, da könnte folgendes stehen
Delphi-Quellcode:
innerhalb der function BerechneTerm läuft was falsch
// Aufruf der rekursiven Methode
BerechneTerm(LabelAnzeige.Caption); // Danach Anzeige des Ergebnis LabelAnzeige.Caption := FloatToStr(Result);
Delphi-Quellcode:
function TFormTR.BerechneTerm(Formular: string): Double;
[...] // Das muss weg, macht keinen Sinn //Formular := LabelAnzeige.Caption; [...] // Das muss innerhalb wohl auch weg //Result := FloatToStr(BerechneTerm(LabelAnzeige.Caption)); Zitat:
|
Re: Taschenrechner Ausgabe
Delphi-Quellcode:
wenn ich diese weg mache, wo kommt dann die Ausgabe hin, ok das was da oben steht ist fehlerhaft aber muss die Ausgabe in die finction rein oder muss sie wo anders geschrieben werden..
Result := FloatToStr(BerechneTerm(LabelAnzeige.Caption));
|
Re: Taschenrechner Ausgabe
also erstmal result is der rueckgabewert der funktion, nicht gleichzusetzen mit einer ausgabe!
eine ausgabe kannst du zb mit einem label oder panel realisieren, wenns nur das ergebnis ist was du ausgeben moechtest, also einfach ein panel oder ein label auf deine form schieben und dann inder onclick routine vom button "=" oder "berechne" (weiss ja nich wie du den genannt hast):
Delphi-Quellcode:
label1.caption:=floattostr(berechne(labelanzeige.caption)) |
Re: Taschenrechner Ausgabe
Du scheinst nicht zu wissen wie du mit funktionen umzugehen hast, schau dir im Crashkurs mal die funktionen an dann wird dir das klarer.
![]() |
Re: Taschenrechner Ausgabe
Ich soll aber kein neues label machen, sondern es soll alles auf LabelAnzeige angezeigt werden.
Soll die Ausgabe in der Funktion drin sein, oder soll die woanders drin stehen? |
Re: Taschenrechner Ausgabe
Zitat:
![]() Sinnvoll wäre es wie dort gezeigt die Funktion aufzurufen und danach außerhalb den Label mit dem Rückgabewert zu beschriften. |
Re: Taschenrechner Ausgabe
sie sollte unter deine fertige berechnung, also wuerde ich sie in die onclick routine deines buttons machen den du drueckst um die berechnung zu starten!
dann nimm als ausgabe doch einfach das label!! also:
Delphi-Quellcode:
labelanzeige.caption:=floattostr(berechne(labelanzeige.caption)); |
Re: Taschenrechner Ausgabe
Zitat:
Außerhalb steht (im ButtonClick von "=" möglicherweise)
Delphi-Quellcode:
Man muss klar sagen, das die Aufgabe für den aktuellen Wissensstand zu hoch gegriffen wurde. Ob das ein Fehler des Lehrers war oder ob safak67 davor zulange im Unterricht gepennt hat kann man nur raten. An safak67 nur den Rat, den Lehrer über den Umstand aufklären oder wenn es eigene Schuld ist, die Grundlagen (Links wurden genug aufgeführt) dringend nachholen.
LabelAnzeige.Caption := FloatToStr(BerechneTerm(LabelAnzeige.Caption));
|
Re: Taschenrechner Ausgabe
Also meine Schuld ist es nicht das kann ich euch garantieren. Ich muss ein Praktikum machen und die Aufgbe wurde mir gestellt, und je schlechter ich das mache desto schlechtere Noten kriege ich. Wir hatten noch nicht mal Delphi als Programmiersprache nur c++ aber sogar da sind wir nicht soweit..
Das doofe ist ja das ich ein Rechenparse schreiben muss und das Programm was ich jetzt habe nicht ganz korekt ist.. ich habe es ein bisschen geändert aber meine berechnungen funktioieren iwi nicht
Delphi-Quellcode:
procedure TFormTR.spResultClick(Sender: TObject);
begin LabelAnzeige.Caption := FloatToStr(BerechneTerm(LabelAnzeige.Caption)); end; function TFormTR.BerechneTerm(Formular: string): Double; var Seg1,Seg2 : double; index : integer; Op : string; begin 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 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; //LabelAnzeige.Caption := FloatToStr(Result); //Result := FloatToStr(BerechneTerm(LabelAnzeige.Caption)); end; |
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. |
Re: Taschenrechner Ausgabe
Also zuerst kommt bei mir ne Warnung
[DCC Warnung] Calculator_Main.PAS(88): W1035 Rückgabewert der Funktion 'TFormTR.BerechneTerm' könnte undefiniert sein danach starte ich das Programm was einwandfrei funkioniert, wenn ich aber ne Multiplikation mache kommt ne fehlermeldung. [DCC Warnung] Calculator_Main.PAS(88): W1035 Rückgabewert der Funktion 'TFormTR.BerechneTerm' könnte undefiniert sein. Und wenn du mir erklären würdest wie du das gemacht hast wäre ich sehr dankbar.. P.S: Alle anderen Operanden funktionieren außer die Multiplikation |
Re: Taschenrechner Ausgabe
Welche Version von BerechneTerm? Die in Post #27 von mir oder die in Post #29 von Klaus01.
Lies im Thread bitte alle Antworten, nach Deiner letzten Frage. Wenn Du die Hälfe der Antworten hier ignorierst, macht es für mcih keinen Sinn, überhaupt zu Antworten |
Re: Taschenrechner Ausgabe
Zitat:
Das as Du angegeben hast sind Warnungen, sie besagen das der result Wert von BerechneTerm undefiniert sein könnte. Das kannst Du beheben indem Du zu Anfang der Routine ein result := 0 einfügst. Benutzt Du auch das 'x' zum Multiplizieren oder das '*'. In Deiner Routine solltest Du das x verwenden in der meinigen das *. [edit] Kommetare im Quelltext eingefügt [edit] Grüße Klaus |
Re: Taschenrechner Ausgabe
dein letzten beitrag habe ich erst jetzt gelesen sorry..
also ich habe deine(satty67) Version benutzt, jetzt funktioniert das auch. Aber da sind auch rechenfehler drin, ich bin mir nicht sicher aber wenn ich mind. 3 operanden eingebe macht er manchmal fehler.. höchstwahrscheinlich macht er die fehler bei der division.. ich bin mir aber nicht sicher.. |
Re: Taschenrechner Ausgabe
Beschriftung des SpeedButton für Multiplikation muss natürlich identisch sein. Also überall "*" oder überall "x" verwenden.
Mit überall ist Caption von SpeedButton und die Zeichen in BerechneTerm gemeint. |
Re: Taschenrechner Ausgabe
das problem ist nicht bei der multiplikation jetzt sondern bei der division..
wenn ich z.B 12-3+1 eintippe gibt er 8 aus. der verwandelt iwi das + in minus um oder noch ein beispiel 18 -4+3 gibt er 11 aus. |
Re: Taschenrechner Ausgabe
Ja, das Problem hat irgendwo schon mal jemand angesprochen. Das wäre dann auch schon die nächste Baustelle:
Die Reihenfolge der berechneten Terme stimmt nicht mit den mathematischen Regeln überein. |
Re: Taschenrechner Ausgabe
Zitat:
Bespiel 12 -3 = 9 9 +1 = 10 12 - (3+1) = 12 -4 = 8 oder 18 - 4 +3 18 - 4 = 14 14 +3 = 17 18 - (4+3) = 18 - 7 = 11 Grüße Klaus |
Re: Taschenrechner Ausgabe
hmm wieder so´ne scheiße.. satty67 kannst du dein teil kommentieren was du da gemacht hast, wenn es keine umstände macht..
das mit der mathematischen müssen wir nochmal anschauen |
Re: Taschenrechner Ausgabe
Dieser spezielle Fehler liegt nicht an der Reihenfolge sondern daran das die Schleife weiterläuft, auch wenn ein Operator gefunden wird.
Wenn man nach dem case ein break einfügt kommt bei 12-3+1 auch 10 raus :)
Delphi-Quellcode:
Aber 1+1*2 ist 4 ;)
case index of
0: Result := Seg1 * Seg2; 1: Result := Seg1 / Seg2; 2: Result := Seg1 + Seg2; 3: Result := Seg1 - Seg2; end; break; Also stimmt die Reihenfolge auch nicht. (wohoo endlich mal wieder delphi geschrieben, c geht mir aufn keks...) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 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