![]() |
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: |
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); |
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. ![]() 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. |
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.. |
Re: Taschenrechner Ausgabe
Zitat:
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? |
Re: Taschenrechner Ausgabe
wenn ich die operanden vertausche macht er kein punkt vor strichrechnung, sondern umgekehrt..
|
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. |
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 |
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:
Den brauchst du schon noch, sonst hast du die gleiche Situation wie vorher nur mit mit anderen Operanden.
case index of
0: Result := Seg1 + Seg2; 1: Result := Seg1 - Seg2; 2: Result := Seg1 * Seg2; 3: Result := Seg1 / Seg2; end; break; |
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. |
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