本文为博主原创文章,未经博主允许不得转载。
//score.h
#include<iostream>
#include<string.h>
using namespace std;
class denominator_zero //空类
{};
template<class T>
class score //分数类模板
{
private:
T molecular; //分子
T denominator; //分母
public:
score(){}
score(T x,T y); //构造函数
score add(score x); //加
score sub(score x); //减
score mul(score x); //乘
score div(score x); //除
void show(); //输出
};
template<class T> //构造函数
score<T>::score(T x,T y)
{
molecular=x;
denominator=y;
try //捕捉异常
{
if(denominator==0)
{
throw denominator_zero(); //抛出异常
}
}
catch(denominator_zero) //处理异常
{
cout<<"分母为0错误"<<endl;
system("pause");
exit(0);
}
}
template<class T>
score<T> score<T>::add(score<T> x)
{
return score<T>(molecular*x.denominator+denominator*x.molecular,denominator*x.denominator);
}
template<class T>
score<T> score<T>::sub(score<T> x)
{
return score<T>(molecular*x.denominator-denominator*x.molecular,denominator*x.denominator);
}
template<class T>
score<T> score<T>::mul(score<T> x)
{
return score<T>(molecular*x.molecular,denominator*x.denominator);
}
template<class T>
score<T> score<T>::div(score<T> x)
{
return score<T>(molecular*x.denominator,denominator*x.molecular);
}
template<class T>
void score<T>::show()
{
if(molecular==0)
{
cout<<"结果为0"<<endl;
}
else cout<<"结果为:"<<molecular<<"/"<<denominator<<endl;
}
//score.cpp
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int n,t;
int a,b,c,d;
float A,B,C,D;
label: //goto 语句返回
cout<<"选择分数类型"<<endl;
cout<<"1.整数"<<endl<<"2.小数"<<endl;
while(cin>>n)
{
switch(n)
{
case 1:
{
cout<<"请输入第一个分数的分子(整数):";
cin>>a;
cout<<"请输入第一个分数的分母(整数):";
cin>>b;
cout<<"请输入第二个分数的分子(整数):";
cin>>c;
cout<<"请输入第二个分数的分母(整数):";
cin>>d;
score<int> score_1(a,b),score_2(c,d),score_3; //int即整数运算
cout<<"请选择运算方法"<<endl;
cout<<"1.加法"<<endl<<"2.减法"<<endl<<"3.乘法"<<endl<<"4.除法"<<endl<<"5.返回"<<endl;
while(cin>>t)
{
switch(t)
{
case 1:
{
score_3=score_1.add(score_2);
score_3.show();
break;
}
case 2:
{
score_3=score_1.sub(score_2);
score_3.show();
break;
}
case 3:
{
score_3=score_1.mul(score_2);
score_3.show();
break;
}
case 4:
{
score_3=score_1.div(score_2);
score_3.show();
break;
}
case 5:
{
goto label;
break;
}
default:
{
cout<<"请重新输入"<<endl;
break;
}
}
}
}
break;
case 2:
{
cout<<"请输入第一个分数的分子(小数):";
cin>>A;
cout<<"请输入第一个分数的分母(小数):";
cin>>B;
cout<<"请输入第二个分数的分子(小数):";
cin>>C;
cout<<"请输入第二个分数的分母(小数):";
cin>>D;
score<float> score_1(A,B),score_2(C,D),score_3; //float 即小数运算
cout<<"请选择运算方法"<<endl;
cout<<"1.加法"<<endl<<"2.减法"<<endl<<"3.乘法"<<endl<<"4.除法"<<endl<<"5.返回"<<endl;
while(cin>>t)
{
switch(t)
{
case 1:
{
score_3=score_1.add(score_2);
score_3.show();
break;
}
case 2:
{
score_3=score_1.sub(score_2);
score_3.show();
break;
}
case 3:
{
score_3=score_1.mul(score_2);
score_3.show();
break;
}
case 4:
{
score_3=score_1.div(score_2);
score_3.show();
break;
}
case 5:
{
goto label;
break;
}
default:
{
cout<<"请重新输入"<<endl;
break;
}
}
}
}
break;
}
}
return 0;
}