Delphi-PRAXiS
Seite 5 von 8   « Erste     345 67     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)

safak67 5. Jun 2009 12:48

Re: Taschenrechner Ausgabe
 
wenn ich das break einfüge dann macht er die division und addition richtig aber dann macht er die multiplikation falsch und wenn kein break da ist dann macht er das eine falsch das andere richtig...

:wall: :wall: :wall: :wall:

HenKst 5. Jun 2009 12:53

Re: Taschenrechner Ausgabe
 
Das lässt sich ja relativ einfach lösen indem du nur bei '+' und '-' breakst.
Schön ist das aber eigentlich nich wenn man nicht weiss worans liegt^^

Delphi-Quellcode:
case index of
  0: Result := Seg1 * Seg2;
  1: Result := Seg1 / Seg2;
  2: begin
       Result := Seg1 + Seg2;
       break;
  end;
  3: begin
       Result := Seg1 - Seg2;
       break;
  end;
end;

€dit
Es liegt daran dass der Operator der zuerst gefunden wird, nicht zuerst berechnet wird.
Wenn du 2*3+3 eingibst findet die funktion zuerst 2*3, gibt 3+3 recursiv weiter und rechnet das dann aus.
Dann steht in der ersten instanz 2*6 und das ergibt 12.
Wenn man die reihenfolge umdreht(also zuerst auf '+' und '-' prüft), findet die funktion zuerst 3+3 und gibt 2*3 weiter.
Das ergibt richtigerweise 3+6 = 9.

Weil die funktion ohne break einfach weiterläuft findet sie nachdem sie das '*' gefunden hat, das '+' neu und macht genau das selbe als würden die operatoren umgekehrt geprüft :=)

Delphi-Quellcode:
  OpFound := False;
  Result:= 0;
  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;
      break;
    end;
  end;

  if Not OpFound then Result := StrToFloat(Formular);

Blup 5. Jun 2009 13:17

Re: Taschenrechner Ausgabe
 
Die Reihenfolge gleichwertiger Operatoren wurden bereits bei der ursprünglichen von mir geposteten Funktion noch nicht berücksichtigt.
Ich habe darauf hingewiesen.

http://www.delphipraxis.net/internal...t.php?t=158936

Der Gedanke war, daß sich jemand bestimmtes damit auseinander setzt, die Funktion versteht und zumindest einen kleinen Teil selbst programmiert (oder zumindest nach einem Ansatz sucht).
Die Funktion wurde mehrfach verändert (so daß diese zwischenzeitlich garnicht mehr funktionierte) und liefert jetzt wieder die ursprünglichen Ergebnisse.

Allerdings scheint es kaum Fortschritte beim Verständnis für das Programmieren im allgemeinen zu geben.
Wenn man ein wichtiges Projekt hat, dann muss man sich auch jeden Tag tatsächlich intensiv damit beschäftigen.
(2-3 Stunden und sei es nur indirekt in dem man z.B. Bücher für Anfänger liest)
Ich denke das passiert aber nicht, sonst würden die meisten der hier gestellten Fragen in dieser Form nicht mehr auftreten.

Wahrscheinlich könnte fast jeder in diesem Forum das Programm fertigstellen.
Aber das kann nicht Ziel diese Projektes gewesen sein.
Zumindest sollte man das Programm danach verstehen und selbst erklären können.

safak67 5. Jun 2009 13:30

Re: Taschenrechner Ausgabe
 
Ich weiß nicht wie oft ich es noch schreiben soll.. Aber ich habe vorher noch NIE mit Delphi programmiert, die Aufgabe sollte ich ohne Vorkentnisse machen. Ich habe nur das Buch Delphi für Kids erhalten mit ich mich auch intensiv beschäftige..
Naja zurück zum Thema:

Also wenn ich die Operanden vertausche funktioniert das nicht aber wenn ich das break einfüge unter + und - dann geht das..

HenKst 5. Jun 2009 13:37

Re: Taschenrechner Ausgabe
 
Zitat:

Zitat von safak67

Also wenn ich die Operanden vertausche funktioniert das nicht aber wenn ich das break einfüge unter + und - dann geht das..

Das macht zwar im Endeffekt das selbe, ist aber undschön frisst überflüssig Rechenzeit.

Was funktioniert denn nicht wenn du die Operanden vertauschst?

Das beispiel das ich gepostet habe ist quasi identisch mit dem code den dir Blup schon vor zwei tagen gegeben hat.
Wieso hast du den überhaupt so verändert?

safak67 5. Jun 2009 13:39

Re: Taschenrechner Ausgabe
 
wenn ich die operanden vertausche macht er kein punkt vor strichrechnung, sondern umgekehrt..

HenKst 5. Jun 2009 13:47

Re: Taschenrechner Ausgabe
 
Hast du die Operanden denn auch in beiden cases geändert?

Bei mir funktioniert das einwandfrei...

Und es bleibt die frage wieso du das überhaupt geändert hast.
In Blups code war es doch richtig.

safak67 5. Jun 2009 13:53

Re: Taschenrechner Ausgabe
 
ja ich habe es in den beiden cases verändert.. wenn ich z.B 3+3*3 eintippe kommt da 18 raus...
aber wie gesagt andersrum funktioniert es, also mit den breaks..
hat einer vllt ne idee, was ich falsch gemacht habe

HenKst 5. Jun 2009 14:12

Re: Taschenrechner Ausgabe
 
Dass es mit den breaks funktioniert ist aber eigentlich Zufall, darauf darfst du nichts aufbauen.

Hast du den einen Break hinterm case?

Delphi-Quellcode:
case index of
  0: Result := Seg1 + Seg2;
  1: Result := Seg1 - Seg2;
  2: Result := Seg1 * Seg2;
  3: Result := Seg1 / Seg2;
end;
break;
Den brauchst du schon noch, sonst hast du die gleiche Situation wie vorher nur mit mit anderen Operanden.

safak67 5. Jun 2009 14:17

Re: Taschenrechner Ausgabe
 
ich habe da immer noch ein rechenfehler drin.. wenn ich 2-2*2-2 gibt er mir 0 aus was ja falsch ist.. weiß einer warum.?
bei der eingabe 3-3*3-3 gibt er mir -3 aus anstatt -9, der vertauscht das zweite minus in plus um oder so ähnlich

der aktuelle quelltext was ich habe:
Delphi-Quellcode:
function TFormTR.BerechneTerm(Formular: string): Double;
var
  Seg1,Seg2    : double;
  index, ipos : integer;
  Op          : string;
  OpFound     : Boolean;
begin
  OpFound := False;
  for index := 0 to 3 do begin
    case index of
      0: Op := 'x';
      1: Op := '/';
      2: Op := '+';
      3: Op := '-';
    end;
    ipos:= pos(Op,Formular);
    if ipos > 1 then
    begin
      OpFound := True;
      Seg1 := BerechneTerm(copy(Formular,1,ipos - 1));
      Seg2 := BerechneTerm(copy(Formular,ipos + 1,length(Formular)));
      case index of
         0: Result := Seg1 + Seg2;
         1: Result := Seg1 - Seg2;
         2: Result := Seg1 * Seg2;
         3: Result := Seg1 / Seg2;
      end;
      break;

    end;
  end;

  if Not OpFound then Result := StrToFloat(Formular);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr.
Seite 5 von 8   « Erste     345 67     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