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 6 von 8   « Erste     456 78      
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#51

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 15:31
Zitat von safak67:
Delphi-Quellcode:
    case index of
      0: Op := 'x';
      1: Op := '/';
      2: Op := '+';
      3: Op := '-';
    end;
//...
      case index of
         0: Result := Seg1 + Seg2;
         1: Result := Seg1 - Seg2;
         2: Result := Seg1 * Seg2;
         3: Result := Seg1 / Seg2;
      end;
und da funktioniert irgendwas?
So wird doch bei 'x' + gerechnet und bei '+' *...

Naja abgesehen davon liegt der Rechenfehler daran das das programm, wie Blup schon vor zwei tagen sagte, nicht weiss das von links nach rechts gerechnet wird.
Es gibt recursiv 2*2-2 weiter, was 2 ergibt, und rechnet am Ende dann 2-2.

Dafür hab ich aber momentan auch keine Lösung parat.
Ein Ansatz wäre, wei beim windows Taschenrechner, jedes mal wenn du einen neuen Operator mit niedrigerer Priorität benutzt, das bisherige Ergebnis auszurechnen.
narf - not a real function
 
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#52

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 17:00
Die Lösung liegt darin, die Operatoren nach Priorität in Gruppen aufzuteilen.
Für jede Gruppe wird der jeweils am weitesten Rechts im Term liegende Operator ermittelt.
Delphi-Quellcode:
{ermittelt aus einer Reihe von Operatoren den,
der am weitesten Rechts im Term auftaucht}

function FindOperator(const ATerm, AOperatoren: string;
  out AOp: Char; out APos: Integer): Boolean;
var
  i, iPos: Integer;
  Op: Char;
begin
  AOp := #0;
  APos := 0;
  Result := False;
  for i := 1 to Length(AOperatoren) do
  begin
    Op := AOperatoren[i];
    iPos := APos;
    repeat
      iPos := PosEx(Op, ATerm, iPos + 1);
      if iPos > APos then
      begin
        AOp := Op;
        APos := iPos;
        Result := True;
      end;
    until (iPos = 0);
  end;
end;

function BerechneTerm(ATerm: string): Double;
const
  OperatorLevel: array[0..1] of string = ('+-', '*/');
var
  Op: Char;
  i, iPos: Integer;
  Value1, Value2: Double;
begin
  for i := Low(OperatorLevel) to High(OperatorLevel) do
  begin
    if FindOperator(ATerm, OperatorLevel[i], Op, iPos) then
    begin
      Value1 := BerechneTerm(Copy(ATerm, 1, iPos - 1));
      Value2 := BerechneTerm(Copy(ATerm, iPos + 1, Length(ATerm)));
      case Op of
        '+': Result := Value1 + Value2;
        '-': Result := Value1 - Value2;
        '*': Result := Value1 * Value2;
        '/': Result := Value1 / Value2;
      else
        raise Exception.Create(Format('undefinierter Operator ''%s''', [Op]));
      end;
      Exit;
    end;
  end;
  Result := StrToFloat(ATerm);
end;
 
safak67

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

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 18:41
ich habe hier jetzt die Fehlermeldung "ein Bezeichner erwartet, aber PRIVATE gefunden" das kam aber als MessageBox
 
Satty67

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

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 18:46
Dann hast Du oben im Formular einen Bezeichner entfernt, wohl zu einem Button oder dergleichen.

Ich plädiere ja immer noch etwas für Strategie #2: dem Lehrer sagen, das er nach einer Woche Delphi nicht verlangen kann, dass ein Taschenrechner programmiert wird, der dann mit einer der wichtigsten Noten bewertet wird.
 
Klaus01

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

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 19:30
.. ein wenig Offtopic

Man könnte das Thema ja auch etwas anders angehen.
Ein stinknormaler Taschenrechner leist ja auch nicht die ganze
Gleichung ein.
Es wird eine Zahl eingegeben
es wird ein Operator eingeben
es wird eine weitere Zahl eingeben
es wird ein Zwischenergebnis berechnet
wird ein weiterer Operator eingegeben wird
mit dem Zwischenergebnis weitergerechnet.

(oder man nutzt UPN (umgekehrt polnische Notation))

Grüße
Klaus
Klaus
 
safak67

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

Re: Taschenrechner Ausgabe

  Alt 8. Jun 2009, 09:26
Hallo,

auch mit der oben genannten Lösung ging das nicht.. Iwi vertauscht er immer den zweiten Operator (nur bei der Division).
wenn ich 3-3*3-3 mache kommt da immer noch -3 raus anstatt -9.
 
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#57

Re: Taschenrechner Ausgabe

  Alt 8. Jun 2009, 09:58

Bei mir kommt bei 3-3*3-3 immer -9 raus.
Division kommt in diesem Term nicht vor.
Aber 3-3/3-3 ergibt -1.

Wenn du nicht das selbe Ergebnis hast, bist du nicht in der Lage ordentlich abzuschreiben.
 
safak67

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

Re: Taschenrechner Ausgabe

  Alt 8. Jun 2009, 10:07
Ich kriege jetzt die Fehlermeldung:

[DCC Fehler] Calculator_Main.PAS(76): E2066 Operator oder Semikolon fehlt
[DCC Fehler] Calculator_Main.PAS(36): E2065 Ungenügende Forward- oder External-Deklaration: 'TFormTR.spResultClick'

Der erste Fehler kommt in dieser Zeile
iPos := PosEx(Op, ATerm, iPos + 1); und noch ne Frage.. als was muss ich PosEx definieren?
 
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#59

Re: Taschenrechner Ausgabe

  Alt 8. Jun 2009, 10:12
Zitat von safak67:
[DCC Fehler] Calculator_Main.PAS(76): E2066 Operator oder Semikolon fehlt
Der Fehler liegt meistens eine Zeile davor.

Zitat von safak67:
[DCC Fehler] Calculator_Main.PAS(36): E2065 Ungenügende Forward- oder External-Deklaration: 'TFormTR.spResultClick'
Hast du denn spResultClick unter implementation definiert?

Zitat von safak67:
als was muss ich PosEx definieren?
Gar nicht, das ist schon definiert, du musst nur ggf. die Unit StrUtils noch in die uses einbinden.
Sebastian Jänicke
AppCentral
 
safak67

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

Re: Taschenrechner Ausgabe

  Alt 8. Jun 2009, 10:17
Zitat von jaenicke:
Zitat von safak67:
[DCC Fehler] Calculator_Main.PAS(76): E2066 Operator oder Semikolon fehlt
Der Fehler liegt meistens eine Zeile davor.
Ich habe den Fehler nicht gefunden. Hier die ganze Spalte..
Delphi-Quellcode:
begin
    Op := AOperatoren[i];
    iPos := APos;
    repeat
      iPos := PosEx(Op, ATerm, iPos + 1);
      if iPos > APos then

Zitat von jaenicke:
Zitat von safak67:
[DCC Fehler] Calculator_Main.PAS(36): E2065 Ungenügende Forward- oder External-Deklaration: 'TFormTR.spResultClick'
Hast du denn spResultClick unter implementation definiert?
Unter implementation ist garnichts..

Zitat von jaenicke:
Zitat von safak67:
als was muss ich PosEx definieren?
Gar nicht, das ist schon definiert, du musst nur ggf. die Unit StrUtils noch in die uses einbinden.
Wie jetzt? (Bitte nicht sofort schimpfen, ich weiß bin noch Noob, ich gebe wirklich mein bestes Delphi lernen.)
 
Thema geschlossen
Seite 6 von 8   « Erste     456 78      


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 05:20 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