Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Division by zero - Teilen durch 0 (https://www.delphipraxis.net/121265-division-zero-teilen-durch-0-a.html)

HackZu 24. Sep 2008 20:55


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:
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;
Die entsprechende Funktion in mBruchrechner sieht so aus:

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;

grenzgaenger 24. Sep 2008 21:05

Re: Division by zero - Teilen durch 0
 
prüfst du denn ab, ob der divisor 0 ist, bevor du die division vornimmst?

divBy0 24. Sep 2008 21:05

Re: Division by zero - Teilen durch 0
 
Was willst du denn wissen? Warum der Fehler auftritt?

Du musst drauf achten, dass pFaktor <> 0 ist.

freak4fun 24. Sep 2008 21:06

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;

HackZu 24. Sep 2008 21:24

Re: Division by zero - Teilen durch 0
 
Zitat:

Zitat von grenzgaenger
prüfst du denn ab, ob der divisor 0 ist, bevor du die division vornimmst?

Nein.

Zitat:

Zitat von divBy0
Was willst du denn wissen? Warum der Fehler auftritt?

Du musst drauf achten, dass pFaktor <> 0 ist.

Ja.

Okay, aber wie setze ich das um? Habe es mal so versucht:

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;
Da ist das Ergebnis der Addition aber immer 0.

divBy0 24. Sep 2008 21:26

Re: Division by zero - Teilen durch 0
 
Was hat den pFaktor für einen Wert?

grenzgaenger 24. Sep 2008 21:32

Re: Division by zero - Teilen durch 0
 
Zitat:

Zitat von HackZu
Zitat:

Zitat von grenzgaenger
prüfst du denn ab, ob der divisor 0 ist, bevor du die division vornimmst?

Nein.

und weshalb nicht? meist der rechner meckert schon, wenn er durch 0 teilt ... aber das gefällt dir ja auch nicht oder :roll:

grenzgaenger 24. Sep 2008 21:33

Re: Division by zero - Teilen durch 0
 
Zitat:

Zitat von divBy0
Was hat den pFaktor für einen Wert?

in diesem fall wohl NULL und dann gibts deinen nick 8)

HackZu 24. Sep 2008 21:35

Re: Division by zero - Teilen durch 0
 
Zitat:

Zitat von divBy0
Was hat den pFaktor für einen Wert?

Das ist ja das Problem, wir haben diese Unit aus einem alten Projekt übernommen, bei dem der Benutzer den Faktor eingeben musste (kuerzeUm) oder pFaktor den Wert des ggT annahm (kuerzeVoll) mit dem dann gekürzt wurde, daher meine Frage, wie ich das kuerzeUm auf das neue Projekt anpassen muss?

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;

divBy0 24. Sep 2008 21:37

Re: Division by zero - Teilen durch 0
 
Daher kommt mein Nick... :-D

Wie rufst du die Funktion denn auf? Sieht eigentlich ganz gut aus.

HackZu 24. Sep 2008 21:40

Re: Division by zero - Teilen durch 0
 
Zitat:

Zitat von divBy0
Daher kommt mein Nick... :-D

Wie rufst du die Funktion denn auf? Sieht eigentlich ganz gut aus.


Delphi-Quellcode:
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin
  self.setzeEingabe;
  hatBruchrechner.Addition(hatBruch1, hatBruch2);
  self.zeigeErgebnis;
end;
mBruchrechner

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;

divBy0 24. Sep 2008 21:41

Re: Division by zero - Teilen durch 0
 
Kontrollier mal was da raus kommt:

Delphi-Quellcode:
ggT(zZaehler,zNenner)

inherited 24. Sep 2008 21:41

Re: Division by zero - Teilen durch 0
 
Da fehlen immernoch begin und end

freak4fun 24. Sep 2008 21:42

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;

inherited 24. Sep 2008 21:44

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;

jfheins 24. Sep 2008 21:48

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.

divBy0 24. Sep 2008 21:48

Re: Division by zero - Teilen durch 0
 
begin...end fehlt ist mir gar nicht aufgefallen... :oops:

Sorry.

HackZu 24. Sep 2008 22:00

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.

jfheins 24. Sep 2008 22:16

Re: Division by zero - Teilen durch 0
 
Habs :)

Zitat:

Zitat von HackZu
Delphi-Quellcode:
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin
  self.setzeEingabe;
  hatBruchrechner.Addition(hatBruch1, hatBruch2); // Was passiert mit dem Rückgabewert? genau => nix ^^
  self.zeigeErgebnis;
end;


HackZu 24. Sep 2008 22:25

Re: Division by zero - Teilen durch 0
 
Zitat:

Zitat von jfheins
Habs :)

Zitat:

Zitat von HackZu
Delphi-Quellcode:
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin
  self.setzeEingabe;
  hatBruchrechner.Addition(hatBruch1, hatBruch2); // Was passiert mit dem Rückgabewert? genau => nix ^^
  self.zeigeErgebnis;
end;


Okay, klingt einleuchtend.^^ Hast du vielleicht eine Idee, wie ich das regeln könnte?

Das habe ich ja bereits:

Delphi-Quellcode:
procedure TTestBruchrechner.zeigeErgebnis;
begin
  LZaehlerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibZaehler);
  LNennerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibNenner);
end;
Und so sieht jetzt die "neue" Addition aus:

Delphi-Quellcode:
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;
Wie stelle ich das jetzt an, dass diese Werte übergeben werden? Wenn das jemand wüsste, dann könnte ich zufrieden schlafen gehen. :mrgreen:

jfheins 24. Sep 2008 22:31

Re: Division by zero - Teilen durch 0
 
Unter der Annahme, dass hatErgebnisBruch ein Feld von TTestBruchrechner des Typs Bruch ist:


Delphi-Quellcode:
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin
  self.setzeEingabe;
  hatErgebnisBruch = hatBruchrechner.Addition(hatBruch1, hatBruch2);
  self.zeigeErgebnis;
end;
Könnte gehen :stupid:
(Bin jetzt auch müde .....)

HackZu 24. Sep 2008 22:33

Re: Division by zero - Teilen durch 0
 
Geht nicht, danke trotzdem. :-D Ergebnis weiterhin 0.

jfheins 24. Sep 2008 22:39

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: http://www.delphipraxis.net/internal...ct.php?t=47972 ;)

HackZu 24. Sep 2008 23:05

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 02:22 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