AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Taschenrechner Ausgabe

Ein Thema von safak67 · begonnen am 5. Jun 2009 · letzter Beitrag vom 8. Jun 2009
Thema geschlossen
Seite 3 von 8     123 45     Letzte »    
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#21

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 11:10
Folgende Deklaration im TForm1 muss weg
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

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#22

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 11:16
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 von Satty67:
Außerhalb steht (im ButtonClick von "=" möglicherweise)
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?
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
 
safak67

Registriert seit: 22. Mär 2009
87 Beiträge
 
#23

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 11:20
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
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#24

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 11:25
Schau dir das Programm mal im Debugger Schritt für Schritt an
Markus Kinzler
 
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#25

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 11:26
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!)
Angehängte Dateien
Dateityp: 7z taschenrechner_safak67_166.7z (2,7 KB, 3x aufgerufen)
 
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#26

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 11:40
.. 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
Klaus
 
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#27

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 12:20
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

Registriert seit: 22. Mär 2009
87 Beiträge
 
#28

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 12:25
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

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#29

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 12:28
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
Klaus
 
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#30

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 12:32
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.
 
Thema geschlossen
Seite 3 von 8     123 45     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz