![]() |
Division by zero - Teilen durch 0
Auf Geheiß des Moderators und nach erfolgreicher Lösung der vorhergehende Frage, nun eine neue Frage. :-D
Der nächste Fehler scheint hier zu entstehen, es wird die Fehlermeldung Division durch 0 ausgegeben, muss die Methode um die Zähler und Nenner der beiden Brüche erweitert werden? mBruch
Delphi-Quellcode:
Die entsprechende Funktion in mBruchrechner sieht so aus:
procedure Bruch.KuerzeUm(pFaktor: integer);
begin if ((zZaehler MOD pFaktor = 0) and (zNenner MOD pFaktor = 0)) then zZaehler := zZaehler div pFaktor; zNenner := zNenner div pFaktor; end; function Bruch.ggt(zZaehler,zNenner:integer): integer; begin if zZaehler = zNenner then result := zZaehler else result := ggt(min(zNenner,zZaehler), abs(zZaehler-zNenner)); end;
Delphi-Quellcode:
function Bruchrechner.Addition(pBruch1,pBruch2: Bruch): Bruch;
begin result:=Bruch.init; result.setzeNenner(pBruch2.gibNenner * pBruch1.gibZaehler); result.setzeZaehler(pBruch1.gibZaehler * pBruch2.gibNenner + pBruch2.gibZaehler * pBruch1.gibNenner); result.KuerzeVoll; end; |
Re: Division by zero - Teilen durch 0
prüfst du denn ab, ob der divisor 0 ist, bevor du die division vornimmst?
|
Re: Division by zero - Teilen durch 0
Was willst du denn wissen? Warum der Fehler auftritt?
Du musst drauf achten, dass pFaktor <> 0 ist. |
Re: Division by zero - Teilen durch 0
Delphi-Quellcode:
procedure Bruch.KuerzeUm(pFaktor: integer);
begin if ((zZaehler MOD pFaktor = 0) and (zNenner MOD pFaktor = 0)) then begin zZaehler := zZaehler div pFaktor; zNenner := zNenner div pFaktor; end; end; |
Re: Division by zero - Teilen durch 0
Zitat:
Zitat:
Okay, aber wie setze ich das um? Habe es mal so versucht:
Delphi-Quellcode:
Da ist das Ergebnis der Addition aber immer 0.
procedure Bruch.KuerzeUm(pFaktor: integer);
begin if pFaktor <> 0 then begin if ((zZaehler MOD pFaktor = 0) and (zNenner MOD pFaktor = 0)) then zZaehler := zZaehler div pFaktor; zNenner := zNenner div pFaktor; end; end; |
Re: Division by zero - Teilen durch 0
Was hat den pFaktor für einen Wert?
|
Re: Division by zero - Teilen durch 0
Zitat:
|
Re: Division by zero - Teilen durch 0
Zitat:
|
Re: Division by zero - Teilen durch 0
Zitat:
Zur Zeit sieht das halt so aus:
Delphi-Quellcode:
procedure Bruch.KuerzeUm(pFaktor: integer);
begin if pFaktor <> 0 then begin if ((zZaehler MOD pFaktor = 0) and (zNenner MOD pFaktor = 0)) then zZaehler := zZaehler div pFaktor; zNenner := zNenner div pFaktor; end; end; function Bruch.ggt(zZaehler,zNenner:integer): integer; begin if zZaehler = zNenner then result := zZaehler else result := ggt(min(zNenner,zZaehler), abs(zZaehler-zNenner)); end; procedure Bruch.KuerzeVoll; begin self.KuerzeUm(self.ggT(zZaehler,zNenner)); end; |
Re: Division by zero - Teilen durch 0
Daher kommt mein Nick... :-D
Wie rufst du die Funktion denn auf? Sieht eigentlich ganz gut aus. |
Re: Division by zero - Teilen durch 0
Zitat:
Delphi-Quellcode:
mBruchrechner
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin self.setzeEingabe; hatBruchrechner.Addition(hatBruch1, hatBruch2); self.zeigeErgebnis; end;
Delphi-Quellcode:
function Bruchrechner.Addition(pBruch1,pBruch2: Bruch): Bruch;
begin result:=Bruch.init; result.setzeNenner(pBruch2.gibNenner * pBruch1.gibZaehler); result.setzeZaehler(pBruch1.gibZaehler * pBruch2.gibNenner + pBruch2.gibZaehler * pBruch1.gibNenner); result.KuerzeVoll; end; |
Re: Division by zero - Teilen durch 0
Kontrollier mal was da raus kommt:
Delphi-Quellcode:
ggT(zZaehler,zNenner)
|
Re: Division by zero - Teilen durch 0
Da fehlen immernoch begin und end
|
Re: Division by zero - Teilen durch 0
Delphi-Quellcode:
procedure Bruch.KuerzeUm(pFaktor: integer);
begin if pFaktor <> 0 then if ((zZaehler MOD pFaktor = 0) and (zNenner MOD pFaktor = 0)) then begin zZaehler := zZaehler div pFaktor; zNenner := zNenner div pFaktor; end; end; |
Re: Division by zero - Teilen durch 0
Wenn dann zeig ihm bitte die vollere Variante, denn offenbar weiß er nicht wann er sie weglassen darf und wann nicht. Im Zweifelsfall also imemr einmal zuviel als zuwenig
Delphi-Quellcode:
procedure Bruch.KuerzeUm(pFaktor: integer);
begin if pFaktor <> 0 then begin if ((zZaehler MOD pFaktor = 0) and (zNenner MOD pFaktor = 0)) then begin zZaehler := zZaehler div pFaktor; zNenner := zNenner div pFaktor; end; end; end; |
Re: Division by zero - Teilen durch 0
Okay, ,also:
1. Du rechnest falsch. Allgemein gilt a/b + c/d = (ad+bc)/bd - In deiner Methode wird der Nenner falsch berechnet. 2. Du solltest bereits beim Verscuh, den Nenner auf 0 zu setzen, eine Exception werfen, oder etwas ähnliches. Der Nenner darf unter keinen Umständen 0 werden ;) 3. Damit löst dsich das Problem in Luft auf. Deine ggt-Methode gibt immer einen Wert >= 1 zurück, daher kannst du einfach auf die Prüfung verzichten und knallhart dividieren. (und wenn du durch 1 kürzt .. na und?) 4. Die Kürze-Methode sollte natürlich protected sein, ,damit keiner auf die Idee kommt, 0 kürzen zu wollen. (Ist auch eine Division durch null, mmacht mathematisch keinen Sinn.) Hoffe gehilfen zu haben :stupid: Edit, okay, im Zuge der allgemeinen Redundanz kann man evtl. pFaktor in der Kuerze-Methode auf != 0 prüfen. Aber wenn die Methode protected ist, dann bracht man das nicht. Und public sollte sie eh nicht sein. |
Re: Division by zero - Teilen durch 0
begin...end fehlt ist mir gar nicht aufgefallen... :oops:
Sorry. |
Re: Division by zero - Teilen durch 0
Danke soweit, habe die Sache mit dem begin und end übernommen, die Methode Addition korrigiert und kuerzeUm von public nach protected verfrachtet, das Ergebnis der Addition ist weiterhin 0.
|
Re: Division by zero - Teilen durch 0
Habs :)
Zitat:
|
Re: Division by zero - Teilen durch 0
Zitat:
Das habe ich ja bereits:
Delphi-Quellcode:
Und so sieht jetzt die "neue" Addition aus:
procedure TTestBruchrechner.zeigeErgebnis;
begin LZaehlerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibZaehler); LNennerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibNenner); end;
Delphi-Quellcode:
Wie stelle ich das jetzt an, dass diese Werte übergeben werden? Wenn das jemand wüsste, dann könnte ich zufrieden schlafen gehen. :mrgreen:
function Bruchrechner.Addition(pBruch1,pBruch2: Bruch): Bruch;
begin result:=Bruch.init; result.setzeNenner(pBruch2.gibNenner * pBruch1.gibNenner); result.setzeZaehler(pBruch1.gibZaehler * pBruch2.gibNenner + pBruch2.gibZaehler * pBruch1.gibNenner); result.KuerzeVoll; end; |
Re: Division by zero - Teilen durch 0
Unter der Annahme, dass hatErgebnisBruch ein Feld von TTestBruchrechner des Typs Bruch ist:
Delphi-Quellcode:
Könnte gehen :stupid:
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin self.setzeEingabe; hatErgebnisBruch = hatBruchrechner.Addition(hatBruch1, hatBruch2); self.zeigeErgebnis; end; (Bin jetzt auch müde .....) |
Re: Division by zero - Teilen durch 0
Geht nicht, danke trotzdem. :-D Ergebnis weiterhin 0.
|
Re: Division by zero - Teilen durch 0
Dann solltest du mal schauen, ob am Aufruf oder an der Rechnung liegt.
Mach nen Breakpoint an die Zeile (links daneben klicken, dann erscheint da son roter Punkt) Jetzt sollte er beim ausführen da anhalten. Jetzt mit einzelschritt durchgehen (F5 ... oder wars F6, F11 oder F10 ??) Du kannst Variableninhalte erfahren, indem du drüberhooverst (komisches wort ^^) Siehe auch da: ![]() |
Re: Division by zero - Teilen durch 0
Juhu, es geht, zZaehler und zNenner wurden wohl falsch gesetzt, habe es geändert und es läuft, danke vielmals!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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 by Thomas Breitkreuz