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