谁能帮我用C++编一道程序?

2024-12-31 18:13:37
推荐回答(2个)
回答1:

//程序我编出来了,你看看

#include "stdafx.h"
#include
using std::cout;
using std::cin;
using std::endl;

/*
有理数是两个整数的比率。a为分子,b为分母,通常表示为a/b。分母不能为0
设计一个有理数类rational.使其要象使用基本类型定义的对象那么自然。
1. 为rational类设计两个数据成员,一个作为分子,一个作为分母,如有理数1/2,
可以使用这个类的对象r表示为 (1,2)。
2. 如果分子分母有公约数,就应进行化简,也就是约分,如4/6应表示为2/3。
3. 有理数可以进行四则运算
4. 有理数可以比较大小。
5. 实现直接输入分子和分母,以及作为整体输出,如想使用下式:
cin>>r
1/6
cout<1/6

*/

class rational
{
public:

int a,b;
rational()
{
a =0;
b = 1;
}

rational(int m,int n)
{
a = m;
b = n;
Huajian();
}

void Huajian() //化简
{
bool flag ;
do
{
flag = yuefen();
}while(flag);
}

bool yuefen() //约分
{
int i;
for(i=2;i<=b;i++)
{
if(a%i==0 && b%i ==0)
{
a/=i;
b/=i;

return true;
}
}
return false;
}

void tongfen(rational &r)
{
int i,zuixiaogongbeishu,k;
for(i = 1;i<=r.b;i++) //找到最小公倍数
{
if(b*i%r.b ==0)
{
zuixiaogongbeishu = b*i;
k= zuixiaogongbeishu/r.b;
break;
}
}

b*=i;
a*=i;
r.a*=k;
r.b*=k;
}

rational operator =(rational r)
{
rational temp;
temp.a = r.a;
temp.b= r.b;
return temp;
}

rational operator +(rational r)
{
rational temp;
tongfen(r);
temp.a = a +r.a;
temp.b = b;
temp.Huajian();
return temp;
}
rational operator -(rational r)
{
rational temp;
tongfen(r);
temp.a = a -r.a;
temp.b = b;
temp.Huajian();
return temp;
}
rational operator *(rational r)
{
rational temp;
temp.a = a *r.a;
temp.b = b *r.b;
if(temp.b ==0)
{
cout<<"分母不能为0 ";
temp.a =0;
temp.b =1;
}
temp.Huajian();
return temp;
}
rational operator /(rational r)
{
rational temp;
temp.a = a *r.b;
temp.b = b *r.a;
if(temp.b ==0)
{
cout<<"分母不能为0 ";
temp.a =0;
temp.b =1;
}
temp.Huajian();
return temp;
}
bool operator >(rational r)
{
tongfen(r);
if(a>r.a)
{
return true;
}
else
{
return false;
}
}
bool operator <(rational r)
{
tongfen(r);
if(a {
return true;
}
else
{
return false;
}
}
bool operator ==(rational r)
{
tongfen(r);
if(a==r.a)
{
return true;
}
else
{
return false;
}
}
//重载<<
friend std::ostream & operator << (std::ostream & os,const rational & r)
{
if(r.b ==1)
{
os< }
else
{
os< }
return os;
}
//重载>>
friend std::istream & operator >> (std::istream & is,rational & r)
{
char temp[30],ca[15],cb[15];
memset(temp,0,sizeof(temp));
memset(ca,0,sizeof(ca));
memset(cb,0,sizeof(cb));

is.get(temp,30); //将输入复制到数组中
int i,j=0,s;

for(i=0;i<30;i++)
{
if(temp[i] ==0)
break;
if(temp[i]=='/')
{
s =i;
break;
}
if(temp[i]!=' ')
{
ca[j] = temp[i];
j++;
}
}

j=0;
for(i=s+1;i<30;i++)
{
if(temp[i] ==0)
break;
if(temp[i]!=' ')
{
cb[j] = temp[i];
j++;
}
}

int ta,tb;

ta= atoi(ca);
tb= atoi(cb);
if(tb!=0)
{
r.a =ta;
r.b =tb;
r.Huajian();
}else
{
cout<<"分母不能为0 \n";
}

while (is&&is.get()!='\n')
continue;

return is;

}
};

int main(int argc, char* argv[])
{
rational r1,r2;
cout<<"input r1:";
cin>>r1;
cout<<"input r2:";
cin>>r2;

cout<<"r1="< cout<<"r2="<
cout<<"r1+r2="< cout<<"r1-r2="< cout<<"r1*r2="< cout<<"r1/r2="<
if(r1>r2){
cout<<"r1>r2"<
}else if(r1 == r2){
cout<<"r1==r2"< }else if(r1 cout<<"r1 }

return 0;
}

回答2:

这个就是运算符重载,看下那部分知识就知道了,别人编的话比较烦,大量重复的工作,还是自己写吧