C++走向远洋——53(项目一1、分数类的重载、加减乘除、比较)

*/
 * Copyright (c) 2016,烟台大学计算机与控制工程学院
 * All rights reserved.
 * 文件名:text.cpp
 * 作者:常轩
 * 微信公众号:Worldhello
 * 完成日期:2016年5月25日
 * 版本号:V1.0
 * 问题描述:分数类的重载
 * 程序输入:无
 * 程序输出:见运行结果
 */
#include<iostream>
#include<Cmath>
using namespace std;

class CFraction{
private:
	int nume;   //分子
	int deno;   //分母
public:
	CFraction(int nu=0,int de=0);
	CFraction operator+(const CFraction &n);  //分数相加
	CFraction operator-(const CFraction &n);  //分数相减
	CFraction operator*(const CFraction &n);  //分数相乘
	CFraction operator/(const CFraction &n);  //分数相除
	void display();                           //输出分数
	void simplify();                          //分数化简
    bool operator>(const CFraction &c);
    bool operator<(const CFraction &c);
    bool operator==(const CFraction &c);
    bool operator!=(const CFraction &c);
    bool operator>=(const CFraction &c);
    bool operator<=(const CFraction &c);
};

CFraction::CFraction(int nu,int de)                     //构造函数
{
	nume=nu;
	deno=de;
}
void CFraction::display()                               //输出函数
{
	cout<<nume<<"/"<<deno<<endl;
}
void CFraction::simplify()                              //分数化简
{
    int m,n,r;
    n=fabs(deno);
    m=fabs(nume);
	if(nume==0)
	  deno=0;
	else{
    while(r=m%n)    // 求m,n的最大公约数
    {
        m=n;
        n=r;
    }
    deno/=n;       // 化简
    nume/=n;
    if (deno<0)    // 将分母转化为正数
    {
        deno=-deno;
        nume=-nume;
    }
	}
}
CFraction CFraction::operator +(const CFraction &n)     //定义分数相加
{
	CFraction t;
	t.deno=this->deno*n.deno;
	t.nume=this->nume*n.deno+n.nume*this->deno;
	t.simplify();//化简
	return t;
}
CFraction CFraction::operator -(const CFraction &n)     //定义分数相减
{
	CFraction t;
	t.deno=this->deno*n.deno;
	t.nume=this->nume*n.deno-n.nume*this->deno;
	t.simplify();//化简
	return t;
}
CFraction CFraction::operator *(const CFraction &n)     //定义分数相乘
{
	CFraction t;
	t.deno=n.deno*this->deno;
	t.nume=n.nume*this->nume;
    t.simplify();//化简
	return t;
}
CFraction CFraction::operator /(const CFraction &n)     //定义分数相除
{
	CFraction t;
	t.deno=n.nume*this->deno;
	t.nume=n.deno*this->nume;
	t.simplify();//化简
	return t;
}

//比较运算符重载
bool CFraction::operator >(const CFraction &c)        //  >重载
{
 int this_nume,c_nume,common_deno;
    this_nume=nume*c.deno;        // 计算分数通分后的分子,同分母为deno*c.deno
    c_nume=c.nume*deno;
    common_deno=deno*c.deno;
    if ((this_nume-c_nume)*common_deno>0) return true;
    return false;
}
bool CFraction::operator<(const CFraction &c)
{    
    int this_nume,c_nume,common_deno;
    this_nume=nume*c.deno;
    c_nume=c.nume*deno;
    common_deno=deno*c.deno;
    if ((this_nume-c_nume)*common_deno<0) return true;
    return false;
}

// 分数比较大小
bool CFraction::operator==(const CFraction &c)
{
    if (*this!=c) return false;
    return true;
}

// 分数比较大小
bool CFraction::operator!=(const CFraction &c)
{
    if (*this>c || *this<c) return true;
    return false;
}

// 分数比较大小
bool CFraction::operator>=(const CFraction &c)
{
    if (*this<c) return false;
    return true;
}

// 分数比较大小
bool CFraction::operator<=(const CFraction &c)
{
    if (*this>c) return false;
    return true;
}

	
int main()
{
	CFraction a(2,3),b(1,3);
	CFraction c;
	c=a+b;
	cout<<"c=";
	c.display();
	c=a*b;
	cout<<"c=";
	c.display();
	c=a-b;
    cout<<"c=";
	c.display();
	c=a/b;
	cout<<"c=";
	c.display();
    if(a>b)
		cout<<"a>b";
	
    return 0;
}



运行结果:


心得:

      这次感觉有必要写一下了,这个程序一开始思路错了,化简过程弄得复杂了,最终无路可走后看了一下参考答案后豁然开朗

附原始代码:

#include<iostream>
using namespace std;

class CFraction{
private:
	int nume;   //分子
	int deno;   //分母
public:
	CFraction(int nu=0,int de=0);
	CFraction operator+(const CFraction &n);
	CFraction operator%(const CFraction &n);
	void display();
	friend int gcd(CFraction &,CFraction &);	//构造函数及运算符重载的函数声明
	friend int Zxg(CFraction &,CFraction &);
};
CFraction CFraction::operator %(CFraction &n)
{
    int fenmu;
    fenmu=this->deno%n.deno;
    CFraction t(this->nume,fenmu);
    return t;
}
int gcd(CFraction &a,CFraction &b)
{
	if(a.deno<=b.deno)
	{
		if(b.deno%a.deno==0)
			return b.deno;
		else
			return(gcd(a,b%a));
	}
	else
		return gcd(b,a);
}
int Zxg(CFraction  a,CFraction  b)
{
	return a.deno*b.deno/gcd(a.deno,b.deno);
}
CFraction::CFraction(int nu,int de)
{
	nume=nu;
	deno=de;
}
CFraction CFraction::operator +(CFraction &n)
{
	int fenzi,fenmu;int l;
	if(this.deno==n.deno)
	{
		fenzi=n.nume+this->nume;
        fenmu=this->deno;
	}
	else
	{
	    fenmu=Zxg(this,n.deno);
		fenzi=fenmu/n.deno*n.nume+fenmu/this->deno*this->nume;
	}

	CFraction t(fenzi,fenmu);
	return t;
}
void CFraction::display()
{
	cout<<nume<<"/"<<deno;
}
int main()
{
	CFraction a(1,3),b(1,3);
	CFraction c;
	c=a+b;
	c.display();
    return 0;
}


可以看到一开始的思路比较混乱,想到哪就写哪,最终导致补不上了原来的大洞,以后写的时候要进行整体考虑后再下手也不迟。另外this指针好用也不能乱用,辨别清楚什么时候该用局部变量什么时候该用全局变量,写着这个程序实在挺累的,实现完每一个重载函数后也不想补全测试函数了,不过重载的应该都对了,明天接着做奋斗

posted @ 2016-05-25 21:46  壹言  阅读(200)  评论(0编辑  收藏  举报