要求:
(1)定义整数类和分数类。其中,包括构造函数、析构函数、显示函数等。
(2)输入 / 输出:对流提取和流插入运算符进行重载。
(3)计算功能:可进行分数的加、减、乘和除法运算。
(4)化简功能:将分数化简为最简分数。
(5)异常处理功能:分数中分母不能为零。
(6)菜单功能:每种功能的操作都是在菜单中进行相应选择。
程序:
#include<iostream>
#include<cmath>
using namespace std;
//整数
class Integer{
protected:
int num;
public:
Integer(){
}
Integer(int n){
num=n;
}
void display(){
cout<<num<<endl;
}
};
//分数
class fraction:public Integer{
private:
int nume,deno;//分子,分母
public:
fraction(){
nume=0;
deno=0;
}
fraction(int a,int b){
nume=a;
deno=b;
}
int outnume(){
return nume;
}
int outdeno(){
return deno;
}
void simple(fraction &f){
int p,q;
p=max(f.deno,f.nume);
q=min(f.deno,f.nume);
if(f.deno==f.nume){
f.deno=1;
f.nume=1;
}else if(f.nume==0){
f.deno=0;
f.nume=0;
}
else{
for(int i=0;;i++)
{
if(p%q==0)
{
f.deno=f.deno/q;
f.nume=f.nume/q;
break;
}
else
{
int t=p;
p=q;
q=t%q;
}
}
}
}
friend istream &operator >>(istream &, fraction &);
friend ostream &operator <<(ostream &, fraction &);
fraction operator +(fraction &f1);
fraction operator -(fraction &f1);
fraction operator *(fraction &f1);
fraction operator /(fraction &f1);
};
//-------------------------------------------------------------------
ostream &operator<<(ostream &output, fraction &f){
if(f.deno==1&&f.nume==1){
output<<1;
}else if(f.nume==0&&f.deno==0){
output<<0;
}else{
output<<f.nume<<"/"<<f.deno;
}
return output;
}
istream &operator>>(istream &input,fraction &f){
cout<<" 请输入分子分母:";
input>>f.nume>>f.deno;
if(f.deno<=0){
throw(f.deno);
}
return input;
}
//----------------------------------------------------------------
fraction fraction::operator +(fraction &f1){
fraction f;
int t1=deno/f1.deno,t2=f1.deno/deno;
if(deno==f1.deno){
f.deno=deno;
f.nume=nume+f1.nume;
}
else if(deno>f1.deno){
f1.deno=t1*f1.deno;
f1.nume=t1*f1.nume;
f.deno=deno;
f.nume=nume+f1.nume;
}
else if(deno<f1.deno){
deno=t2*deno;
nume=t2*nume;
f.deno=f1.deno;
f.nume=nume+f1.nume;
}
simple(f);
return f;
}
fraction fraction::operator -(fraction &f1){
fraction f;
int t1=deno/f1.deno,t2=f1.deno/deno;
if(deno==f1.deno){
f.deno=deno;
f.nume=nume-f1.nume;
}
else if(deno>f1.deno){
f1.deno=t1*f1.deno;
f1.nume=t1*f1.nume;
f.deno=deno;
f.nume=nume-f1.nume;
}
else if(deno<f1.deno){
deno=t2*deno;
nume=t2*nume;
f.deno=f1.deno;
f.nume=nume-f1.nume;
}
simple(f);
return f;
}
fraction fraction::operator *(fraction &f1){
fraction f;
f.deno=deno*f1.deno;
f.nume=nume*f1.nume;
simple(f);
return f;
}
fraction fraction::operator /(fraction &f1){
fraction f;
f.deno=deno*f1.nume;
f.nume=nume*f1.deno;
simple(f);
return f;
}
//------------------------------------------------
int main(){
fraction f1(0,0),f2(1,2),f3;
int item,x=f1.outdeno(),y=f1.outnume();
for(;;){
cout<<"--------------------"<<endl;
cout<<"请选择你需要的功能:"<<endl;
cout<<"--------------------"<<endl;
cout<<" (1)输入一个分数"<<endl;
cout<<" (2)输出一个分数"<<endl;
cout<<" (3)两个分数相加"<<endl;
cout<<" (4)两个分数相减"<<endl;
cout<<" (5)两个分数相乘"<<endl;
cout<<" (6)两个分数相除"<<endl;
cout<<" (0)结束程序"<<endl;
cout<<"--------------------"<<endl;
cout<<" 你的指令为:";
cin>>item;
if(item<8&&item>=0){
switch(item){
case(0):{
exit(1);
break;
}
case(1):{
try{
cin>>f1;
x=f1.outdeno();y=f1.outnume();
}catch(int){
cout<<"--------------------"<<endl;
cout<<" 数据错误,请重新输入"<<endl;
continue;
}
break;
}
case(2):{
if(x==0&&y==0){
cout<<"由于你尚未输入分数,所以输出初始分数"<<f2<<endl;
}else{
cout<<" 输入的分数为:"<<f1<<endl;
}
break;
}
case(3):{
f3=f1+f2;
cout<<" "<<f1<<"与"<<f2<<"相加的结果为:"<<f3<<endl;
break;
}
case(4):{
f3=f1-f2;
cout<<" "<<f1<<"与"<<f2<<"相减的结果为:"<<f3<<endl;
break;
}
case(5):{
f3=f1*f2;
cout<<" "<<f1<<"与"<<f2<<"相乘的结果为:"<<f3<<endl;
break;
}
case(6):{
f3=f1/f2;
cout<<" "<<f1<<"与"<<f2<<"相除的结果为:"<<f3<<endl;
break;
}
}
}else {
cout<<"--------------------"<<endl;
cout<<" 指令无效,请重新输入"<<endl;
cout<<"--------------------"<<endl;
continue;
};
}
return 1;
}
运行结果: