C++ 堆芯倾倒?I';don';我不知道怎么了

C++ 堆芯倾倒?I';don';我不知道怎么了,c++,C++,在我添加分数缩减函数gcd后,我一直得到一个内核转储。它将工作良好,直到它输出我的主文件中的减法部分,然后它只给我一个核心转储。对于像2000/3000这样的数字,它会很好地工作,它会像它应该的那样减少到2/3,但是当我把10/20放进一个分数时,它会像它应该的那样减少到1/2,直到它输出减法部分,就像我之前说的,它只会给我一个核心转储。怎么了 //Rational.h file #include <iostream> using namespace std; c

在我添加分数缩减函数gcd后,我一直得到一个内核转储。它将工作良好,直到它输出我的主文件中的减法部分,然后它只给我一个核心转储。对于像2000/3000这样的数字,它会很好地工作,它会像它应该的那样减少到2/3,但是当我把10/20放进一个分数时,它会像它应该的那样减少到1/2,直到它输出减法部分,就像我之前说的,它只会给我一个核心转储。怎么了

//Rational.h file
   #include <iostream>
   using namespace std;

   class Rational
{
  public:
    // constructors

    Rational();

    Rational(int num, int den);

    // accessors

    int get_numer()const;

    int get_denom()const;

    // mutators

    void set_numer(int n);

    void set_denom(int d);

    // friend functions

    friend Rational operator +(const Rational& r1, const Rational& r2);

    friend Rational operator -(const Rational& r1, const Rational& r2);

    friend Rational operator *(const Rational& r1, const Rational& r2);

    friend Rational operator /(const Rational& r1, const Rational& r2);

    friend bool operator == (const Rational& r1, const Rational& r2);

    friend ostream& operator <<(ostream& file_out, const  Rational& r);

    friend istream& operator >>(istream& file_in, Rational& r);

private:
   int numerator;
   int denominator;
   void normalize();
   void gcd();
};

// nonmember functions

bool operator <(const Rational& r1, const Rational& r2);

bool operator !=(const Rational& r1, const Rational& r2);

//Rational.cc file
#include <iostream>
#include <cstdlib>
#include "Rational.h"
using namespace std;

Rational::Rational()
{
  numerator = 0;
  denominator = 1;
}

Rational::Rational(int num, int den)
{
  numerator = num;
  denominator = den;

if(den == 0)
{
  cout << "Error denominator is 0\n";
  exit(1);
}

  gcd();
  normalize();
}

void Rational::set_numer(int n)
{
  numerator = n;
  gcd();
  normalize();
}

void Rational::set_denom(int d)
{
  denominator = d;

  if(denominator == 0)
  {
    cout << "Error denominator is 0\n";
    exit(1);
  }

  gcd();
  normalize();
  }

int Rational::get_numer() const
{
  return(numerator);
}

int Rational::get_denom() const
{
  return(denominator);
}

void Rational::normalize()
{
   if(denominator < 0)
   {
     numerator *= -1;
     denominator = abs(denominator);
   }
   else if(numerator < 0 && denominator < 0)
   {
     numerator = abs(numerator);
     denominator = abs(denominator);
   }
 }

void Rational::gcd()
{
  int big;
  int small;
  int remainder;
  int great;

  if(numerator > denominator)
  {
    big = numerator;
    small = denominator;
  }else{
    big = denominator;
    small = numerator;
  }

  do{
    remainder = big % small;

  if(remainder == 0)
    great = small;
  else
  {
    big = small;
    small = remainder;
  }
}while(remainder != 0);

  numerator /= great;
  denominator /= great;
}

Rational operator +(const Rational& r1, const Rational& r2)
{
  Rational temp;

  temp.numerator = r1.numerator * r2.denominator + r1.denominator * r2.numerator;
  temp.denominator = r1.denominator * r2.denominator;

  temp.gcd();
  temp.normalize();

  return(temp);
}

Rational operator -(const Rational& r1, const Rational& r2)
{
  Rational temp;

  temp.numerator = r1.numerator * r2.denominator - r1.denominator * r2.numerator;
  temp.denominator =  r1.denominator * r2.denominator;

  temp.gcd();
  temp.normalize();

  return(temp);
}

Rational operator *(const Rational& r1, const Rational& r2)
{
  Rational temp;

  temp.numerator = r1.numerator * r2.numerator;
  temp.denominator =  r1.denominator * r2.denominator;

  temp.gcd();
  temp.normalize();

  return(temp);
}

Rational operator /(const Rational& r1, const Rational& r2)
{
  Rational temp;

  temp.numerator = r1.numerator * r2.denominator;
  temp.denominator = r1.denominator * r2.numerator;

  temp.gcd();
  temp.normalize();

  return(temp);
}

bool operator == (const Rational& r1, const Rational& r2)
{
  return((r1.numerator * r2.denominator) == (r1.denominator * r2.numerator));
}

ostream& operator <<(ostream& file_out, const  Rational& r)
{
  file_out << r.numerator << '/' << r.denominator;

  return(file_out);
}

istream& operator >>(istream& file_in, Rational& r)
{
  char ch;

  file_in >> r.numerator >> ch >> r.denominator;

  if(r.denominator == 0)
  {
    cout << "Error denominator is 0\n";
    exit(1);
  }

  r.gcd();
  r.normalize();

  return(file_in);
}

bool operator <(const Rational& r1, const Rational& r2)
{
  return((r1.get_numer() * r2.get_denom()) < (r1.get_denom() * r2.get_numer()));
}

bool operator !=(const Rational& r1, const Rational& r2)
{
  return((r1.get_numer() * r2.get_denom()) != (r1.get_denom() * r2.get_numer()));
}
//Rational.h文件
#包括
使用名称空间std;
类理性
{
公众:
//建设者
有理();
Rational(intnum,intden);
//访问者
int get_numer()常量;
int get_denom()常量;
//突变子
无效集合编号(整数n);
空集\u表示(int d);
//好友功能
friend Rational运算符+(常量Rational和r1,常量Rational和r2);
友元有理运算符-(常量有理&r1,常量有理&r2);
友元有理算子*(常数有理&r1,常数有理&r2);
友元有理算子/(常数有理&r1,常数有理&r2);
friend bool运算符==(常数有理&r1,常数有理&r2);
friend ostream&operator(istream&file_in,Rational&r);
私人:
整数分子;
整数分母;
void normalize();
无效gcd();
};
//非成员函数
布尔运算符>r.分母;
如果(r.分母==0)
{

在我看来,cout在
gcd()
余数=big%small;
中看起来像是一个除以零的风险


您肯定知道是否使用调试器从核心转储获取回溯信息。

请缩进。谢谢。您是否使用调试器来标识程序崩溃的位置?抱歉,我将添加标头,我认为不需要它,是的,我使用了调试器,我将再次检查它的内容。更具体地说,当除以r2时,它是still zero.yes它表示:程序接收到信号SIGFPE,算术异常。Rational::gcd中的0x00010bf8(此=0xffbffa08)在Rational.cc:97 97 rements=big%small;但我不明白该如何解决这个问题?有什么提示或建议吗?@user2513288,如果
small
为零,那么数字必须为零。最简单的方法是将其设置为0/1并退出循环。不管我得到了什么,谢谢。是的,对不起,我太傻了.
//main.cc file
#include <iostream>
#include "Rational.h"
using namespace std;

int main()
{
  Rational r1(1,2), r2, r3;

// test the constructors
  cout << "Testing the constructors  \n\n";
  cout << "Testing the constructor with 2 arguments " << r1 << endl << endl;

// test the overloaded >> operator
  cout << "Testing the overloaded >> operator \n";
  cout << "Enter a rational number in the form 3/4  ";
  cin >> r2;

  cout << r1 << " + " << r2 << " = " << (r1 + r2) << endl;

  // test the set functions
  r3.set_numer(23);
  r3.set_denom(-13);

  cout <<"\nTesting the set functions "<< r3 << endl << endl;

// Testing the overloaded << operator and the +
  cout << r1 << " + " << r2 << " = " << r1 + r2;
  cout << endl << endl;

//testing the overloaded - operator

  r3 = r1 - r2;

  cout << r1 << " - " << r2 << " = " << r3;
  cout << endl << endl;

//testing the * and / function

  r3 = r1 * r2;

  cout << r1 << " * " << r2 << " = " << r3;
  cout << endl << endl;

  r3 = r1 / r2;

  cout << r1 << " / " << r2 << " = " << r3;
  cout << endl << endl;

//testing the < and == function

  if(r1 < r2)
    cout << r2 << " is bigger than " << r1 << endl;
  else if(r2 < r1)
    cout << r1 << " is bigger than " << r2 << endl;
  else if(r1 == r2)
    cout << r1 << " and " << r2 << " are equal pairs\n";

//testing the != function

  if(r1 != r2)
    cout << r1 << " and " << r2 << " are not equal pairs\n";

  return 0;
}