第八周 任务四

/* 
实验内容:实现分数的运算符重载 
* 程序的版权和版本声明部分  
* Copyright (c) 2011, 烟台大学计算机学院学生  
* All rights reserved.  
* 文件名称: 实现分数的运算符重载                          
* 作    者:  薛广晨                             
* 完成日期:  2012       年  4    月  7      日  
* 版 本号:  x1.0           
*/
//【任务4】在任务3的基础上拓展。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。
#include<iostream>

using namespace std;

class CFraction
{
private:
	int nume;  // 分子
	int deno;  // 分母
 public:
	CFraction(int nu = 0, int de = 1) : nume(nu), deno(de){};   //构造函数,初始化用
	void output();
	void output1();

	CFraction operator+(CFraction &c1);
	friend CFraction operator+(CFraction &c1, int &a);
	friend CFraction operator+(int &a, CFraction &c1);

	CFraction operator-(CFraction &c1);
	friend CFraction operator-(CFraction &c1, int &a);
	friend CFraction operator-(int &a, CFraction &c1);

	CFraction operator*(CFraction &c1);
	friend CFraction operator*(CFraction &c1, int &a);
	friend CFraction operator*(int &a, CFraction &c1);

	CFraction operator/(CFraction &c1);
	friend CFraction operator/(CFraction &c1, int &a);
	friend CFraction operator/(int &a, CFraction &c1);

	CFraction operator-();//取反

	//比较运算符(二目)的重载
	bool operator > (CFraction &c1);
	bool operator < (CFraction &c1);
	bool operator >= (CFraction &c1);
	bool operator <= (CFraction &c1);
	bool operator == (CFraction &c1);
	bool operator != (CFraction &c1);

};

CFraction CFraction :: operator+(CFraction &c1)
{ 
	CFraction c2;  
    c2.deno = deno * c1.deno;  
    c2.nume = nume * c1.deno + c1.nume * deno;  
    return c2;  
}  

CFraction operator+(CFraction &c1, int &a)
{ 
	CFraction c2;  
    c2.deno = c1.deno;  
    c2.nume = c1.nume + a * c1.deno;  
    return c2;  
} 

CFraction operator+(int &a, CFraction &c1)
{ 
	CFraction c2;  
    c2.deno = c1.deno;  
    c2.nume = c1.nume + a * c1.deno;  
    return c2;   
} 
CFraction CFraction :: operator-(CFraction &c1)
{  
	CFraction c2;  
    c2.deno = deno * c1.deno;  
    c2.nume = nume * c1.deno - c1.nume * deno;  
    return c2;  
}  

CFraction operator-(CFraction &c1, int &a)
{  
	CFraction c2;  
    c2.deno = c1.deno;  
    c2.nume = c1.nume - a * c1.deno;  
    return c2;  
}  

CFraction operator-(int &a, CFraction &c1)
{  
	CFraction c2;  
    c2.deno = c1.deno;  
    c2.nume = c1.nume - a * c1.deno;  
    return c2;   
}  

CFraction CFraction :: operator*(CFraction &c1)
{  
	CFraction c2;  
    c2.deno = deno * c1.deno;  
    c2.nume = nume * c1.nume;  
    return c2;  
}  

CFraction operator*(CFraction &c1, int &a)
{  
	CFraction c2;  
    c2.deno = c1.deno;  
    c2.nume = c1.nume * a;  
    return c2;  
}  

CFraction operator*(int &a, CFraction &c1)
{  
	CFraction c2;  
    c2.deno = c1.deno;  
    c2.nume = c1.nume * a;  
    return c2;  
}  

CFraction CFraction :: operator/(CFraction &c1)
{  
	CFraction c2;  
    c2.deno = deno * c1.nume;  
    c2.nume = nume * c1.deno;  
    return c2;  
}  

CFraction operator/(CFraction &c1, int &a)
{  
	CFraction c2;  
    c2.deno = c1.deno * a;  
    c2.nume = c1.nume;  
    return c2;  
}  
CFraction operator/(int &a, CFraction &c1)
{  
	CFraction c2;  
	c2.deno = c1.nume;  
	c2.nume = c2.deno * a;  
    return c2;  
}  

CFraction CFraction :: operator-()//取反
{
	CFraction c2; 
	c2.nume = -nume;
	c2.deno = deno;

	return c2;
}

void CFraction :: output()  
{  
	int i;  
    if(deno == 0)  
    cout<<"error"<<endl; 
	if(nume >= 0)
	{
		if(deno < nume)i = deno;
	    else i = nume;
	    for(; i > 0; --i)
	    {
			if(nume % i == 0 && deno % i == 0)
		    {
				nume = nume / i;
			    deno = deno / i;
			    break;
	        }
         }
	     cout << nume << "/" << deno << endl; 
	}
	else 
	{
		nume = -nume;
		if(deno < nume)i = deno;
	    else i = nume;
	    for(; i > 0; --i)
	    {
			if(nume % i == 0 && deno % i == 0)
		    {
				nume = nume / i;
			    deno = deno / i;
			    break;
	        }
         }
	     cout << -nume << "/" << deno << endl; 
	}

}  

void CFraction :: output1()  
{  
	cout << nume << "/" << deno << endl;  
} 

//比较运算符(二目)的重载
bool CFraction :: operator > (CFraction &c1)
{
	CFraction c2, c3;
	c2.nume = nume * c1.deno;
	c3.nume = c1.nume * deno;
	if(c2.nume > c3.nume)return true;
	else return false;
}

bool CFraction :: operator < (CFraction &c1)
{
	CFraction c2, c3;
	c2.nume = nume * c1.deno;
	c3.nume = c1.nume * deno;
	if(c2.nume < c3.nume)return true;
	else return false;
}

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

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

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

bool CFraction :: operator != (CFraction &c1)
{
	CFraction c2, c3;
	c2.nume = nume * c1.deno;
	c3.nume = c1.nume * deno;
	if((c2.nume > c3.nume) || (c2.nume < c3.nume))return true;
	else return false;
}

void main()
{
	int i = 2, m = 3 ;
	CFraction c1(3, 6), c2(1,4), c3;
	cout << "c1 = ";
	c1.output1();

	cout << "c2 = ";
	c2.output1();

	c3 = c1 + c2;
	cout << "c1 + c2 = ";
	c3.output();
    
	c3 = c1 - c2;
	cout << "c1 - c2 = ";
	c3.output();

	c3 = c1 * c2;
	cout << "c1 * c2 = ";
	c3.output();

	c3 = c1 / c2;
	cout << "c1 / c2 = ";
	c3.output();

	c3 = -c1;
	cout << "-c1 = ";
	c3.output();

	cout << endl;
	
	cout<<"下面比较两个分数的大小:\n";
	if (c1 > c2) cout << "c1 > c2" << endl;
	if (c1 < c2) cout << "c1 < c2" << endl;
	if (c1 == c2) cout << "c1 = c2" << endl; 
	if (c1 != c2) cout << "c1 ≠ c2" << endl;
	if (c1 >= c2) cout << "c1 ≥ c2" << endl;
	if (c1 <= c2) cout << "c1 ≤ c2" << endl;
	cout<<endl;
    
	c3 = c1 + i;
	cout << "c1 + 2 = ";
	c3.output();

	c3 = i + c1;
	cout << "2 + c1 = ";
	c3.output();

	c3 = c1 - i;
	cout << "c1 - 2 = ";
	c3.output();

	c3 = i - c1;
	cout << "2 - c1 = ";
	c3.output();

	c3 = c1 * m;
	cout << "c1 * 3 = ";
	c3.output();

	c3 = m * c1;
	cout << "3 *  c1= ";
	c3.output();

	c3 = c1 / m;
	cout << "c1 ÷ 3 = ";
	c3.output();

    c3 = m / c1;
	cout << "3 ÷ c1 = ";
	c3.output();

	system("pause");
}


上机感言:敲完这几个程序,就有种飞一般的感觉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值