• c++类和对象实现日期的相关操作


    介绍 :

    要求:创建一个Date的日期类,实现日期的+、-、++、--、判断是否相等或大小的操作

     首先我们需要明确日期具有的特性,年有闰年366天和平年365天。月有大月31天、小月30天和二月29或28天。所以在判断一个日期前需要先判断润平年和月的天数(IsLeapyear()和GetMonthDay())

    日期操作代码实现:

     1.Date类的建立:

    1. class Date{
    2. public :
    3. Date(int year = 1, int month = 1,int day = 1)//Date构造函数
    4. {
    5. _year = year;
    6. _month = month;
    7. _day = day;
    8. if (!CheckDate())
    9. {
    10. Print();
    11. cout << "日期不合法" << endl;
    12. }
    13. }
    14. bool IsLeapyear(int year){}//判断润平年
    15. int GetMonthDay(int year,int month){}//求某月的天数
    16. Date& operator+=(int day){}//获取某个日期加day天后的日期,原日期改变
    17. Date operator+(int day){}//某个日期+day的日期但原日期不改变
    18. Date& operator-=(int day){}//获取某个日期减day天后的日期,原日期改变
    19. Date operator-(int day){}//某个日期-day的日期但原日期不改变
    20. int operator-(const Date& d){}//日期减某一个日期,原日期不改变
    21. Date& operator++(){}//日期前置++
    22. Date operator++(int){}//日期后置++
    23. Date operator--(int){}//日期后置--
    24. Date& operator--(){}//日期前置--
    25. //两个日期大小、相等比较
    26. bool operator>(const Date& d){}
    27. bool operator==(const Date& d){}
    28. bool operator>=(const Date& d){}
    29. bool operator<(const Date& d){}
    30. bool operator<=(const Date& d){}
    31. Date& operator=(const Date& d){}
    32. bool operator!=(const Date& d){}
    33. bool CheckDate(){}//判断该日期是否合法
    34. void Print(){}//打印
    35. private:
    36. int _year;
    37. int _month;
    38. int _day;
    39. };

    2.IsLeapyear()、GetMonthDay()实现:

    闰年:能被4整除且不能被100整除或能被400整除

    获取月的天数:可以用数组存放每个月的天数,除了二月需要根据润平年变化,其余月均不变,所以加一个if判断某年2月的天数。

    1. //判断润平年
    2. bool IsLeapyear(int year)
    3. {
    4. if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
    5. return true;
    6. else
    7. return false;
    8. }
    9. // 获取某年某月的天数
    10. int GetMonthDay(int year, int month)
    11. {
    12. static int days[13] = { 31,31,28,31,30,31,30,31,31,30,31,30,31 };
    13. if (month == 2 && IsLeapyear(year))
    14. {
    15. return 29;
    16. }
    17. else
    18. return days[month];
    19. }

    3.+=、+(日期加天数):

    +=:某一个日期加天数后得到一个新日期

    +:得到某一个日期加天数后的日期,但原日期不会改变 

            +在+=写好后可利用+=来实现,只要创建一个临时的ret类获取+=某天数后的日期再return ret即可。

    1. Date& operator+=(int day)
    2. {
    3. if (_day < 0)
    4. {
    5. return *this -= -day;
    6. }
    7. _day += day;
    8. while (_day > GetMonthDay(_year, _month))
    9. {
    10. _day -= GetMonthDay(_year, _month);
    11. ++_month;
    12. if (_month == 13)
    13. {
    14. _month = 1;
    15. _year++;
    16. }
    17. }
    18. return *this;
    19. }
    20. Date operator+(int day)
    21. {
    22. Date ret(*this);
    23. ret+=day;
    24. return ret;
    25. }

    3.-、-=(日期减天数或日期减日期)

    -:可以得到日期减一个天数后的日期,原日期不变(在-=实现后的基础上更容易实现,同+);也可以通过函数重载实现日期减日期,得到天数差。

    -=:得到日期减天数后的一个新日期。

    1. Date operator-(int day)//日期减天数
    2. {
    3. Date ret = *this;
    4. ret -= day;
    5. return ret;
    6. }
    7. int operator-(const Date& d)//日期减日期
    8. {
    9. int flag = 1;
    10. Date max = *this;
    11. Date min = d;
    12. if ((*this) < d)
    13. {
    14. max = d;
    15. min = *this;
    16. flag = -1;
    17. }
    18. int n = 0;
    19. while (min != max)
    20. {
    21. ++min;
    22. ++n;
    23. }
    24. return n;
    25. }
    26. // 日期-=天数
    27. Date& operator-=(int day)
    28. {
    29. if (day < 0)
    30. return *this += -day;
    31. _day -= day;
    32. while (_day <= 0)
    33. {
    34. _month--;
    35. if (_month <= 0)
    36. {
    37. --_year;
    38. _month = 12;
    39. }
    40. _day += GetMonthDay(_year, _month);
    41. }
    42. return *this;
    43. }

    4.前、后置++:

    前置++:返回的是++后的值,可以复用+=函数,逻辑是一样的。

    后置++:返回的是++前的值,不能传引用返回,为了和前置++赋值重载函数构成函数重载,需要加个int ,不需要传实参,因为没用,如果不加参数那么前置++和后置++函数就一样了,们在进行前置++或者后置++操作时,编译器就不知道调用哪一个了

    1. //前置++
    2. Date& operator++()
    3. {
    4. return *this += 1;
    5. }
    6. // 后置++
    7. Date operator++(int)
    8. {
    9. Date ret(*this);
    10. *this += 1;
    11. return ret;
    12. }

    5.前、后置--:

    原理和前后置++一样

    1. // 前置--
    2. Date& operator--()
    3. {
    4. return *this-=1;
    5. }
    6. //后置
    7. Date operator--(int)
    8. {
    9. Date ret(*this);
    10. *this -= 1;
    11. return ret;
    12. }

    6.日期的比较:

    日期的比较有>、<、==、>= 、<=、!=,几类基本比较,但其实只要实现>或<一种和==两种比较符,就可以在此基础上实现其他的比较符。

     >,==的实现:

    1. //>运算符重载
    2. bool operator>(const Date& d)
    3. {
    4. if ((_year > d._year)
    5. || (_year == d._year && _month > d._month)
    6. || (_year == d._year && _month == d._month && _day > d._day))
    7. return true;
    8. else
    9. return false;
    10. }
    11. // ==运算符重载
    12. bool operator==(const Date& d) {
    13. return _month == d._month && _year == d._year && _day == d._day;
    14. }

    在实现了>和==后,可利用这两种比较实现其他比较符:

    1. //>=
    2. bool operator>=(const Date& d)
    3. {
    4. return *this > d || *this == d;
    5. }
    6. //<
    7. bool operator<(const Date& d)
    8. {
    9. return !(*this > d);
    10. }
    11. //<=
    12. bool operator<=(const Date& d)
    13. {
    14. return !(*this > d) || *this == d;
    15. }
    16. bool operator!=(const Date& d) {
    17. return !((*this) == d);
    18. }

    7.CheckDate()、Print()(判断日期非法性和打印)

    1. bool CheckDate()
    2. {
    3. if (_year >= 1
    4. && _month > 0 && _month < 13 && _day>0 && _day <= GetMonthDay(_year, _month))
    5. {
    6. return true;
    7. }
    8. else
    9. return false;
    10. }
    11. void Print()
    12. {
    13. cout << _year << "/" << _month << "/" << _day << endl;
    14. }


    如上代码的实现算法应该都是很简单的,所以没有写注释,如果有什么没看懂的点欢迎提问!!!

    总代码:

    1. #include
    2. #include
    3. using namespace std;
    4. class Date
    5. {
    6. public:
    7. Date(int year = 1, int month = 1,int day = 1)
    8. {
    9. _year = year;
    10. _month = month;
    11. _day = day;
    12. if (!CheckDate())
    13. {
    14. Print();
    15. cout << "日期不合法" << endl;
    16. }
    17. }
    18. bool IsLeapyear(int year)
    19. {
    20. if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
    21. return true;
    22. else
    23. return false;
    24. }
    25. // 获取某年某月的天数
    26. int GetMonthDay(int year, int month)
    27. {
    28. static int days[13] = { 31,31,28,31,30,31,30,31,31,30,31,30,31 };
    29. if (month == 2 && IsLeapyear(year))
    30. {
    31. return 29;
    32. }
    33. else
    34. return days[month];
    35. }
    36. Date& operator+=(int day)
    37. {
    38. if (_day < 0)
    39. {
    40. return *this -= -day;
    41. }
    42. _day += day;
    43. while (_day > GetMonthDay(_year, _month))
    44. {
    45. _day -= GetMonthDay(_year, _month);
    46. ++_month;
    47. if (_month == 13)
    48. {
    49. _month = 1;
    50. _year++;
    51. }
    52. }
    53. return *this;
    54. }
    55. // 日期+天数
    56. Date operator+(int day)
    57. {
    58. Date ret(*this);
    59. ret._day += day;
    60. while (ret._day > GetMonthDay(ret._year, ret._month))
    61. {
    62. ret._day -= GetMonthDay(ret._year, ret._month);
    63. ++ret._month;
    64. if (ret._month == 13)
    65. {
    66. ret._month = 1;
    67. ret._year++;
    68. }
    69. }
    70. return ret;
    71. }
    72. // 日期-天数
    73. Date operator-(int day)
    74. {
    75. Date ret = *this;
    76. ret -= day;
    77. return ret;
    78. }
    79. //日期减日期
    80. int operator-(const Date& d)
    81. {
    82. int flag = 1;
    83. Date max = *this;
    84. Date min = d;
    85. if ((*this) < d)
    86. {
    87. max = d;
    88. min = *this;
    89. flag = -1;
    90. }
    91. int n = 0;
    92. while (min != max)
    93. {
    94. ++min;
    95. ++n;
    96. }
    97. return n;
    98. }
    99. // 日期-=天数
    100. Date& operator-=(int day)
    101. {
    102. if (day < 0)
    103. return *this += -day;
    104. _day -= day;
    105. while (_day <= 0)
    106. {
    107. _month--;
    108. if (_month <= 0)
    109. {
    110. --_year;
    111. _month = 12;
    112. }
    113. _day += GetMonthDay(_year, _month);
    114. }
    115. return *this;
    116. }
    117. // 前置++
    118. Date& operator++()
    119. {
    120. return *this += 1;
    121. }
    122. // 后置++
    123. Date operator++(int)
    124. {
    125. Date ret(*this);
    126. *this += 1;
    127. return ret;
    128. }
    129. // 后置--
    130. Date operator--(int)
    131. {
    132. Date ret(*this);
    133. *this -= 1;
    134. return ret;
    135. }
    136. // 前置--
    137. Date& operator--()
    138. {
    139. return *this-=1;
    140. }
    141. // >运算符重载
    142. bool operator>(const Date& d)
    143. {
    144. if ((_year > d._year)
    145. || (_year == d._year && _month > d._month)
    146. || (_year == d._year && _month == d._month && _day > d._day))
    147. return true;
    148. else
    149. return false;
    150. }
    151. // ==运算符重载
    152. bool operator==(const Date& d) {
    153. return _month == d._month && _year == d._year && _day == d._day;
    154. }
    155. //>=
    156. bool operator>=(const Date& d)
    157. {
    158. return *this > d || *this == d;
    159. }
    160. //<
    161. bool operator<(const Date& d)
    162. {
    163. return !(*this > d);
    164. }
    165. //<=
    166. bool operator<=(const Date& d)
    167. {
    168. return !(*this > d) || *this == d;
    169. }
    170. //检查日期合法性
    171. bool CheckDate()
    172. {
    173. if (_year >= 1
    174. && _month > 0 && _month < 13 && _day>0 && _day <= GetMonthDay(_year, _month))
    175. {
    176. return true;
    177. }
    178. else
    179. return false;
    180. }
    181. void Print()
    182. {
    183. cout << _year << "/" << _month << "/" << _day << endl;
    184. }
    185. private:
    186. int _year;
    187. int _month;
    188. int _day;
    189. };

  • 相关阅读:
    SEHLL常见逻辑运算符解析
    新手又该如何操作呢?操作时候注意哪些问题?
    基于springboot+layui仓库管理系统设计和实现
    【实战篇】Redis单线程架构的优势与不足
    Kubernetes(k8s)的流量负载组件Service的ClusterIP类型讲解与使用
    PDF怎么转换成PPT
    编译原理复习——语法分析(自顶向下)2
    公益校园网页制作 大学生网页设计作业 HTML CSS公益网页模板 大学生校园介绍网站毕业设计
    RabbitMQ部署指南
    iOS开发Swift-10-位置授权, cocoapods,API,天气获取,城市获取-和风天气App首页代码
  • 原文地址:https://blog.csdn.net/qzt__l0ve/article/details/127824751