程序有点乱,大家给点意见.
题目:
分数是两个整数的比,通常表示为 (或b/a)的形式,其中b称为分子,a称为分母,分母不能为0。分数在计算机中以整数或浮点数(有限小数)的形式表示,大多数情况下都是近似表示,具有较大的误差,例如 ,在计算机中用整数表示为0,用浮点数表示为0.333333。本实例就是要设计一个Fraction (分数) 类类型,该类型的对象可以像基本类型数据一样进行运算,结果仍为分数,运算包括四则运算,关系运算,及求一元一次分式方程的解,输入输出要求按分数方式进行。
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
//非类中函数,用于求最大公约数
int rgcd(int v1,int v2);
class Fractoin
{
public:
Fractoin(int s):size(s){} //构造函数
~Fractoin(){} //析构函数
friend Fractoin operator +(Fractoin & a1,Fractoin & a2); //重载加号
friend Fractoin operator -(Fractoin & b1,Fractoin & b2); //重载减号
friend Fractoin operator *(Fractoin & c1,Fractoin & c2); //重载乘号
friend void operator /(Fractoin & d1,Fractoin & d2); //重载除号
int display(){return size;}
//用于计算特殊的(b/a + - * / d/c)
static void frac1(Fractoin &a,Fractoin &b,Fractoin &c,Fractoin &d); //加法函数(b/a + d/c)
static void frac2(Fractoin &a,Fractoin &b,Fractoin &c,Fractoin &d); //减法函数(b/a - d/c)
static void frac3(Fractoin &a,Fractoin &b,Fractoin &c,Fractoin &d); //乘法函数(b/a * d/c)
//这里不用再定义除法函数,直接使用乘法函数就可以了(b/a ÷ d/c)
//实现这个函数的关系运算
static void compare(Fractoin &a,Fractoin &b,Fractoin &c,Fractoin &d);
//用于计算一元一次方程(a*x+b=c)
static void equation(Fractoin &a1,Fractoin &a2,Fractoin &b1,Fractoin &b2,Fractoin &c1,Fractoin &c2);
//分离分数的函数
static void separate(string s,int &q1,int &q2);
private:
int size;
};
//用于求最大公约数
int rgcd(int v1,int v2)
{
if(v2!=0)
return rgcd(v2,v1%v2);
return v1;
}
//重载除号
void operator /(Fractoin & d1,Fractoin & d2)
{
int temp=rgcd(d1.size,d2.size);
d1.size/=temp;
d2.size/=temp;
}
//重载加号
Fractoin operator +(Fractoin & a1,Fractoin & a2)
{
return Fractoin(a1.size*a2.size);
}
//重载减号
Fractoin operator -(Fractoin & b1,Fractoin & b2)
{
return Fractoin(b1.size-b2.size);
}
//重载乘号
Fractoin operator *(Fractoin & c1,Fractoin & c2)
{
return Fractoin(c1.size*c2.size);
}
//加法函数(b/a + d/c)
void Fractoin::frac1(Fractoin &a,Fractoin &b,Fractoin &c,Fractoin &d)
{
a/b,c/d;
Fractoin temp1(0);
temp1.size=a.size*d.size+b.size*c.size;
Fractoin temp2(0);
temp2.size=b.size*d.size;
temp1/temp2;
cout < <temp1.size < < '/ ' < <temp2.size < <endl;
}
//减法函数(b/a - d/c)
void Fractoin::frac2(Fractoin &a,Fractoin &b,Fractoin &c,Fractoin &d)
{
a/b,c/d;
Fractoin temp1(0);
temp1.size=a.size*d.size-b.size*c.size;
Fractoin temp2(0);
temp2.size=b.size*d.size;
if(temp1.size> 0)
{
temp1/temp2;
cout < <temp1.size < < '/ ' < <temp2.size < <endl;
}
else
if(temp1.size <0)
{
temp1.size=-temp1.size;
temp1/temp2;
cout < < '- ' < <temp1.size < < '/ ' < <temp2.size < <endl;
}
else
cout < < "0 " < <endl;
}
//乘法函数(b/a * d/c)
void Fractoin::frac3(Fractoin &a,Fractoin &b,Fractoin &c,Fractoin &d)
{
a/b,c/d;
Fractoin temp1(0);
temp1.size=a.size*c.size;
Fractoin temp2(0);
temp2.size=b.size*d.size;
temp1/temp2;
cout < <temp1.size < < '/ ' < <temp2.size < <endl;
}
//用于计算一元一次方程(a*x+b=c)
void Fractoin::equation(Fractoin &a1,Fractoin &a2,Fractoin &b1,Fractoin &b2,Fractoin &c1,Fractoin &c2)
{
Fractoin temp1(0);
temp1.size=(c1.size*b2.size-b1.size*c2.size)*a2.size;
Fractoin temp2(0);
temp2.size=c2.size*b2.size*a1.size;
if(temp1.size> 0)
{
temp1/temp2;
cout < <temp1.size < < '/ ' < <temp2.size < <endl;
}
else
if(temp1.size <0)
{
temp1.size=0-temp1.size;
temp1/temp2;
cout < < '- ' < <temp1.size < < '/ ' < <temp2.size < <endl;
}
else
cout < < "0 " < <endl;
}
//实现这个函数的关系运算
void Fractoin::compare(Fractoin &a,Fractoin &b,Fractoin &c,Fractoin &d)
{
if((a.size*d.size-b.size*c.size)> 0)
cout < <a.display() < < '/ ' < <b.display() < < "大于 " < <c.display() < < '/ ' < <d.display() < <endl;
else
if((a.size*d.size-b.size*c.size) <0)
cout < <a.display() < < '/ ' < <b.display() < < "小于 " < <c.display() < < '/ ' < <d.display() < <endl;
else
if((a.size*d.size-b.size*c.size)==0)
cout < <a.display() < < '/ ' < <b.display() < < "等于 " < <c.display() < < '/ ' < <d.display() < <endl;
}
//分离分数的函数
void Fractoin::separate(string s,int &q1,int &q2)
{
q1=0,q2=0;
int ix=0;
if(s[0]== '/ ')
{
cout < < "分子不能为空 " < <endl;
abort();
}
for(;s[ix]!= '/ ';++ix)
{
if(q1==0)
q1=s[ix]-48;
else
q1=q1*10+s[ix]-48;
}
for(;ix!=s.size();++ix)
{
if(q2==0)
{
++ix;
if(s[ix]==NULL)
{
cout < < "分母不能为空 " < <endl;
abort();
}
q2=s[ix]-48;
}
else
q2=q2*10+s[ix]-48;
}
}
int main()
{
string s1,s2,s3;
int n1,n2,n3,n4,n5,n6;
cout < < "请输入三个大于零的分数(以空格隔开): " < <endl;
cin> > s1> > s2> > s3;
Fractoin::separate(s1,n1,n2);
Fractoin::separate(s2,n3,n4);
Fractoin::separate(s3,n5,n6);
if(n1 <0||n2 <0||n3 <0||n4 <0||n5 <0||n6 <0)
{
cout < < "必须输入大于零的分数 " < <endl;
return -1;
}
if(n2==0||n4==0||n6==0)
{
cout < < "分母不能为零 " < <endl;
return -1;
}
Fractoin obj1(n1),obj2(n2),obj3(n3),obj4(n4),obj5(n5),obj6(n6);
cout < < "输出两个分数的加: " < <endl < <obj1.display() < < '/ ' < <obj2.display() < < "+ " < <obj3.display() < < '/ ' < <obj4.display() < < '= ';
Fractoin::frac1(obj1,obj2,obj3,obj4);
cout < <endl;
cout < < "输出两个分数的减: " < <endl < <obj1.display() < < '/ ' < <obj2.display() < < "- " < <obj3.display() < < '/ ' < <obj4.display() < < '= ';
Fractoin::frac2(obj1,obj2,obj3,obj4);
cout < <endl;
cout < < "输出两个分数的乘: " < <endl < <obj1.display() < < '/ ' < <obj2.display() < < "× " < <obj3.display() < < '/ ' < <obj4.display() < < '= ';
Fractoin::frac3(obj1,obj2,obj3,obj4);
cout < <endl;
cout < < "输出两个分数的除: " < <endl < <obj1.display() < < '/ ' < <obj2.display() < < "÷ " < <obj3.display() < < '/ ' < <obj4.display() < < '= ';
Fractoin::frac3(obj1,obj2,obj4,obj3);
cout < <endl;
cout < < "输出方程 " < <obj1.display() < < '/ ' < <obj2.display() < < "X " < < " + " < <obj3.display() < < '/ ' < <obj4.display() < < '= ' < <obj5.display() < < '/ ' < <obj6.display() < < "的解: " < <endl;
Fractoin::equation(obj1,obj2,obj3,obj4,obj5,obj6);
cout < <endl;
cout < < "比较 " < <obj1.display() < < '/ ' < <obj2.display() < < " 和 " < <obj3.display() < < '/ ' < <obj4.display() < < " 分数的大小: " < <endl;
Fractoin::compare(obj1,obj2,obj3,obj4);
cout < <endl;
return 0;
}
[解决办法]
做得很好
[解决办法]
不必修改成员函数的,建议加上const,参数传递使用const引用
例如:
Fractoin operator +(Fractoin & a1,Fractoin & a2)
{
return Fractoin(a1.size*a2.size);
}
---
Fractoin operator +(const Fractoin & a1, const Fractoin & a2) const
{
return Fractoin(a1.size*a2.size);
}