класс — Как полностью сократить / упростить дроби (C ++)

Я не могу ради своей жизни понять Зачем Я получаю бесконечные значения, возвращаемые при вводе нормальной доли в коде. Все, кроме 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;
}

0

Решение

Вот что я могу определить, просто пройдясь по вашему коду.

Начиная с main, вы создаете экземпляр типа Fraction названный set, Вы назначаете его числитель и знаменатель через звонки set.setNum() а также set.setDen(), Призывы к getNum() а также getDen() ничего не делать в этом случае, так как они ни к чему не привязаны.

Тогда вы звоните lcdOutput()Итак, давайте начнем шагать через это.
Вы начинаете с создания экземпляра ЛОКАЛЬНОГО экземпляра Fraction (не уверен, почему вы хотите это сделать, мне кажется, что это может быть концептуальной ошибкой), а затем вызываете set.gcd() для этого локального экземпляра. призвание set.gcd() вызовет метод для этого момента, и мне кажется, что вы действительно хотите, this->gcd() или просто gcd(),

Вы следите, устанавливая num = num / temp а также den = den / temp, но temp на данный момент не инициализирован. Если переменная неинициализирована, она может (и обычно имеет) указывать на garbage, Это, вероятно, объясняет, почему вы получаете бессмысленные возвращаемые значения.

6

Другие решения

Я вернулся и понял это самостоятельно. Я видел некоторые комментарии и заметил мои очень большие концептуальные и логические ошибки. Вот для тех, у кого такой же вопрос!

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

По вопросам рекламы [email protected]