zoukankan      html  css  js  c++  java
  • C++中的运算符重载练习题

    1.RMB类

    要求:

    定义一个RMB类 Money,包含元、角、分三个数据成员,友元函数重载运算符‘+’(加)
       和 ‘-’(减),实现货币的加减运算
        例如:
        请输入元、角 分:
        2 3 4
        请输入元、角 分:
        3 7 3
        和:6元0角7分
        差:-1元3角9分
        
        又例如:
        请输入元、角 分:
        2 3 4
        请输入元、角 分:
        3 0 0
        和:4元6角0分
        差:-0元6角6分

    代码实现:

     1 #include <iostream> 
     2 using namespace std;
     3 
     4 class Money 
     5 {
     6 private:
     7     int yuan, jiao, fen;
     8     bool flag;            //标志位,0表示钱数为正,1表示钱数为负 -> 默认结果的钱数为正 
     9 public:
    10     Money(); 
    11     Money(int fg, int y=0, int j=0, int f=0): yuan(y), jiao(j), fen(f), flag(fg){}
    12     friend Money operator+(Money a, Money b);    
    13     friend Money operator-(Money a, Money b);
    14     void display();
    15    
    16 };
    17 
    18 Money::Money()
    19 {
    20     flag = 0;
    21     cout << "请输入元、角 分:" <<endl;
    22     cin >> yuan >> jiao >> fen;
    23 }
    24 
    25 void Money::display()
    26 {
    27     if(flag==1) cout << '-'; 
    28     cout << yuan << "" << jiao << "" << fen << "" << endl;
    29 }
    30 
    31 //请用友元函数重载加/减,并要在类Money中声明为友元 
    32 //TODO重载加 类外定义Money类的+重载运算 
    33 Money operator+(Money a, Money b)
    34 {
    35     Money temp(0);
    36     // 将钱全部转化成分来计算 
    37     int money_a = a.yuan*100 + a.jiao*10 + a.fen*1;
    38     int money_b = b.yuan*100 + b.jiao*10 + b.fen*1;
    39     int res = money_a + money_b;
    40     // 因为是相加 故应该结果是正的 所以不用判断符号 但是相减时 结果可能为负 就要判断符号 
    41     temp.yuan = res/100;
    42     res = res % 100;
    43     temp.jiao = res/10;
    44     temp.fen = res % 10;
    45     
    46     // 返回结果对象 
    47     return temp;
    48 }   
    49     
    50 //TODO重载减 类外定义Money类的-重载运算 
    51 Money operator-(Money a, Money b)
    52 {
    53     Money temp(0);
    54     // 将钱全部转化成分来计算 
    55     int money_a = a.yuan*100 + a.jiao*10 + a.fen*1;
    56     int money_b = b.yuan*100 + b.jiao*10 + b.fen*1;
    57     int res = money_a - money_b;
    58     // 因为是相减时 结果可能为负 就要判断符号 
    59     if(res < 0)
    60     {
    61         temp.flag = 1;
    62         res = -res;
    63     }    
    64     temp.yuan = res/100;
    65     res = res % 100;
    66     temp.jiao = res/10;
    67     temp.fen = res % 10;
    68     
    69     // 返回结果对象 
    70     return temp;
    71 }
    72  
    73 int main() 
    74 {
    75     Money m1, m2, m3(0), m4(0); //m3用来记录和,m4用来记录差 
    76     
    77     // +
    78     m3=m1+m2;
    79     cout<<"和:";
    80     m3.display(); 
    81     
    82     // -
    83     m4=m1-m2;
    84     cout<<"差:";
    85     m4.display();
    86     
    87     return 0;
    88 }

    2.日期类运算符重载

    要求:

    定义一个日期类Date,包含年、月、日三个数据成员
       友元函数重载自增运算符(++),实现日期的自增。运行结果如下
        例如:
        请输入年、月、日:
         2016 11 11
        今天是:2016-11-11
        明天是:2016-11-12
        请完成以下程序 ,并注意特殊情况,例
        输入的是2016-12-31日
        输出的是2017-1- 1日   

    代码实现:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class Date{
     5 private:
     6     int year;
     7     int month;
     8     int day;
     9 public:
    10     Date();
    11     Date operator++(int);        // 申明重载的操作符,这种方法是后缀++ 
    12     /*
    13     ++和--重载注意:  ++和--有前后缀之分,另外下面的int只是一个占位符用来提示编译器 
    14     类名 operator++();       ++前缀    -> 调用方式: ++对象名    
    15     类名 operator--();         --前缀  -> 调用方式: --对象名
    16     类名 operator++(int);    ++后缀     -> 调用方式: 对象名++
    17     类名 operator--(int);   --后缀  -> 调用方式: 对象名--
    18     */ 
    19     void display();
    20 }; 
    21 
    22 // 判断是否是闰年 是闰年返回1 不是返回0 
    23 int judge(int year)
    24 {
    25     if(year%4==0&&year%100!=0||year%400==0)
    26         return 1;          //闰年 
    27     return 0;              //非闰年 
    28 }
    29 
    30 // 构造函数 
    31 Date::Date()
    32 {
    33     cout<<"请输入年、月、日:
    ";
    34     cin>>year>>month>>day;
    35 }
    36  
    37 // 运算符重载 
    38 Date Date::operator++(int)
    39 {
    40     // 数组存储一年12个月的天数,如果对象中的年份为闰年就将2月份的天数+1 
    41     int month_days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    42     if(judge(year))
    43     {
    44         month_days[1]++;
    45     }
    46     
    47     // 天数刚好是这个月的最后一天 就要判断月份是否是一年的最后一个月(12月)
    48     // 如果是12月 那么说明这一天是这一年的最后一天 那么年份+1 月和天均置1
    49     // 如果不是12月 那么就把月份+1,天置1 
    50     if(day==month_days[month-1])
    51     {
    52         if(month==12) 
    53         {
    54             year++;
    55             month=1;
    56             day=1;
    57         }
    58         else
    59         {
    60             month++;
    61             day=1;
    62         }
    63     }
    64     // 天数不是这个月的最后一天 就直接把天数+1即可 
    65     else
    66     {
    67         day++;
    68     }
    69     
    70     // 返回计算后的对象 就是套路 凡是++和--运算符重载 都可以这样做
    71     // 当然可以提前用一个temp保存*temp的值然后返回temp 也是同理 书上这两种方法都有 
    72     return *this;
    73 }
    74 
    75 void Date::display()
    76 {
    77     cout<<year<<"-"<<month<<"-"<<day<<endl;
    78 }
    79 
    80 int main()
    81 {
    82     Date d1; 
    83     cout<<"今天是:";
    84     d1.display();
    85     d1++;
    86     cout<<"明天是:";
    87     d1.display(); 
    88 }
  • 相关阅读:
    EF 关系规则(一对一、一对多、多对多...)
    EF框架中加子类后出现列名 'Discriminator' 无效问题
    .net下Ueditor配置(主要讲解上传功能配置)
    同构数查找程序的优化过程 Anthony
    Effective STL 条款17 Anthony
    C 语言中的数组类型和数组指针类型. Anthony
    Effective STL 条款18 Anthony
    RDLC之自定義數據集二
    给Calendar添加标签
    Profile学习
  • 原文地址:https://www.cnblogs.com/wyb666/p/9178389.html
Copyright © 2011-2022 走看看