1.设计一个类,用自己的成员函数重载运算符,使对整型的运算符=、+、-、*、/ 适用于分数运算。要求:
(1)输出结果是最简分数(可以是带分数);
(2)分母为1,只输出分子。
参考的输入输出:
Inputx: 1/6
Inputy: 2/9
x+y=7/18
x-y=-1/18
x*y=1/27
x/y=3/4
###输入格式:
提示“Input x: ”,输入第一个分数。如:1/6
提示“Input y: ”,输入第二个分数。如:2/9
###输出格式:
提示并输出+、-、*、/的结果,如
x+y=7/18
x-y=-1/18
x*y=1/27
x/y=3/4
###输入样例(其中的一种情况):
Inputx: 1/6
Inputy: 2/9
###输出样例(对应的输出):
x+y=7/18
x-y=-1/18
x*y=1/27
x/y=3
#include <iostream> using namespace std; class caculator{ public: caculator (int n=0, int d=0):num(n),den(d){} caculator operator+(caculator &c2); caculator operator-(caculator &c2); caculator operator*(caculator &c2); caculator operator/(caculator &c2); int gys(int a,int b); void display()const{ if(den==1) cout<<num<<endl; else cout<<num<<"/"<<den<<endl; } private: int num,den; //分子分母 }; int caculator::gys(int a,int b){ int c; while(b!=0){ c=a%b; a=b; b=c; } return a>0?a:-a; } caculator caculator::operator+(caculator &c2){ int d3,num3,g; d3=den*c2.den; num3=num*c2.den + c2.num*den; g=gys(d3,num3); d3=d3/g; num3=num3/g; return caculator(num3,d3); } caculator caculator::operator-(caculator &c2){ int d3,num3,g; d3=den*c2.den; num3=num*c2.den - c2.num*den; g=gys(d3,num3); d3=d3/g; num3=num3/g; return caculator(num3,d3); } caculator caculator::operator*(caculator &c2){ int d3,num3,g; d3=den*c2.den; num3=num * c2.num; g=gys(d3,num3); d3=d3/g; num3=num3/g; return caculator(num3,d3); } caculator caculator::operator/(caculator &c2){ int d3,num3,g; d3=den*c2.num; num3=num*c2.den; g=gys(d3,num3); d3=d3/g; num3=num3/g; return caculator(num3,d3); } int main() { int d1,n1,d2,n2; char c; cout<<"Input x: "; cin>>d1>>c>>n1; cout<<"Input y: "; cin>>d2>>c>>n2; caculator c1(d1,n1),c2(d2,n2),c3; c3=c1+c2; cout<<"x+y="; c3.display(); c3=c1-c2; cout<<"x-y="; c3.display(); c3=c1*c2; cout<<"x*y="; c3.display(); c3=c1/c2; cout<<"x/y="; c3.display(); return 0; }
2、设计一个类,重载运算符为友元函数,使对整型的运算符=、+、-、*、/ 适用于分数运算。要求:
(1)输出结果是最简分数(可以是带分数);
(2)分母为1,只输出分子。
参考的输入输出:
Inputx: 1/6
Inputy: 2/9
x+y=7/18
x-y=-1/18
x*y=1/27
x/y=3/4
###输入格式:
提示“Input x: ”,输入第一个分数。如:1/6
提示“Input y: ”,输入第二个分数。如:2/9
###输出格式:
提示并输出+、-、*、/的结果,如
x+y=7/18
x-y=-1/18
x*y=1/27
x/y=3/4
###输入样例(其中的一种情况):
Inputx: 1/6
Inputy: 2/9
###输出样例(对应的输出):
x+y=7/18
x-y=-1/18
x*y=1/27
x/y=3/4
#include <iostream> #include <cmath> using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分母 public: CFraction(int nu=0,int de=1):nume(nu),deno(de) {} void simplify(); //输入输出的重载 friend istream &operator>>(istream &in,CFraction &x); friend ostream &operator<<(ostream &out,CFraction x); friend CFraction operator+(const CFraction &c1,const CFraction &c2); //两个分数相加,结果要化简 friend CFraction operator-(const CFraction &c1,const CFraction &c2); //两个分数相减,结果要化简 friend CFraction operator*(const CFraction &c1,const CFraction &c2); //两个分数相乘,结果要化简 friend CFraction operator/(const CFraction &c1,const CFraction &c2); //两个分数相除,结果要化简 }; // 分数化简 void CFraction::simplify() { int m,n,r; n=fabs(deno); m=fabs(nume); while(r=m%n) // 求m,n的最大公约数 { m=n; n=r; } deno/=n; // 化简 nume/=n; if (deno<0) // 将分母转化为正数 { deno=-deno; nume=-nume; } } // 重载输入运算符>> istream &operator>>(istream &in,CFraction &x) { char ch; while(1) { cin>>x.nume>>ch>>x.deno; if (x.deno==0) cerr<<"分母为0, 请重新输入"<<endl; else if(ch!='/') cerr<<"格式错误(形如m/n)! 请重新输入"<<endl; else break; } return cin; } // 重载输出运算符<< ostream &operator<<(ostream &out,CFraction x) { if(x.deno==1) cout<<x.nume; else cout<<x.nume<<'/'<<x.deno; return cout; } // 分数相加 CFraction operator+(const CFraction &c1,const CFraction &c2) { CFraction t; t.nume=c1.nume*c2.deno+c2.nume*c1.deno; t.deno=c1.deno*c2.deno; t.simplify(); return t; } // 分数相减 CFraction operator-(const CFraction &c1,const CFraction &c2) { CFraction t; t.nume=c1.nume*c2.deno-c2.nume*c1.deno; t.deno=c1.deno*c2.deno; t.simplify(); return t; } // 分数相乘 CFraction operator*(const CFraction &c1,const CFraction &c2) { CFraction t; t.nume=c1.nume*c2.nume; t.deno=c1.deno*c2.deno; t.simplify(); return t; } // 分数相除 CFraction operator/(const CFraction &c1,const CFraction &c2) { CFraction t; if (!c2.nume) return t; //除法无效(除数为)时,这种情况需要考虑,但这种处理仍不算合理 t.nume=c1.nume*c2.deno; t.deno=c1.deno*c2.nume; t.simplify(); return t; } int main() { CFraction x,y,s; cout<<"Input x: "; cin>>x; cout<<"Input y: "; cin>>y; s=x+y; cout<<"x+y="<<s<<endl; s=x-y; cout<<"x-y="<<s<<endl; s=x*y; cout<<"x*y="<<s<<endl; s=x/y; cout<<"x/y="<<s<<endl; return 0; }