C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,

#include <iostream>

using namespace std;

class CFraction
{private:
	int nume;  // 分子
	int deno;  // 分母
 public:
	CFraction(int nu=0,int de=1);   //构造函数,初始化用
	void Set(int nu=0,int de=1);    //置值,改变值时用
	void input();				//按照"nu/de"的格式,如"5/2"的形式输入
	void Simplify();			//化简(使分子分母没有公因子)
	void amplify(int n);			//放大n倍,如2/3放大5倍为10/3
	void output(int style=0);		//输出:以8/6为例,style为0时,输出8/6;
							//style为1时,输出4/3;
							//style为2时,输出1(1/3),表示一又三分之一;
							//不给出参数和非1、2,认为是方式0
};
int main ()
{
    CFraction CF;
	int style,x;
	CF.input();
	cout<<"请输入要放大的倍数:"<<endl;
	cin>>x;
	CF.amplify(x);
	cout<<"选择输出形式(以8/6为例,style为0时,输出8/6;style为1时,输出4/3;style为2时,输出1(1/3),表示一又三分之一;不给出参数和非1、2,认为是方式0)"<<endl;
	cin>>style;
	CF.output(style);
	CF.Set();
	return 0;
}

	
CFraction::CFraction(int nu,int de)
{
	nume=nu;
	deno=de;
}
void CFraction::Set(int nu,int de)
{
	nume=nu;
	deno=de;
}
void CFraction:: input()
{
	int x,y;
	char ch1;
	while(1)
	{
	    cout<<"请输入分数(格式为 */*):"<<endl;
	    cin>>x>>ch1>>y;
		if (ch1!='/')
			cout<<"输入错误,请重新输入"<<endl;
		else
			break;
	}
	nume=x;
	deno=y;
}
void CFraction::Simplify()
{
	int m,n;
    n=nume,m=deno;
	for(int i=2;n>=i;i++) 
	{
      if(n%i==0 && m%i==0)
      {
         n/=i;
         m/=i;
         i--;       
      }
	}
	cout<<n<<"/"<<m<<endl;
}
   
void CFraction::amplify(int x)
{	
	int m,n;
    n=nume,m=deno;
	for(int i=2;n>=i;i++) 
	{
      if(n%i==0 && m%i==0)
      {
         n/=i;
         m/=i;
         i--;       
      }
	}
	n=n*x;
	cout<<n<<"/"<<m<<endl;
	
}
void CFraction::output(int style)
{
	int n,m,x;
	n=nume,m=deno;
	 switch(style)
	 {
	 case 1:
		 {
		   for(int i=2;n>=i;i++) 
		   {
              if(n%i==0 && m%i==0)
			  {
                n/=i;
                m/=i;
                 i--;       
			  }
		   }cout<<n<<"/"<<m<<endl;
		 };break;
	
	 case 2:
		 {
			 cout<<"约分后结果为:";
              for(int i=2;n>=i;i++) 
			  {
                 if(n%i==0 && m%i==0)
				 {
                  n/=i;
                 m/=i;
                  i--;       
				 }
			  };
		     if(n<=m)
			 {
			     cout<<n<<"/"<<m<<endl;
			 }
		    else if (n%m==0)
			{
			  x=n/m;
			  n=n%m;
			  cout<<x<<endl;
			}
			  else
			  {
               x=n/m;
			   n=n%m;
               cout<<x<<'('<<n<<'/'<<m<<')'<<endl;
			  }
		 };break;
		   default:cout<<n<<"/"<<m<<endl;break;
	 }
}





 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值