• 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指针好用也不能乱用,辨别清楚什么时候该用局部变量什么时候该用全局变量,写着这个程序实在挺累的,实现完每一个重载函数后也不想补全测试函数了,不过重载的应该都对了,明天接着做奋斗

  • 相关阅读:
    数据结构栈的链式存储(c语言描述)
    Glide相关api
    mac安装WireShark2.0新手教程
    android的布局 (如何实现空心圆效果的布局)
    Android如何设置只有边框背景透明的背景呢?
    failed parsing overlays.
    SVN 报错问题
    关于Fragment的点击切换数据滞留问题
    数据结构(严蔚敏版)思维导图
    【LeetCode】23.合并K个排序链表
  • 原文地址:https://www.cnblogs.com/chxuan/p/8232201.html
Copyright © 2020-2023  润新知