zoukankan      html  css  js  c++  java
  • 运算符重载+日期类Date

      Hello,一只爱学习的鱼

      大学学习C++运算符重载的时候,老师出了一道“运算符重载+类”的综合练习题,让我们来一起看看吧!

      题目:  

      设计一个日期类Date,包括年、月、日等私有成员;

      要求实现基本运算:如一个日期加上天数,一个日期减去天数、两个日期相差天数。

      基本设计思路及要求:

      1.在Date类中设计如下重载运算符函数:

      Date operator+(int days); 返回一个日期加上一个天数得到的日期;

      Date operator-(int days); 返回一个日期减去一个天数得到的日期;

      int operator-(Date &b); 返回两日期相差的天数。

      2.在实现这些重载运算符函数调用以下私有成员函数:

      leap(int); 判断指定的年份是否为闰年;

      transDate(Date &); 将指定日期转换为从0年0月0日起的天数;

      transDay(int); 将指定的0年0月0日起的天数转换为对应的日期。

      3.在main( )中,实现日期的基本运算:

      (1).闰年与非闰年的判断,以及各月的天数的获得问题,解决办法可设置并引用二维数组;

      (2).日期基本问题的实现问题,解决办法是在Date类中设计重载运算符函数:Date operator+(int days)、Date operator-(int days)、int operator-(Date &b),同时调用以下私有成员函数leap(int)、transDate (Date &)、transDay (int)得以实现;

      (3).如何使输入的日期有效,如2011 13 34为无效日期,解决办法是在input()中设置判断条件if(month>12||month<1||day>day_tab[leap(year)][month-1]||year<=0),判断日期是否为有效日期。

      流程图:

             

     

      根据要求先写出类:

     1 #include <iostream>
     2 using namespace std;  
     3 bool datetime(int, int, int);    //使用自定义函数datetime判断输入的日期是否合法,合法返回1,不合法返回0
     4 class Date {
     5 public:
     6     void input();
     7     void output();
     8     Date operator+(int days);
     9     Date operator-(int days);
    10     int operator-(Date& b);
    11 private:
    12     int leap(int);
    13     int transDate(Date&);
    14     int year, month, day;
    15 }; 

       然后,完整代码,我写了317行。鉴于篇幅,我讲解重载运算符函数Date operator+(int days),获取完整代码请关注我的公众号(一只爱学习的鲤鱼),回复:1207运算符重载,即可。

     1 Date Date::operator+(int days) {
     2     int y = this->year, m = this->month, d = this->day;
     3     while ((leap(y) == 1 && transDate(*this) + days > 366 && days > 366) || (leap(!y) == 1 && transDate(*this) + days > 365) && days > 365)    //简化运算,当days>=365天,直接操作年份,没必要操作月份
     4     {
     5         y++;
     6         if (leap(y) == 1)
     7             days = days - 366;
     8         else if (!leap(y) == 1)
     9             days = days - 365;
    10     }
    11 continue_:        while (((m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) && (days > 31))    //使用了goto语句,当days<365天,操作月份,每轮对月份运算一次,直至days小于当月天数
    12     || ((m == 4 || m == 6 || m == 9 || m == 11) && (days > 30))
    13     || (m == 2 && days > 29 && leap(y)) || (m == 2 && days > 28 && !leap(y))) {
    14     if (m == 1) {
    15         m = 2; days = days - 31;    //月份自增,days减去当月的天数
    16         goto continue_;
    17     }
    18     if (m == 2) {
    19         if (leap(y)) { m = 3; days = days - 29; }
    20         else { m = 3; days = days - 28; }
    21         goto continue_;
    22     }
    23     if (m == 3) {
    24         m = 4; days = days - 31;
    25         goto continue_;
    26     }
    27     if (m == 4) {
    28         m = 5; days = days - 30;
    29         goto continue_;
    30     }
    31     if (m == 5) {
    32         m = 6; days = days - 31;
    33         goto continue_;
    34     }
    35     if (m == 6) {
    36         m = 7; days = days - 30;
    37         goto continue_;
    38     }
    39     if (m == 7) {
    40         m = 8; days = days - 31;
    41         goto continue_;
    42     }
    43     if (m == 8) {
    44         m = 9; days = days - 31;
    45         goto continue_;
    46     }
    47     if (m == 9) {
    48         m = 10; days = days - 30;
    49         goto continue_;
    50     }
    51     if (m == 10) {
    52         m = 11; days = days - 31;
    53         goto continue_;
    54     }
    55     if (m == 11) {
    56         m = 12; days = days - 30;
    57         goto continue_;
    58     }
    59     if (m == 12) {
    60         y++; m = 1; days = days - 31;
    61         goto continue_;
    62     }
    63 }
    64     if (m == 1 && d + days > 31) { m = 2; d = d + days - 31; }    //最后,操作号数
    65     else if (m == 2 && d + days > 29 && leap(y)) { m = 3; d = d + days - 29; }
    66     else if (m == 2 && d + days > 28 && !leap(y)) { m = 3; d = d + days - 28; }
    67     else if (m == 3 && d + days > 31) { m = 4; d = d + days - 31; }
    68     else if (m == 4 && d + days > 30) { m = 5; d = d + days - 30; }
    69     else if (m == 5 && d + days > 31) { m = 6; d = d + days - 31; }
    70     else if (m == 6 && d + days > 30) { m = 7; d = d + days - 30; }
    71     else if (m == 7 && d + days > 31) { m = 8; d = d + days - 31; }
    72     else if (m == 8 && d + days > 31) { m = 9; d = d + days - 31; }
    73     else if (m == 9 && d + days > 30) { m = 10; d = d + days - 30; }
    74     else if (m == 10 && d + days > 31) { m = 11; d = d + days - 31; }
    75     else if (m == 11 && d + days > 30) { m = 12; d = d + days - 30; }
    76     else if (m == 12 && d + days > 31) { y++; m = 1; d = d + days - 31; }    //注意!this->day加days超过了31,年份要自增
    77     else d = d + days;
    78     this->month = m;
    79     this->year = y;
    80     this->day = d;
    81     return *this;    //返回this对象
    82 }

      代码注释,写明我的编程思路和在编程中遇到的坑。(附:养成写代码注释,也是一种好习惯哦!)

      下面是我在Visual Studio 2019的运行结果:

      

      关注我的公众号(一只爱学习的鲤鱼)

      

      回复:1207运算符重载。即可得到运算符重载+日期类Date.cpp文件

      

      最后,也欢迎C++大佬,在评论区或公众号提出其他的解题思路,我们下期再见。

  • 相关阅读:
    LeetCode——Generate Parentheses
    LeetCode——Best Time to Buy and Sell Stock IV
    LeetCode——Best Time to Buy and Sell Stock III
    LeetCode——Best Time to Buy and Sell Stock
    LeetCode——Find Minimum in Rotated Sorted Array
    Mahout实现基于用户的协同过滤算法
    使用Java对文件进行解压缩
    LeetCode——Convert Sorted Array to Binary Search Tree
    LeetCode——Missing Number
    LeetCode——Integer to Roman
  • 原文地址:https://www.cnblogs.com/carp/p/15652489.html
Copyright © 2011-2022 走看看