7.8设计一个分数类模板。要求:1.分数类模板中包含的分数运算有:两个分数的加、减、乘、除运算。2.分数的输出格式是:分子/分母。3.测试程序中分子和分母既可以同时为int类型,也可以同时为float

本文为博主原创文章,未经博主允许不得转载。

//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;
}
  • 8
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值