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++大佬,在评论区或公众号提出其他的解题思路,我们下期再见。

  • 相关阅读:
    Application Error
    war文件
    The connection to adb is down, and a severe error has occured.
    CORS解决跨域访问问题
    实验吧_拐弯抹角(url伪静态)&Forms
    系列文章(一):探究电信诈骗的关键问题与应对策略——By Me
    企业内部安全宣贯:乌云网停摆事件的思考与评论——By Me
    安全需求-建模归类——By Me
    思考在伟大的互联网世界中,我是谁?——By Me in 2016
    去把bilibili的返回顶点锚点扒了下来
  • 原文地址:https://www.cnblogs.com/carp/p/15652489.html
Copyright © 2011-2022 走看看