Delphi-PRAXiS
Seite 3 von 8     123 45     Letzte »    

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)

Satty67 5. Jun 2009 10: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 10: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 10: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 10:25

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

Satty67 5. Jun 2009 10: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 10: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 11: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 11: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 11: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 11: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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.
Seite 3 von 8     123 45     Letzte »    

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