Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Taschenrechner Ausgabe (https://www.delphipraxis.net/135126-taschenrechner-ausgabe.html)

safak67 5. Jun 2009 08:31


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;

sx2008 5. Jun 2009 08:40

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:
function TFormTR.BerechneTerm(Formular: string): Double;
...
begin
  Formular := LabelAnzeige.Caption; // ***
Die markierte Zeile ist ja wohl "Quatsch" - wozu übergibst du der Funktion den Parameter "Formular",
wenn dieser Parameter sogleich in der 1. Zeile überbügelt wird? :wall:

Sharky 5. Jun 2009 08:45

Re: Taschenrechner Ausgabe
 
Hai safak67,

schaue Dir auch mal diese Codezeile genau an:

Delphi-Quellcode:
Result := StrToFloat(FloatToStr(BerechneTerm(LabelAnzeige.Caption)));
Dir müsste hier sofort etwas auffallen.

safak67 5. Jun 2009 08:49

Re: Taschenrechner Ausgabe
 
Mit dem linken Teil ist was nicht i.O

Jürgen Thomas 5. Jun 2009 08:54

Re: Taschenrechner Ausgabe
 
Zitat:

Zitat von safak67
Mit dem linken Teil ist was nicht i.O

Links ist da, wo der Daumen rechts ist. Schau aber einmal in die Mitte dieser Code-Zeile: was wird zuletzt gemacht, was wird unmittelbar davor gemacht, und was bedeutet beides zusammen?

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.

Sharky 5. Jun 2009 08:56

Re: Taschenrechner Ausgabe
 
Zitat:

Zitat von safak67
Mit dem linken Teil ist was nicht i.O

Das meine ich nicht. Schau doch mal genau hin.
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

jaenicke 5. Jun 2009 09:01

Re: Taschenrechner Ausgabe
 
Zitat:

Zitat von Jürgen Thomas
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.

Hier steht der Quelltext, und auch meine Antwort darauf...
http://www.delphi-forum.de/viewtopic...=565525#565525
Zitat:

Zitat von jaenicke
Zweitens musst du BerechneTerm auch irgendwo benutzen, es nur hinzuschreiben nutzt eben nichts. Und den Rückgabewert kannst du z.B. mit FloatToStr in einen String umwandeln und in ein Label oder in eine ShowMessage packen.

Leider kam darauf keine Antwort... :roll:

Klaus01 5. Jun 2009 09:02

Re: Taschenrechner Ausgabe
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von safak67
Mit dem linken Teil ist was nicht i.O

Das meine ich nicht. Schau doch mal genau hin.
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

Das sollst Du doch nicht in einem Rutsch machen.

Ausgeben willst Du das Ergebnis (wahrscheinlich) als String.
Also sollte Result vom Typ String bzw. AnsiString sein.

Delphi-Quellcode:
Result := FloatToStr(BerechneTerm(LabelAnzeige.Caption));
Dein BerechneTerm liefert ein Double zurück, diesen Floatwert musst Du zu
einem String wandeln.

Grüße
Klaus

safak67 5. Jun 2009 09:05

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:
Result := FloatToStr(BerechneTerm(LabelAnzeige.Caption));
hatte ich auch am Anfang aber dann kam ne fehlermedlung,
[DCC Fehler] Calculator_Main.PAS(79): E2010 Inkompatible Typen: 'Double' und 'string'

Klaus01 5. Jun 2009 09:16

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

safak67 5. Jun 2009 09:21

Re: Taschenrechner Ausgabe
 
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 := FloatToStr(BerechneTerm(LabelAnzeige.Caption));

end;
also wie ich das ergebnis ausgebe weiß ich auch noch nicht..

Satty67 5. Jun 2009 09:44

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:
// Aufruf der rekursiven Methode
BerechneTerm(LabelAnzeige.Caption);
// Danach Anzeige des Ergebnis
LabelAnzeige.Caption := FloatToStr(Result);
innerhalb der function BerechneTerm läuft was falsch
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:

Zitat von safak67
Ich bin halt noch ein Noob und ich will das auch lernen aber leider geht das nicht in zwei tagen.

Hier läuft im Forum etwas schief. Das es Leute gibt, die von Delphi/Pascal so wenig Ahnung haben, das auch offensichtliche Lösungsvorschläge nicht verstanden werden, wird nicht akzeptiert. Lebe einfach mir der Art der Antworten, das wird erst besser, wenn Du besser in Delphi wirst ;)

safak67 5. Jun 2009 09:57

Re: Taschenrechner Ausgabe
 
Delphi-Quellcode:
Result := FloatToStr(BerechneTerm(LabelAnzeige.Caption));
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..

nimmersattXD 5. Jun 2009 10:06

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))

Blackheart 5. Jun 2009 10:14

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.
Funktionen

safak67 5. Jun 2009 10:27

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?

jaenicke 5. Jun 2009 10:29

Re: Taschenrechner Ausgabe
 
Zitat:

Zitat von safak67
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?

Den Quelltext dafür hat dir Satty67 bereits gepostet...
http://www.delphipraxis.net/internal...044968#1044968

Sinnvoll wäre es wie dort gezeigt die Funktion aufzurufen und danach außerhalb den Label mit dem Rückgabewert zu beschriften.

nimmersattXD 5. Jun 2009 10:31

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));

Satty67 5. Jun 2009 10:41

Re: Taschenrechner Ausgabe
 
Zitat:

Zitat von jaenicke
Sinnvoll wäre es wie dort gezeigt die Funktion aufzurufen und danach außerhalb den Label mit dem Rückgabewert zu beschriften.

Ja, Ich hab es leider wieder unglücklich "zerstückelt", was ihn wohl leider etwas überforderte, mangels Verständnis

Außerhalb steht (im ButtonClick von "=" möglicherweise)
Delphi-Quellcode:
LabelAnzeige.Caption := FloatToStr(BerechneTerm(LabelAnzeige.Caption));
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.

safak67 5. Jun 2009 10:49

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;

Satty67 5. Jun 2009 11:10

Re: Taschenrechner Ausgabe
 
Folgende Deklaration im TForm1 muss weg
Delphi-Quellcode:
procedure SpZeichenClick(Sender: TObject);
Dazu fehlt die passende Methode. Für die SpeedButton +,-,* und / weist du im Objektinspektor das KlickEreignis "spZahlKlick" zu.

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.

Jürgen Thomas 5. Jun 2009 11:16

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:

Zitat von Satty67
Außerhalb steht (im ButtonClick von "=" möglicherweise)
Delphi-Quellcode:
LabelAnzeige.Caption := FloatToStr(BerechneTerm(LabelAnzeige.Caption));

Der Kommentar in spResultClick ist als gültiger Befehl auszuweisen.

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:
position := Pos(Op,Formular);
if (position > 1) then ...
Jürgen

/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?

safak67 5. Jun 2009 11:20

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.

mkinzler 5. Jun 2009 11:25

Re: Taschenrechner Ausgabe
 
Schau dir das Programm mal im Debugger Schritt für Schritt an

Satty67 5. Jun 2009 11:26

Re: Taschenrechner Ausgabe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von safak67
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.

Genau und das ist jetzt auch gut so! Finger weg von allem, was nicht in BerechneTerm ist!

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!)

Klaus01 5. Jun 2009 11:40

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

Satty67 5. Jun 2009 12:20

Re: Taschenrechner Ausgabe
 
So ist es und die Case-Zuweisungen der Operatoren war auch nicht identisch (+ = * usw.)
Delphi-Quellcode:
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;
Es fehlt noch Feinarbeit, nach einem Ergebnis muss neue Zahleingabe das Eingabefeld löschen usw. aber rechnen sollte er jetzt besser

safak67 5. Jun 2009 12:25

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;

Klaus01 5. Jun 2009 12:28

Re: Taschenrechner Ausgabe
 
Hallo,

versuche mal diesen Code.

Delphi-Quellcode:
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;
Grüße
Klaus

Satty67 5. Jun 2009 12:32

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.

safak67 5. Jun 2009 12:39

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

Satty67 5. Jun 2009 12:43

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

Klaus01 5. Jun 2009 12:45

Re: Taschenrechner Ausgabe
 
Zitat:

Zitat von safak67
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

Welche Fehlermeldung kommt bei der Multiplikation=

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

safak67 5. Jun 2009 12:50

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..

Satty67 5. Jun 2009 12:52

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.

safak67 5. Jun 2009 12:55

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.

Satty67 5. Jun 2009 12:59

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.

Klaus01 5. Jun 2009 13:01

Re: Taschenrechner Ausgabe
 
Zitat:

Zitat von safak67
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.

weil Deine (und auch meine) Routine stumpf von links nach rechts rechnet.
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

safak67 5. Jun 2009 13:18

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

HenKst 5. Jun 2009 13:30

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:
case index of
  0: Result := Seg1 * Seg2;
  1: Result := Seg1 / Seg2;
  2: Result := Seg1 + Seg2;
  3: Result := Seg1 - Seg2;
end;
break;
Aber 1+1*2 ist 4 ;)
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.
Seite 1 von 2  1 2      

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