首页 > 编程语言 >C++day05

C++day05

时间:2024-08-10 13:24:41浏览次数:7  
标签:jiao fen C++ RMB int day05 -- yuan

1> 思维导图

2>

搭建一个货币的场景,创建一个名为 RMB 的类,该类具有整型私有成员变量 yuan(元)、jiao(角)和 fen(分),并且具有以下功能:

(1)重载算术运算符 + 和 -,使得可以对两个 RMB 对象进行加法和减法运算,并返回一个新的 RMB 对象作为结果。

(2)重载关系运算符 >,判断一个 RMB 对象是否大于另一个 RMB 对象,并返回 true 或 false。

(3)重载前置减减运算符 --,使得每次调用时 RMB 对象的 yuan、jiao 和 fen 分别减 1

(4)重载后置减减运算符 --,使得每次调用时 RMB 对象的 yuan、jiao 和 fen 分别减 1

(5)另外, RMB 类还包含一个静态整型成员变量 count,用于记录当前已创建的 RMB 对象的数量。每当创建一个新的 RMB 对象时,count 应该自增 1;每当销毁一个 RMB 对象时,count 应该自减 1。

要求,需要在main 函数中测试上述RMB 类的功能。

#include <iostream>

using namespace std;

class RMB
{
friend RMB const operator+(const RMB &L,const RMB &R);
friend const RMB operator-(const RMB &L,const RMB &R);
friend RMB &operator--(RMB&R);
friend const RMB operator--(RMB &R,int);
private:
    int yuan,jiao,fen;

    static int count;
public:
    //静态成员函数获取账户个数
    static int getcount()
    {
        return RMB::count;
    }
    //用于处理元角分的加
    static int adjust (int a,int b,int &borrow)
    {
        int sum = a+b;

         if(sum >= 10)
         {
             sum -=10;
             borrow = 1;
         }else
         {
             borrow = 0;
         }
         return sum;
    }

    //用于处理元角分的减
    static int dif(int a,int b,int &borrow)
    {
        int num = a-b;
        if(num < 0)
        {
            num+=10;
            borrow = 1;
        }else
        {
            borrow = 0;
        }
        return num;
    }

    //无参构造函数
    RMB(){
        cout << "这是账户:" << ++count << endl;
    }

    //有参构造函数
    RMB(int yuan,int jiao,int fen):yuan(yuan),jiao(jiao),fen(fen)
    {
        cout << "这是账户:" << ++count << endl;
    }

    //重载关系运算符>,判断一个RMB对象是否大于另一个RMB对象,并返回true或false。
    bool operator>(const RMB &r) const
    {
        if(yuan > r.yuan)
        {
            return true;
        }
        else if(jiao > r.jiao)
        {
            return true;
        }
        else if(fen > r.fen)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

    void show()
    {
        cout << "当前金额为:" << yuan << "元" << jiao << "角" << fen << "分" << endl;
    }

    //析构函数
    ~RMB()
    {
        count--;
    }

};
int RMB::count = 0; //静态数据成员必须在类外初始化

//重载算术运算符 +,使得可以对两个RMB对象进行加法和减法运算,并返回一个新的RMB对象作为结果
const RMB operator+(const RMB &L,const RMB &R){
    RMB temp;
    int borrow_fen = 0, borrow_jiao = 0;
    temp.fen = RMB::adjust(L.fen,R.fen,borrow_fen);
    temp.jiao = RMB::adjust(L.jiao,R.jiao + borrow_fen,borrow_jiao);
    temp.yuan= L.yuan + R.yuan + borrow_jiao;
    return temp;
}

// 重载算术运算符-,使得可以对两个 RMB 对象进行加法和减法运算,并返回一个新的RMB对象作为结果
const RMB operator-(const RMB &L,const RMB &R)
{
    RMB temp;
    if((L > R)!=0)
    {
        int borrow_fen = 0, borrow_jiao = 0;
        temp.fen = RMB::dif(L.fen,R.fen,borrow_fen);
        temp.jiao = RMB::dif(L.jiao,R.jiao - borrow_fen,borrow_jiao);
        temp.yuan= L.yuan - R.yuan - borrow_jiao;
        return temp;
    }else
    {
        cout << "金额过小,请重试!" << endl;
    }
    return temp;
}

//重载前置减减运算符 --,使得每次调用时RMB对象的yuan、jiao和fen分别减1
RMB &operator--(RMB&R)
{
    if(R.yuan >= 1)
    {
        --R.yuan;
    }
    if(R.jiao >= 1)
    {
        --R.jiao;
    }else if(R.jiao == 0)
    {
        R.jiao = 9;
        --R.yuan;
    }
    if(R.fen >= 1)
    {
        --R.fen;
    }else if(R.fen == 0)
    {
        R.fen = 9;
        --R.jiao;
    }
    return R;
}

//重载后置减减运算符--,使得每次调用时RMB对象的yuan、jiao和fen分别减1
const RMB operator--(RMB &R,int)
{
    RMB temp;
    if(R.yuan >= 1)
    {
        temp.yuan = R.yuan--;
    }
    if(R.jiao >= 1)
    {
        temp.jiao = R.jiao--;
    }else if(R.jiao == 0)
    {
        R.jiao = 9;
        temp.yuan = R.yuan--;
    }
    if(R.fen >= 1)
    {
        temp.fen = R.fen--;
    }else if(R.fen == 0)
    {
        R.fen = 9;
        temp.jiao = R.jiao--;
    }
    return temp;

}

int main()
{
    RMB r1(8,6,7);
    RMB r2(7,8,5);
    RMB r3 = r1+r2;
    r3.show();
    if(r3>r2)
    {
        cout << "r3 > r2" << endl;
    }
    RMB r4 = r1-r2;
    r4.show();
    RMB r5 = r2-r1;
    RMB r6(8,0,0);
    RMB r7 = --r6;
    r7.show();
    RMB r8 = r2--;
    r8.show();
    cout << "当前账户个数为:" << RMB::getcount() << endl;

    return 0;
}

运行结果:

标签:jiao,fen,C++,RMB,int,day05,--,yuan
From: https://blog.csdn.net/m0_59481131/article/details/141066958

相关文章

  • C++day04
    1】思维导图2】完成关系运算符重载,实现成员函数和全局函数的版本。#include<iostream>usingnamespacestd;classStu{friendbooloperator<(constStu&L,constStu&R);private:intage;intid;public:Stu(){}Stu(intage,intid):age(age)......
  • C++day03
    1>思维导图2>设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数和拷贝构造函数。#include<iostream>usingnamespacestd;classPer{private:stringname;......
  • C++ int32, int64 和十六进制字符串的转换
       #include<iostream>#include<string>#include<cstring>//用于memset,strlen#include<algorithm>/***@brife:将一个int64数字转为十六进制字符串*@note:int64Value:0,hexStr:0000000000000000int64Value:-1,h......
  • C++ 11 auto(自动类型推导) 和 decltype(获取表达式类型)
    C++(2)auto占位符自动类型推导auto能够实现类型的自我推导,并不代表一个实际的类型声明。auto只是一个类型声明的占位符。auto声明的变量,必须马上初始化,以让编译器推断出它的实际类型,并在编译时将auto占位符替换为真正的类型。注意:C++11中auto不能用于函......
  • 【C++】decltype
    1、简介我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行。RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通过name成员函数返回类型的名称。同时在C++11中typeid还提供了hash_code这个成员函数,用于返回类型......
  • C++入门基础知识(笔记):成员变量和成员函数分开存储,非静态成员变量,是属于类的对象上,空对
    在C++中,类内的成员变量和成员函数分开存储只有非静态成员变量才属于类的对象上。1.空对象占用内存空间为:1个字节,代码演示:#include<iostream>usingnamespacestd;//成员变量和成员函数分开存储classPerson{};//这是一个空对象voidtest01(){ Personp;......
  • 2024年华为OD机试真题-求幸存数之和-(C++/Java/python)-OD统一考试(C卷D卷)
    2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】_华为od机试csdn-CSDN博客 题目描述给一个正整数数列nums,一个跳数jump,及幸存数量left。运算过程为:从索引0的位置开始向后跳,中间跳过J个数字,命中索引为J+1的数字,该数被敲出,并从该点起跳,以此类推,直到幸存le......
  • C++入门:C语言到C++的过渡
    前言:C++——为弥补C缺陷而生的语言        C++起源于1979年,当时BjarneStroustrup在贝尔实验室工作,面对复杂软件开发任务,他感到C语言在表达能力、可维护性和可扩展性方面存在不足。        1983年,BjarneStroustrup在C语言基础上添加面向对象编程......
  • 第18 章探讨 C++新标准 移动语义和右值引用
    第18章探讨C++新标准移动语义和右值引用第18章探讨C++新标准移动语义和右值引用文章目录第18章探讨C++新标准移动语义和右值引用18.2移动语义和右值引用程序清单18.2useless.cpp18.2移动语义和右值引用现在介绍本书前面未讨论的主题。C++11支持移动语......
  • 【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用
    前言:在C++编程语言中,异常处理是一种重要的机制,它允许程序员在运行时捕获和处理错误或异常情况。本文将详细介绍C++异常处理的相关知识点,包括异常的定义、抛出与捕获、异常处理的原则、以及在实际编程中的应用。目录1.异常处理的基本概念1.1异常的定义1.2异常的抛出......