2013-03-15 2 views
0

평생 동안 내 인생을 바랄 수 없다 코드에 정상적인 분수를 입력하면 무한 값이 반환됩니다. GCD (가장 큰 공통 제수) 이외의 모든 것은 작동하는 것처럼 보입니다.분수를 완전히 줄이거 나 단순화하는 방법 (C++)

여기에 어딘가에 명백한 논리 오류가 있습니까?

나는 내 연구를 수행하고 질문에 대한 다양한 대답을 발견했다. Wikipedia가 코드를 작성한다고해도, 코드화 된 방식으로 작동하도록 만드는 방법을 알고 싶다. 그것은 지금이다.

#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; 
} 
+0

분수 생성자는 어디에 있습니까? 나는 'temp'가 할당되는 방법을 보지 못합니다. – Porkbutts

+1

값을 지정하지 않고'temp'를 사용합니다. – Beta

+2

gcd() 함수가 잘못되었습니다. 왜 새로운 분수를 만드는거야? 또한 모든 코드 경로가 실제로 값을 반환하는 것은 아닙니다. –

답변

6

다음은 코드를 단계별로 살펴 보겠습니다.

주에서 시작하여 Fraction이라는 인스턴스의 인스턴스를 set으로 인스턴스화합니다. 분자와 분모를 set.setNum()set.setDen()에 대한 호출을 통해 할당합니다. getNum()getDen()에 대한 호출은 아무 것도 할당되지 않으므로이 경우 아무 것도 수행하지 않습니다.

그런 다음 lcdOutput()으로 전화를 걸어 보시기 바랍니다. Fraction의 LOCAL 인스턴스를 인스턴스화하여 시작합니다 (이유를 모르겠지만 개념상의 실수 일 수 있음). 그런 다음 해당 로컬 인스턴스에 대해 set.gcd()을 호출하십시오. set.gcd()을 호출하면 해당 인스턴스의 메서드가 호출되며 실제로 원하는 것은 this->gcd() 또는 간단히 gcd()입니다.

num = num/tempden = den/temp을 설정하여 후속 조치를 취하지 만이 시점에서 temp은 아직 초기화되지 않은 상태입니다. 변수를 초기화하지 않은 채로두면 garbage을 가리킬 수 있습니다. 이것은 무의미한 값이 반환되는 이유를 설명합니다.

+1

개념적 오류는 좋은 설명입니다. – john

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; 
} 
관련 문제