8-3 实现分数类中的运算符重载

/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称: 分数类中的运算符重载
* 作 者: 张传新
* 完成日期: 2012 年 04 月 08 日
* 版 本 号: V.1.0

* 对任务及求解方法的描述部分
* 问题描述:实现分数类中的运算符重载,在分数类中可以完成分数的

* 加减乘除(运算后再化简)、求反、比较(6种关系)的运算。

* 程序头部的注释结束

#include<iostream>
using namespace std;

class CFraction
{
private:
	int nume;  // 分子
	int deno;  // 分母
public:
	CFraction(int nu = 1,int de = 2);   //构造函数,初始化用
	void input();                   //按照"nu/de"的格式,如"5/2"的形式输入
	void Simplify();			    //化简(使分子分母没有公因子)
	void S_Simplify();              //化简(以4/3为例,输出1(1/3),表示一又三分之一)
	void output(int style);		    //输出:以8/6为例,style为0时,输出8/6;
							        //style为1时,输出4/3;
							        //style为2时,输出1(1/3),表示一又三分之一;
							        //不给出参数和非1、2,认为是方式0

	void display();                 //输出分数

	CFraction operator+(CFraction &CF2); //定义分数加法
	CFraction operator-(CFraction &CF2); //定义分数减法
	CFraction operator*(CFraction &CF2); //定义分数乘法
	CFraction operator/(CFraction &CF2); //定义分数除法

	CFraction operator-();//取反

	//比较大小
	bool operator > (CFraction &CF2);
	bool operator < (CFraction &CF2);
	bool operator >= (CFraction &CF2);
	bool operator <= (CFraction &CF2);
	bool operator == (CFraction &CF2);
	bool operator != (CFraction &CF2);
};

//构造函数,初始化用
CFraction::CFraction(int nu,int de)
{
	nume = nu;
	deno = de;
}

//输出分数
void CFraction::display()
{
	cout << nume << "/" << deno <<endl;
}

//按照"nu/de"的格式,如"5/2"的形式输入
void CFraction::input()
{
	int a,c;

	char b;

	cout << "请输入分数(按照“a/b”的格式输入):" << endl;
	cin >> a;
	cin >> b;
	cin >> c;
	nume = a;
	deno = c;
}

//化简(使分子分母没有公因子)
void CFraction::Simplify()
{
	for(int i = 2;i <= nume && i <= deno;i++)
	{
		if(nume % i == 0 && deno % i == 0)
		{
			nume = nume/i;
			deno = deno/i;
		    i--;
		}
	}

	cout << nume << "/" << deno << endl;
}

//化简(以4/3为例,输出1(1/3),表示一又三分之一)
void CFraction::S_Simplify()
{
	for(int i = 2;i <= nume && i <= deno;i++)
	{
		if(nume % i == 0 && deno % i == 0)
		{
			nume = nume/i;
			deno = deno/i;
			i--;
		}
	}

    if(nume >= deno)
	{
		int n;

        n = nume / deno;
		nume = nume % deno;
	    cout << n << "(" << nume << "/" << deno << ")" << endl;
	}
	else
	{
		cout << "(" << nume << "/" << deno << ")" << endl;
	}

}
//输出:以8/6为例,style为0时,输出8/6;
//style为1时,输出4/3;
//style为2时,输出1(1/3),表示一又三分之一;
//不给出参数和非1、2,认为是方式0
void CFraction::output(int style)
{
	if(style == 1)
	{
		CFraction::Simplify();
	}
	else if(style == 2)
	{
		CFraction::S_Simplify();
	}
	else
	{
		cout << nume << "/" << deno << endl;
	}
}

//定义分数加法
CFraction CFraction::operator+(CFraction &CF2)
{
	nume = nume * CF2.deno + CF2.nume * deno;
	deno = deno * CF2.deno;
	return (*this);
}

//定义分数减法
CFraction CFraction::operator-(CFraction &CF2)
{
	nume = nume * CF2.deno - CF2.nume * deno;
	deno = deno * CF2.deno;
	return (*this);
}

//定义分数乘法
CFraction CFraction::operator*(CFraction &CF2)
{
	nume = nume * CF2.nume;
	deno = deno * CF2.deno;
	return (*this);
}

//定义分数除法
CFraction CFraction::operator/(CFraction &CF2)
{
	nume = nume * CF2.deno;
	deno = deno * CF2.nume;
	return (*this);
}
//取反
CFraction CFraction::operator-()
{
	nume = - nume;
	deno = deno;
	return (*this);
}

//比较大小
bool CFraction::operator > (CFraction &CF2)   
{  
	nume = nume * CF2.deno;
	CF2.nume = CF2.nume * deno;

    if( nume  > CF2.nume )  
    {  
        return true;  
    }  
    else  
    {  
        return false;  
    }  
} 
 
bool CFraction::operator < (CFraction &CF2)   
{  
    nume = nume * CF2.deno;
	CF2.nume = CF2.nume * deno;

    if( nume  < CF2.nume )  
    {  
        return true;  
    }  
    else  
    {  
        return false;  
    }  
}  

bool CFraction::operator >= (CFraction &CF2)   
{  
    nume = nume * CF2.deno;
	CF2.nume = CF2.nume * deno;

    if( nume  >= CF2.nume ) 
    {  
        return true;  
    }   
    else  
    {  
        return false;  
    }  
} 
 
bool CFraction::operator <= (CFraction &CF2)   
{  
    nume = nume * CF2.deno;
	CF2.nume = CF2.nume * deno;

    if( nume  <= CF2.nume ) 
    {  
        return true;  
    }  
    else  
    {  
        return false;  
    }  
}  

bool CFraction::operator == (CFraction &CF2)   
{  
    nume = nume * CF2.deno;
	CF2.nume = CF2.nume * deno;

    if( nume  == CF2.nume ) 
    {  
        return true;  
    }    
    else  
    {  
        return false;  
    }  
}
  
bool CFraction::operator != (CFraction &CF2)   
{  
    nume = nume * CF2.deno;
	CF2.nume = CF2.nume * deno;

    if( nume  != CF2.nume ) 
    {  
        return true;  
    }   
    else  
    {  
        return false;  
    }  
} 
 
void main()
{
	CFraction CF1, CF2;

	CF1.input();         
	CF1.output(1);
	CF2.input(); 
	CF2.output(2);
	cout << endl;

	CFraction CF3(3,4), CF4(1,4),CF5;

	cout << "CF3为:" ; 
	CF3.display();
	cout << "CF4为:" ; 
	CF4.display();

    CF5 = CF3;
	CF5 = CF5 + CF4;
	cout << "CF3 + CF4 = ";
	CF5.display();
	cout << "化简后得:";
	CF5.Simplify();

	CF5 = CF3;
	CF5 = CF5 - CF4;
	cout << "CF3 - CF4 = ";
	CF5.display();
	cout << "化简后得:";
	CF5.Simplify();

	CF5 = CF3;
	CF5 = CF5 * CF4;
	cout << "CF3 * CF4 = ";
	CF5.display();
	cout << "化简后得:";
	CF5.Simplify();

	CF5 = CF3;
	CF5 = CF5 / CF4;
	cout << "CF3 / CF4 = ";
	CF5.display();
	cout << "化简后得:";
	CF5.Simplify();

	CF5 = CF3;
	CF5 = - CF5;
	cout << "-CF3 = ";
	CF5.display();

	cout << "比较两个分数大小:" << endl;      
    if (CF3 > CF4) cout << "CF3 > CF4" << endl;
	if (CF3 < CF4) cout << "CF3 < CF4" << endl;
	if (CF3 >= CF4) cout << "CF3 >= CF4" << endl;
	if (CF3 <= CF4) cout << "CF3 <= CF4" << endl;
	if (CF3 == CF4) cout << "CF3 == CF4" << endl;
	if (CF3 != CF4) cout << "CF3 != CF4" << endl;
	
	system("pause");
}


运行结果:

感言:

昨晚第二个感觉第三个比较轻松一些,同时在做第三个任务的时候,

想到第二个任务中有些漏洞,并及时的改正过来了,感觉。。。。

挺好!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值