首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

程序有点乱,大家给点意见.该如何解决

2012-02-12 
程序有点乱,大家给点意见.题目:分数是两个整数的比,通常表示为(或b/a)的形式,其中b称为分子,a称为分母,分

程序有点乱,大家给点意见.
题目:
      分数是两个整数的比,通常表示为   (或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);
}

热点排行
Bad Request.