【问题标题】:How to implement greatest common divisor to simplify fractions如何实现最大公约数以简化分数
【发布时间】:2014-11-29 20:29:20
【问题描述】:
#include <iostream>
using namespace std;

int g_c_d(int n, int d);

class Fraction
{

private:
  //variables to store numerator and denominator
  int num;
  int denom;

public:
  Fraction(){}
  Fraction(int num): num(num) {}
  Fraction(int num, int denom): num(num), denom(denom) {}

  void set_num(int n){ num = n;}
  void set_denom(int d){ denom = d;}

  int get_numerator() const {return num;}
  int get_denominator() const {return denom;}
};

  int g_c_d(int n, int d){
    return d == 0? n : g_c_d(d, n % d);
 }

istream &operator>> (istream &input, Fraction &f)
{
  int n, d;
  char slash;
  input >> n;
  input >> slash;
  input >> d;

  if (d == 0) {n = 0;} //if denom is 0; fraction = 0/0
  f = Fraction(n, d);
  return input;
}

ostream &operator<<(ostream &output, const Fraction &frac)
{
  return output << frac.get_numerator() << "/" << frac.get_denominator();
}


int main()
{
   int n, d;
   Fraction frac;

   int gcd;
   n = frac.get_numerator();
   d = frac.get_denominator();
   gcd = g_c_d(frac.get_numerator() , frac.get_denominator());

   cout << "Enter a fraction" << endl;
   cin >> frac;
   frac.set_num(n/gcd);
   frac.set_denom(d/gcd);
   cout << "your fraction is: ";
   cout << frac << endl;

   return 0;
}

您好,我正在尝试简化用户输入的分数。但是,每次我输入要简化的分数时,返回的输出都是“1/0”。

有人可以帮忙吗,将不胜感激!

【问题讨论】:

  • 你用过调试器吗?调试器在这些情况下非常有用。
  • 您是否尝试在 StackOverflow 上搜索类似问题,例如使用“C++ 分数类”
  • 你需要在默认构造函数中初始化你的分子和分母。

标签: c++ fractions simplify greatest-common-divisor


【解决方案1】:

问题是您在frac 上进行所有计算要求用户输入分数之前 - 然后覆盖用户输入的任何内容。你需要移动这个位:

   cout << "Enter a fraction" << endl;
   cin >> frac;

更高,更高。

【讨论】:

    【解决方案2】:

    当您设置代码时:

    Fraction frac;
    

    这会调用Fraction 的默认构造函数。因为您从未在构造函数中初始化成员,所以您获得了 int 类型的默认初始化,即 0。然后:

    n = frac.get_numerator();
    d = frac.get_denominator();
    

    这使得nd 为0。从那时起,您将使用nd 的值。然而,这些值不是来自 用户输入 frac 的值,而只是您从默认值中获得的值。在进行任何计算之前,更改您的代码以读取用户输入的 frac 值。

    这里要学习的主要课程是确保不要使用未初始化的变量。一般来说,当您在启用所有警告的情况下进行编译时,编译器会发出警告。

    【讨论】:

      【解决方案3】:

      由于默认构造函数没有为分母赋值,因此您可能会被 0 取代。在分母设置为零的情况下,gcd() 函数将在main 中的第一次除以零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        相关资源
        最近更新 更多