Einsendung:

Lösungsvorschlag

   int kgv(int a,int b)
   {
      return a*b/ggt(a,b);
   };

Diese Funktion sollte nicht in der Klasse Rational stehen. Besser ist sie genau dort aufgehoben, wo die Funktion ggt() steht.

   Rational operator/(Rational rhs)
   {
      int resultz = m_zaehler * rhs.m_nenner;
      int resultn = m_nenner * rhs.m_zaehler;
      Rational result(resultz, resultn);
      return result;
   };

Yup.

   Rational operator+(Rational rhs)
   {
      int resultn = kgv(m_nenner, rhs.m_nenner);
      int tempz1 = m_zaehler * resultn / m_nenner;
      int tempz2 = rhs.m_zaehler * resultn / rhs.m_nenner;
      int resultz = tempz1 + tempz2;
      Rational result(resultz, resultn);
      return result;
   };

Yup. Allerdings ist der Aufruf der kgv-Funktion und in ihr der Aufruf der ggt-Funktion gar nicht notwendig. Ein einfaches

      int resultn=m_nenner*rhs.m_nenner;

hätte auch gereicht. Gekürzt wird das Ergebnis auf jeden Fall im Konstruktor. Der ggt-Aufruf dort ist ausreichend.

   Rational operator-(Rational rhs)
   {
      int resultn = kgv(m_nenner, rhs.m_nenner);
      int tempz1 = m_zaehler * resultn / m_nenner;
      int tempz2 = rhs.m_zaehler * resultn / rhs.m_nenner;
      int resultz = tempz1 - tempz2;
      Rational result(resultz, resultn);
      return result;
   };

Yup.

Leider funktioniert folgendes nicht:

    Rational a(1,6);
    Rational b(1,5);
    Rational c=a-b;
    c.print();  // Ausgabe müsste sein: -1/30; Stattdessen gibt
es
// eine allgemeine Schutzverletzung + "Stack overflow"

Mit assert konnte ich die Fehlerquelle auf die rekursive Funktion ggt zurückführen; werden negative Werte übergeben, klappt's nicht mehr...
Wie kann man Abhilfe schaffen?

Da hilft die nächste Einsendung:

Ich weiß nicht, ob Ihnen das schon mal einer gesagt hatte, aber die Funktion ggt() funktionierte für negative Zahlen nicht richtig. Wenn man einen negativen Bruch nahm, stürzte das Programm ab. Ich hatte die folgendermaßen umgeändert und jetzt funktioniert's:

int ggt(int a,int b)
{
// a soll größer als b sein
   a=abs(a);
   b=abs(b);  // Immer positive Werte nehmen

   if(b>a)
      return ggt(b,a);

   if(b!=0)
      return ggt(b,a%b);
   else
       return a;
};

Ja, das ist gut.



Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00