鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 小甲鱼

第二十六讲 运算符重载2(课件+源代码)

[复制链接]
发表于 2016-3-22 20:17:40 | 显示全部楼层
#include <iostream>
#include <string>
#include <stdlib.h>

class Rational
{
public:
    Rational(int num, int denom);  // num = 分子, denom = 分母

    Rational operator+(Rational rhs); // rhs == right hand side
    Rational operator-(Rational rhs);
    Rational operator*(Rational rhs);
    Rational operator/(Rational rhs);

    void print();

private:
    void normalize(); // 负责对分数的简化处理

    int numerator;    // 分子
    int denominator;  // 分母
};
Rational::Rational(int num, int denom)
{
    numerator = num;
    denominator = denom;

    normalize();
}
// normalize() 对分数进行简化操作包括:
// 1. 只允许分子为负数,如果分母为负数则把负数挪到分子部分,如 1/-2 == -1/2
// 2. 利用欧几里德算法(辗转求余原理)将分数进行简化:2/10 => 1/5
void Rational::normalize()
{
    // 确保分母为正
    if( denominator < 0 )
    {
        numerator = -numerator;
        denominator = -denominator;
    }
    // 欧几里德算法
    int a = abs(numerator);
    int b = abs(denominator);

    // 求出最大公约数
    while( b > 0 )
    {
        int t = a % b;
        a = b;
        b = t;
    }

    // 分子、分母分别除以最大公约数得到最简化分数
    numerator /= a;
    denominator /= a;
}

// a   c   a*d   c*b   a*d + c*b
// - + - = --- + --- = ---------
// b   d   b*d   b*d =    b*d
Rational Rational::operator+(Rational rhs)
{
    int a = numerator;
    int b = denominator;
    int c = rhs.numerator;
    int d = rhs.denominator;

    int e = a*b + c*d;
    int f = b*d;

    return Rational(e, f);
}

// a   c   a   -c
// - - - = - + --
// b   d   b   d
Rational Rational::operator-(Rational rhs)
{
    rhs.numerator = -rhs.numerator;

    return operator+(rhs);
}

// a   c   a*c
// - * - = ---
// b   d   b*d
Rational Rational::operator*(Rational rhs)
{
    int a = numerator;
    int b = denominator;
    int c = rhs.numerator;
    int d = rhs.denominator;

    int e = a*c;
    int f = b*d;

    return Rational(e, f);
}

// a   c   a   d
// - / - = - * -
// b   d   b   c
Rational Rational::operator/(Rational rhs)
{
    int t = rhs.numerator;
    rhs.numerator = rhs.denominator;
    rhs.denominator = t;

    return operator*(rhs);
}

void Rational::print()  // 1/8
{
    if( numerator % denominator == 0 )
        std::cout << numerator / denominator;
    else
        std::cout << numerator << "/" << denominator;
}

int main()
{
    Rational f1(2, 16);
    Rational f2(7, 8);

    // 测试有理数加法运算
    Rational res = f1 + f2;
    f1.print();
    std::cout << " + ";
    f2.print();
    std::cout << " = ";
    res.print();
    std::cout << "\n";

    // 测试有理数减法运算
    res = f1 - f2;
    f1.print();
    std::cout << " - ";
    f2.print();
    std::cout << " = ";
    res.print();
    std::cout << "\n";

    // 测试有理数乘法运算
    res = f1 * f2;
    f1.print();
    std::cout << " * ";
    f2.print();
    std::cout << " = ";
    res.print();
    std::cout << "\n";

    // 测试有理数除法运算
    res = f1 / f2;
    f1.print();
    std::cout << " / ";
    f2.print();
    std::cout << " = ";
    res.print();
    std::cout << "\n";

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-21 20:31:10 | 显示全部楼层
这个文件怎么打不开?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-6 15:49:03 | 显示全部楼层
学到了,感谢小甲鱼老师!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-4 10:54:16 | 显示全部楼层
好资料
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-25 14:48:42 | 显示全部楼层
好贵啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-25 14:28:36 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-29 13:40:48 | 显示全部楼层
//实现有理数的加减乘除
//1/8 + 7/8=1
//1/8 * 7/8=7/64
//1/8 / 7/8=1/7
//1/8 - 7/8=-6/8
//思路把分数拆成分子和分母
#include <iostream>
using namespace std;
//operator 重载运算符C++不允许的五个运算符
//.成员访问运算符
//.* 成员指针运算符
//:: 域运算符
//sizeof 尺寸运算符
//?:   条件运算符 三目
class RationalNumber//复数基类
{
public:
        RationalNumber();//基类构造器
        RationalNumber(int molecular,int denominator);//基类构造器重载
        friend  RationalNumber operator+(RationalNumber &A,RationalNumber &B);//重载加法
                friend  RationalNumber operator-(RationalNumber &A,RationalNumber &B);//重载减法
                friend  RationalNumber operator*(RationalNumber &A,RationalNumber &B);//重载乘法
                friend  RationalNumber operator/(RationalNumber &A,RationalNumber &B);//重载除法
                int  FractionalReduction(int n,int m);//分式化简函数
        void print();
private://私有变量只有基类的方法才能调用
        double mole;//分子
        double denom;//分母
};
RationalNumber::RationalNumber()//如果主函数建立类的对象没有参数的话 那么实数部分和虚数部分初始化为0
{
        mole =0; //分子初始化为0
        denom=0;//分母初始化为0
}
RationalNumber::RationalNumber(int molecular,int denominator)//如果主函数建立类的对象有参数的话 那么实数部分=r;虚数部=i 同一个作用范围是重载
{
        mole =molecular; //分子初始化为0
        denom=denominator;//分母初始化为0
}
int RationalNumber:: FractionalReduction(int n,int m)//分式化简函数
{
        int temp,r,molecular,denominator;
   molecular=n;
   denominator=m;
        //把大的数放在n里面
        if(n<m)
        {
                temp=n;
                n=m;
                m=temp;
        }
        while(m!=0)
        {   
                r=n%m;
                n=m;
                m=r;  
        }
        molecular=molecular/n;
        denominator=denominator/n;
        std::cout<<"化简结果="<<molecular<<"/"<<denominator<<std::endl;
        return n;
}
////类型   作用域  重载符号      参数
//Complex Complex::operator-(Complex &d)
//{
//        Complex c;//建立Complex类的对象c
//        c.real=real+d.real;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
//        c.imag=imag+d.imag;
//        return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
//}
//类型   作用域  重载符号      参数
RationalNumber operator+(RationalNumber &A,RationalNumber &B)
{
        RationalNumber c;//建立Complex类的对象c
        c.mole=A.mole*B.denom+A.denom*B.mole;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
        c.denom=A.denom*B.denom;
        return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
}
RationalNumber operator-(RationalNumber &A,RationalNumber &B)
{
        RationalNumber c;//建立Complex类的对象c
        c.mole=A.mole*B.denom-A.denom*B.mole;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
        c.denom=A.denom*B.denom;
        return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
}
RationalNumber operator*(RationalNumber &A,RationalNumber &B)
{
        RationalNumber c;//建立Complex类的对象c
        c.mole=A.mole*B.mole;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
        c.denom=A.denom*B.denom;
        return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
}
RationalNumber operator/(RationalNumber &A,RationalNumber &B)
{
        RationalNumber c;//建立Complex类的对象c
        c.mole=A.mole*B.denom;//在main函数中在建立对象时无参数时real=0;有参数时等于输入参数值
        c.denom=A.denom*B.mole;
        return c;//这里是返回对象c的值 包括实数部分c.real 和虚数部分 c.imag
}
void RationalNumber::print()//基类的输出函数方法
{
             
        std::cout<<"("<<mole<<"/"<<denom<<")\n";//打印Complex类建立的对象的实数部分 和 虚数部分
                FractionalReduction(mole,denom);
}
int main(int argc, char *argv[])
{
        RationalNumber c1(1,14),c2(2,7),c3;
        c3=c1+c2;
        std::cout<<"c1= ";
        c1.print();
        std::cout<<"c2= ";
        c2.print();
        std::cout<<"c1+c2= ";
        c3.print();

                c3=c1-c2;
                std::cout<<"c1-c2= ";
                c3.print();

                c3=c1*c2;
                std::cout<<"c1*c2= ";
                c3.print();

                c3=c1/c2;
                std::cout<<"c1/c2= ";
                c3.print();
                system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-29 15:22:43 | 显示全部楼层
测试鱼C老师的  代码出现问题    Rational f1(5, 14); Rational f2(2, 7);  这个参数时  加减法得出的结果是错误的  大家发面了么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-29 15:31:37 | 显示全部楼层
测试鱼C老师的  代码出现问题    Rational f1(5, 14); Rational f2(2, 7);  这个参数时  加减法得出的结果是错误的  大家发面了么?
加法修改如下:
int e = a*d + c*b;     //b和d的位置反了
int f = b*d;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 15:39:40 | 显示全部楼层
小鸟儿 发表于 2016-3-22 17:25
#include
using namespace std;
class Complex

么么哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 16:04:31 | 显示全部楼层
小鸟儿 发表于 2016-3-22 17:25
#include
using namespace std;
class Complex

兄弟这是25讲的内容&#128514;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-7 22:02:45 | 显示全部楼层
给小甲鱼点一个大大的赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-17 01:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表