2012年 上半年 第五周 C++程序设计 (十二)

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

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
};

任务要求:完成下面类的设计,并在main()函数中自行定义对象,调用各成员函数,完成基本的测试。

 

代码

 

#include<iostream>  
using namespace std; 
int gcd(int , int); 
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();                 
    void simplify();            
    void amplify(int n);            
    void output(int style=0);     
};  

int main ()  

{
	CFraction t1;
	t1.set(0,1);
	t1.input();
	t1.simplify();            
    t1.amplify(5);
	t1.output(2);  
    cout<<endl;
	system("pause");
	return 0;  
}  

CFraction::CFraction(int nu,int de)  
{
	if(de!=0)
	{
		nume = nu;
		deno = de;
	}
	else
	{
		cerr<<"分母不能为零"<<endl;
		exit(0);
	}
}  

void CFraction::set(int nu,int de)  
{
	if(de!=0)
	{
		nume = nu;
		deno = de;
	}
}  

void CFraction::input()                  
{
	char c;  
    cout<<"请按照“nu/de”的格式输入一个分数:"; 
	while(1)
	{
		cin>>nume>>c>>deno;
		if(c!='/')
			cout<<"格式不正确"<<endl;   
        else if(deno==0)
			cout<<"分母不能为零"<<endl;
		else
			break;
	}
}  

void CFraction::simplify()         
{   int n;
	n=gcd(nume,deno);
	nume=nume/n;
	deno=deno/n;
	cout<<"化简结果为:"<<nume<<'/'<<deno<<endl;
}  

void CFraction::amplify(int n)          
{
	nume=nume*n;
	cout<<"结果为:";
}  

void CFraction::output(int style)          
{
	int i;
	switch(style)
	{
	case 0:
		cout<<nume<<'/'<<deno<<endl;
		break;
	case 1:
		 i=gcd(nume,deno);
		 cout<<(nume/i)<<'/'<<(deno/i)<<endl;
		 break;
	case 2:
		int nu,de;
		i=gcd(nume,deno);
		nu=nume/i;
		de=deno/i;
		cout<<(nume/de)<<"("<<(nu%de)<<'/'<<de<<")"<<endl;
		break;
	default:
		cout<<nume<<'/'<<deno<<endl;
	}
}

int gcd(int x ,int y)
{
	int r;
	while(y!=0)
	{
		r=x%y;
		x=y;
		y=r;
	}
	return x;
}

	
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值