C#课程设计----有理数运算

有理数运算
问题描述
有理数是一个可以化为一个分数的数,例如2/3,533/920,-12/49都是有理数,而 就是无理数。定义一个有理数类,将有理数的分子和分母分别存放在两个整型变量中。对有理数的各种操作都可以用重载运算符来实现。
基本要求
定义并实现一个有理数类,通过重载运算符+、-、*、/对有理数进行算术运算,通过重载运算符==实现判定两个有理数是否相等。写一个优化方法,它的作用是使保存的有理数分子和分母之间没有公约数(除去1以外)。
此外,还要定义一个将有理数转换为实数的方法,再加上构造函数和有理数输出方法。
测试数据
在应用程序中,创建若干有理数对象,通过带参数的构造函数使得各有理数对象值各不相同,然后分别进行各类运算,输出运算结果,检验其正确性。
实现提示
设有两个有理数a/b和c/d,则有:
1) 有理数相加 分子=a*d+b*c;分母=b*d
2) 有理数相减 分子=a*d-b*c;分母=b*d
3) 有理数相乘 分子=a*c; 分母=b*d
4) 有理数相除 分子=a*d; 分母=b*c
优化方法在创建有理数对象时应执行,在执行其它各种运算之后也需执行它,这样可保证所存储的有理数随时都是最优的。对于判断两个有理数是否相等,由于在对有理数进行各种运算后都对其进行优化,所以判定两个有理数是否相等只需判定它们两个的分子和分母分别相等即可。
定义输入输出方法,使得对有理数可以直接输入输出。设有理数输入格式为:
整数1 整数2 //整数1为分子,整数2为分母
有理数输出格式为:
分子/分母

#include<iostream.h>
class num
{
public:
num(int z=0,int m=0){numerator=z;
denominator=m;}
void yuefen(int x,int y);//定义约分函数
num operator + (num n2);//运算符+重载成员函数
num operator - (num n2);//运算符-重载成员函数
num operator * (num n2);//运算符*重载成员函数
num operator / (num n2);//运算符/重载成员函数
bool operator == (num n2);//运算符==重载成员函数
double
realnum(){R=(double)numerator/denominator;
return R;
cout<<R;}//定义函数将其转化
void show();//定义函数将其输出
private:
int numerator,denominator;
double R;
};
void num::yuefen(int x,int y)
//分数化简函数
{ int t;
int i;

if(x>y)
t=y;
else
t=x;
for(i=t;i>=1 ;i--)
if((x%i==0)&&(y%i==0))
{
t=i;
break;
}
if(t)
{
numerator=x/t;
denominator=y/t;
}
else
{
numerator=x;
denominator=y;
}

if(numerator==0)
cout<<"0"<<endl;
else
cout<<numerator<<"/"<<denominator<<endl;
}
//////////////////////////////// 重载运算符函数的实现
///////////////////////////////////
num num::operator+(num n2)
{
return
num(numerator*n2.denominator+denominator*n2.numerator,denominator*n2.denominator);
}
num num::operator-(num n2)
{
return
num(numerator*n2.denominator-denominator*n2.numerator,denominator*n2.denominator);
}
num num ::operator*(num n2)
{
return num(numerator*n2.numerator,denominator*n2.denominator);
}
num num ::operator/(num n2)
{
return
num(numerator*n2.denominator,denominator*n2.numerator);
}
bool num::operator == (num n2)
{
if((numerator=n2.numerator)&&(denominator=n2.denominator))
return true;
else
return false;
}
void num::show()//显示输出函数
{
if(numerator==0)
cout<<"0"<<endl;
else if(denominator==0)
cout<<"您的输入有误!"<<endl;
else
cout<<numerator<<"/"<<denominator<<endl;
}
/////////////////////////////////////////// 主函数
////////////////////////////////////
int main()
{
char m;
cout<<"/////////////////////////// 有理数运算程序
//////////////////////////////"<<endl;
cout<<"确定进入系统?(Y/N)"<<endl;//提示是否进入有理数运算系统
cin>>m;
if(m=='n'||m=='N')
cout<<"不进入系统!"<<endl;
else if(m=='y'||m=='Y')
{
char n;
cout<<"输入两个有理数:";
int a,b,c,d;
cin>>a>>b>>c>>d;
num n1(a,b),n2(c,d),n3;
cout<<"您所输入的有理数n1为:";
n1.show();
cout<<"化简后的n1为:";
n1.yuefen(a,b);
cout<<"转化为实数后的n1为:"<<n1.realnum()<<endl;
cout<<"您所输入的有理数n2为:";
n2.show();
cout<<"化简后的n2为:";
n2.yuefen(c,d);
cout<<"转化为实数后的n2为:"<<n2.realnum()<<endl;
cout<<"输入您所需要的运算符:";
cin>>n;
if(n=='+')
{
n3=n1+n2;
cout<<"您所需的操作为:n1+n2=";
n3.show();
cout<<"化简后的数为:";
n3.yuefen(a*d+b*c,b*d);
cout<<"转化为实数后为:"<<n3.realnum()<<endl;
}
else if(n=='-')
{
n3=n1-n2;
cout<<"您所需的操作为:n1-n2=";
n3.show();
cout<<"化简后的数为:";
n3.yuefen(a*d-b*c,b*d);
cout<<"转化为实数后为:"<<n3.realnum()<<endl;
}
else
if(n=='*')
{
n3=n1*n2;
cout<<"您所需的操作为:n1*n2=";
n3.show();
cout<<"化简后的数为:";
n3.yuefen(a*c,b*d);
cout<<"转化为实数后为:"<<n3.realnum()<<endl;
}
else if(n=='/')
{
n3=n1/n2;
cout<<"您所需的操作为:n1/n2=";
n3.show();
cout<<"化简后的数为:";
n3.yuefen(a*d,b*c);
cout<<"转化为实数后为:"<<n3.realnum()<<endl;
}
else
cout<<"您输入的运算符不正确!"<<endl;
cout<<"由==重载运算符知:";
if(a*d==b*c)
cout<<"n1=n2"<<endl;
else
cout<<"n1!=n2"<<endl;
}
else
cout<<"您的输入有误!"<<endl;

cout<<"运算结束,您继续吗?(Y/N)";//提示是否继续运算
char p;
cin>>p;
if(p=='n'||p=='N')
cout<<"退出运算系统!"<<endl;
else if(p=='y'||p=='Y')
return main();
else
cout<<"您的输入有误!"<<endl;
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-04
50RMB代做