0

コードに通常の分数を入力すると、なぜ無限の値が返されるのか、一生理解できません。GCD (最大公約数) 以外はすべて機能しているようです。

この中に露骨に明らかな論理エラーがありますか?

私は調査を行い、質問に対するさまざまな回答を見つけました。つまり、ウィキペディアはそれを行うためのコードを提供していますが、現在のようにコーディングした方法で機能させる方法を理解したいと思います.

#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <math.h>

using namespace std;

class Fraction
{
private:
   double num;
   double den;
   double fraction;
   double temp;
public:
   void setNum();
   void setDen();
   int getNum();
   int getDen();
   void lcdOutput();
   void decOutput();
   int gcd();
};

void Fraction::setNum(){
   cout << "Enter a value for your numerator: " << endl;
   cin >> num;
}

void Fraction::setDen(){
    cout << "Enter a value for your denominator: " << endl;
    cin >> den;
}

int Fraction::getNum(){
    return num;
 }

 int Fraction::getDen(){
     return den;
  }

int Fraction::gcd(){

    Fraction set;
    if(num > den){
       if(fmod(num, den) == 0){
          den = temp;
          return temp;
       }
       else{
          den = fmod(num, den);
          set.gcd();
       }
    }
    else{
       if(fmod(den, num) == 0){
          num = temp;
          return temp;
       }
       else{
          num = fmod(den, num);
          set.gcd();
       }
    }
 }

void Fraction::lcdOutput(){
    Fraction set;
    set.gcd();
    num = num / temp;
    den = den / temp;
    cout << "Fraction in lowest terms: " << num << "/" << den << endl;
}

void Fraction::decOutput(){
   double decimal = num / den;
   cout.precision(4);
   cout << "The fraction in decimal form is: " << decimal << endl;
}

int main(){

    Fraction set;

    set.setNum();
    set.setDen();
    set.getNum();
    set.getDen();
    set.lcdOutput();
    set.decOutput();

return 0;
}
4

2 に答える 2

6

コードをステップ実行するだけで判断できることは次のとおりです。

main から始めて、Fractionという名前の型のインスタンスをインスタンス化しますsetset.setNum()と を呼び出して、その分子と分母を割り当てますset.setDen()getNum()この場合、 andへの呼び出しgetDen()は何も割り当てられていないため、何もしません。

次に、 を呼び出すlcdOutput()ので、その手順を開始します。Fraction の LOCAL インスタンスをインスタンス化することから始めます (なぜこれを実行したいのかわかりませんが、これは概念的な間違いかもしれません)。次にset.gcd()、そのローカル インスタンスを呼び出します。呼び出すset.gcd()と、そのインスタンスのメソッドが呼び出されます。あなたが本当に欲しいのはthis->gcd()、または単にgcd().

num = num / tempとを設定してフォローアップしますden = den / temptemp、この時点ではまだ初期化されていません。変数が初期化されていない場合、(通常は) を指すことができgarbageます。これはおそらく、無意味な値が返される理由を説明しています。

于 2013-03-15T22:59:31.117 に答える
0

帰ってきて自分なりに考えてみました。いくつかのコメントを見て、非常に大きな概念的および論理的誤りに気づきました。同じ疑問を持つ人はこちら!

int gcd(double num, double den){
    if(den == 0){
       return num;
    }
return gcd(den, fmod(num, den));
}

void Fraction::lcdOutput(){
    double temp = gcd(num, den);
    cout << "Fraction in lowest terms: " << num / temp << "/" << den / temp << endl;
}
于 2013-03-15T23:23:35.740 に答える