Delphi-PRAXiS
Seite 2 von 3     12 3      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:42 Uhr.
Seite 2 von 3     12 3      

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