当前位置:   article > 正文

C++第四篇 一篇文章学完C++所有的日期类函数

C++第四篇 一篇文章学完C++所有的日期类函数

目录

1.data.h文件

1.1已知年月获取天数函数 int getday(int year, int month) const

2.函数的实现

2.1构造函数

2.2检查日期合法函数

2.3日期类重载小于号(<)

2.4日期类重载等于号(==)

2.5日期类重载小于等于号(<=)

2.6日期类重载大于号(>)

2.7重载大于等于号(>=)

2.8重载不等于号(!=)

2.9重载加等于号(+=)

2.10重载减等于号(-=)

2.11重载加号(+)(日期+天数)

2.12重载减号(-)(日期-天数)

2.13重载后置加加(后置++)

2.14重载前置加加(++前置)

2.15重载后置减减(后置--)

2.16重载前置减减(--前置)

2.17重载减号(-)(日期-日期)

2.18重载<<号

2.19重载>>号

2.10 data.cpp源码


        主要实现了对日期的操作,包括日期的比较,日期-日期,日期+天数,日期++,++日期,日期,--日期,以及对日期中>> 和 << 的重载。

1.data.h文件

采用了声明与定义分离。

  1. #pragma once
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<assert.h>
  5. using namespace std;
  6. class Data {
  7. //友元函数声明
  8. friend ostream& operator<<(ostream& out, const Data& d);
  9. friend istream& operator>>(istream& in, Data& d);
  10. public:
  11. Data(int year = 1900, int month = 1, int day = 1);//构造函数
  12. bool CheckDate()const;
  13. void Print()const;
  14. int getday(int year, int month) const
  15. {
  16. assert(month > 0 && month < 13);
  17. static int monthDayArray[13] = { -1, 31, 28, 31, 30, 31, 30,
  18. 31, 31, 30, 31, 30, 31 };
  19. if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
  20. {
  21. return 29;
  22. }
  23. return monthDayArray[month];
  24. }
  25. bool operator<(const Data& d) const;
  26. bool operator<=(const Data& d) const;
  27. bool operator>(const Data& d) const;
  28. bool operator>=(const Data& d) const;
  29. bool operator==(const Data& d) const;
  30. bool operator!=(const Data& d) const;
  31. Data operator+(int day) const;
  32. Data& operator+=(int day);
  33. Data operator-(int day) const;
  34. Data& operator-=(int day);
  35. Data operator++(int);
  36. Data& operator++();
  37. Data operator--(int);
  38. Data& operator--();
  39. int operator-(const Data& d) const;
  40. private:
  41. int _year;
  42. int _month;
  43. int _day;
  44. };
  45. ostream& operator<<(ostream& out, const Data& d);
  46. istream& operator>>(istream& in, Data& d);

1.1已知年月获取天数函数 int getday(int year, int month) const

  1. int getday(int year, int month) const
  2. {
  3. assert(month > 0 && month < 13);
  4. static int monthDayArray[13] = { -1, 31, 28, 31, 30, 31, 30,
  5. 31, 31, 30, 31, 30, 31 };
  6. if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
  7. {
  8. return 29;
  9. }
  10. return monthDayArray[month];
  11. }

(1).我们直接将数组下标1到12设置为每月的天数,特判当时2月且时闰年时,我们返回29即可。

2.函数的实现

2.1构造函数

  1. Data::Data(int year, int month, int day) {
  2. _year = year;
  3. _month = month;
  4. _day = day;
  5. if (!CheckDate())
  6. {
  7. cout << "非法日期:";
  8. Print();
  9. }
  10. }

(1).简单的构造函数的实现,要判断一下当前日期是否合法。

2.2检查日期合法函数

  1. bool Data::CheckDate()const
  2. {
  3. if (_month <= 0 || _month > 12 || _day<1 || _day>getday(_year, _month)) {
  4. return false;
  5. }
  6. return true;
  7. }

(1).当月小于等于0,或者月大于12,或者天小于1,或者天大于该月的总天数,则返回fallse,其余情况返回true。

2.3日期类重载小于号(<)

  1. bool Data::operator<(const Data& d) const
  2. {
  3. if (_year < d._year)
  4. {
  5. return true;
  6. }
  7. else if (_year == d._year)
  8. {
  9. if (_month < d._month)
  10. {
  11. return true;
  12. }
  13. else if (_month == d._month)
  14. {
  15. return _day < d._day;
  16. }
  17. }
  18. return false;
  19. }

(1).先判断年,若年小于则返回true即可,如果等于时,在判断月,如果月小于,则返回true,若月等于时,则判断天,直接判断 _day < d._day 是否成立即可。最后返回false。

2.4日期类重载等于号(==)

  1. bool Data::operator==(const Data& d) const
  2. {
  3. return _year == d._year && _month == d._month && _day == d._day;
  4. }

(1).直接判断 _year == d._year && _month == d._month && _day == d._day 是否成立即可。

2.5日期类重载小于等于号(<=)

  1. bool Data::operator<=(const Data& d) const
  2. {
  3. return *this < d || *this == d;
  4. }

(1).由于我们之前以及重载<以及==号,所以我们直接利用即可,当<成立或者==成立时,返回true。

2.6日期类重载大于号(>)

  1. bool Data::operator>(const Data& d) const
  2. {
  3. return !(*this <= d);
  4. }

(1).我们之前重载了<=号,所以我们直接!(*this <= d)即可。

2.7重载大于等于号(>=)

  1. bool Data::operator>=(const Data& d) const {
  2. return *this > d || *this == d;
  3. }

(1).我们之前重载了>号和==号,如果>号成立或者==号成立,则返回true。

2.8重载不等于号(!=)

  1. bool Data::operator!=(const Data& d) const
  2. {
  3. return !(*this == d);
  4. }

(1).已经实现了重载等于号(==),直接判断 !(*this == d) 即可。

2.9重载加等于号(+=)

  1. Data& Data::operator+=(int day) {
  2. if (day < 0) {
  3. return *this -= (-day);
  4. }
  5. _day += day;
  6. while (_day > Data::getday(_year, _month))
  7. {
  8. _day -= getday(_year, _month);
  9. _month++;
  10. if (_month > 12) {
  11. _month = 1;
  12. _year++;
  13. }
  14. }
  15. return *this;
  16. }

(1).首先要判断day是否为负,日期+(负数)相当于日期-天数,如果day小于0,则我们利用减等于号(-=)。

(2).首先让当前天数加上day,然后循环判断_day是否大于当前月的总天数,如果大于就先减去当前月的总天数,然后将月加一,要特判月大于12时,月要归1,年要加一。

(3).最后返回当前*this指针,因为是+=,是对自身加。

2.10重载减等于号(-=)

  1. Data& Data::operator-=(int day) {
  2. if (day < 0) {
  3. return *this += (-day);
  4. }
  5. _day -= day;
  6. while (_day <= 0) {
  7. _month--;
  8. if (_month == 0) {
  9. _month = 12;
  10. _year--;
  11. }
  12. _day += getday(_year, _month);
  13. }
  14. return *this;
  15. }

(1).首先要判断day是否为负,日期-(负数)相当于日期+天数,如果day小于0,则我们利用加等于号(+=)。

(2).首先让当前天数减去day,然后循环判断_day是否小于等于0,如果小于等于0就先将月减一,然后加上当前月的总天数,要特判月等于0时,月要置为12,年要减一。

(3).最后返回当前*this指针,因为是-=,是对自身减。

2.11重载加号(+)(日期+天数)

  1. Data Data::operator+(int day) const {
  2. Data temp = *this;
  3. temp += day;
  4. return temp;
  5. }

(1).因为是+号,并不是+=,没有对自身加,所以我们创建一个Data类,复制*this,然后我们使用重载+=,对temp自身加,然后返回temp即可。

2.12重载减号(-)(日期-天数)

  1. Data Data:: operator-(int day) const
  2. {
  3. Data temp = *this;
  4. temp -= day;
  5. return temp;
  6. }

(1).因为是-号,并不是-=,没有对自身减,所以我们创建一个Data类,复制*this,然后我们使用重载-=,对temp自身减,然后返回temp即可。

2.13重载后置加加(后置++)

  1. Data Data::operator++(int)
  2. {
  3. Data temp = *this;
  4. temp += 1;
  5. return temp;
  6. }

(1).后置++和前置++的区别为,在传参时,后置++要加上一个int。

(2).因为是后置++,所以是后赋值,我们创建一个Data类,对这个类+=1即可,最后返回temp。

2.14重载前置加加(++前置)

  1. Data& Data::operator++()
  2. {
  3. *this += 1;
  4. return *this;
  5. }

 (1).因为是前置加加,所以是先自加然后再赋值,就要先改变自身,所以直接对*this+=1即可。

2.15重载后置减减(后置--)

  1. Data Data:: operator--(int)
  2. {
  3. Data temp = *this;
  4. temp -= 1;
  5. return temp;
  6. }

(1).后置--和前置--的区别为,在传参时,后置--要加上一个int。

(2).因为是后置--,所以是后赋值,我们创建一个Data类,对这个类-=1即可,最后返回temp。

2.16重载前置减减(--前置)

  1. Data& Data::operator--()
  2. {
  3. *this -= 1;
  4. return *this;
  5. }

 (1).因为是前置减减,所以是先自减然后再赋值,就要先改变自身,所以直接对*this-=1即可。

2.17重载减号(-)(日期-日期)

  1. int Data::operator-(const Data& d) const {
  2. int ans = 0;
  3. Data temp1 = *this;
  4. Data temp2 = d;
  5. if (temp2 > temp1) {
  6. swap(temp2, temp1);
  7. }
  8. while (temp1 != temp2) {
  9. temp2 += 1;
  10. ans++;
  11. }
  12. return ans;
  13. }

(1).我们创建两个Data类,一个存储 *this ,另一个存储d,并且判断那个那个小,把小的交换到temp2,然后循环判断temp1是否不等于temp2,若不等于就ans++,并且将temp2+=1,直到temp1和temp2相等。最后返回ans,即是两日期相差天数。

2.18重载<<号

  1. ostream& operator<<(ostream& out, const Data& d)
  2. {
  3. out << d._year << '/' << d._month << '/' << d._day << endl;
  4. return out;
  5. }

(1).输出年月日,最后要返回out,因为如果要考虑到连续输出的情况,cout<<d1<<d2<<d3。

2.19重载>>号

  1. istream& operator>>(istream& in, Data& d) {
  2. while (1)
  3. {
  4. in >> d._year >> d._month >> d._day;
  5. if (!d.CheckDate())
  6. {
  7. cout << "输入日期非法:";
  8. d.Print();
  9. cout << "请重新输入!!!" << endl;
  10. }
  11. else
  12. {
  13. break;
  14. }
  15. }
  16. return in;
  17. }

(1).输入年月日,然后判断是否合法,如果合法就退出循环,否则一直重新输入。

(2).最后也是要返回in,因为要考虑到连续输入的情况,cin>>d1>>d2>>d3。

2.10 data.cpp源码

  1. #include"data.h"
  2. bool Data::operator<(const Data& d) const
  3. {
  4. if (_year < d._year)
  5. {
  6. return true;
  7. }
  8. else if (_year == d._year)
  9. {
  10. if (_month < d._year)
  11. {
  12. return true;
  13. }
  14. else if (_month == d._month)
  15. {
  16. return _day < d._day;
  17. }
  18. }
  19. return false;
  20. }
  21. bool Data::operator==(const Data& d) const
  22. {
  23. return _year == d._year && _month == d._month && _day == d._day;
  24. }
  25. bool Data::operator<=(const Data& d) const
  26. {
  27. return *this < d || *this == d;
  28. }
  29. bool Data::operator>(const Data& d) const
  30. {
  31. return !(*this <= d);
  32. }
  33. bool Data::operator>=(const Data& d) const {
  34. return *this > d || *this == d;
  35. }
  36. bool Data::operator!=(const Data& d) const
  37. {
  38. return !(*this == d);
  39. }
  40. Data Data::operator+(int day) const {
  41. Data temp = *this;
  42. temp += day;
  43. return temp;
  44. }
  45. Data& Data::operator+=(int day) {
  46. if (day < 0) {
  47. return *this -= (-day);
  48. }
  49. _day += day;
  50. while (_day > Data::getday(_year, _month))
  51. {
  52. _day -= getday(_year, _month);
  53. _month++;
  54. if (_month > 12) {
  55. _month = 1;
  56. _year++;
  57. }
  58. }
  59. return *this;
  60. }
  61. Data Data:: operator-(int day) const
  62. {
  63. Data temp = *this;
  64. temp -= day;
  65. return temp;
  66. }
  67. Data& Data::operator-=(int day) {
  68. if (day < 0) {
  69. return *this += (-day);
  70. }
  71. _day -= day;
  72. while (_day <= 0) {
  73. _month--;
  74. if (_month == 0) {
  75. _month = 12;
  76. _year--;
  77. }
  78. _day += getday(_year, _month);
  79. }
  80. return *this;
  81. }
  82. Data Data::operator++(int)
  83. {
  84. Data temp = *this;
  85. temp += 1;
  86. return temp;
  87. }
  88. Data& Data::operator++()
  89. {
  90. *this += 1;
  91. return *this;
  92. }
  93. Data Data:: operator--(int)
  94. {
  95. Data temp = *this;
  96. temp -= 1;
  97. return temp;
  98. }
  99. Data& Data::operator--()
  100. {
  101. *this -= 1;
  102. return *this;
  103. }
  104. int Data::operator-(const Data& d) const {
  105. int ans = 0;
  106. Data temp1 = *this;
  107. Data temp2 = d;
  108. if (temp2 > temp1) {
  109. swap(temp2, temp1);
  110. }
  111. while (temp1 != temp2) {
  112. temp2 += 1;
  113. ans++;
  114. }
  115. return ans;
  116. }
  117. ostream& operator<<(ostream& out, const Data& d)
  118. {
  119. out << d._year << '/' << d._month << '/' << d._day << endl;
  120. return out;
  121. }
  122. istream& operator>>(istream& in, Data& d) {
  123. while (1)
  124. {
  125. in >> d._year >> d._month >> d._day;
  126. if (!d.CheckDate())
  127. {
  128. cout << "输入日期非法:";
  129. d.Print();
  130. cout << "请重新输入!!!" << endl;
  131. }
  132. else
  133. {
  134. break;
  135. }
  136. }
  137. return in;
  138. }
  139. bool Data::CheckDate()const
  140. {
  141. if (_month <= 0 || _month > 12 || _day<1 || _day>getday(_year, _month)) {
  142. return false;
  143. }
  144. return true;
  145. }
  146. void Data::Print()const {
  147. cout << _year << '/' << _month << '/' << _day << endl;
  148. }
  149. Data::Data(int year, int month, int day) {
  150. _year = year;
  151. _month = month;
  152. _day = day;
  153. if (!CheckDate())
  154. {
  155. cout << "非法日期:";
  156. Print();
  157. }
  158. }


本篇完

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/920200
推荐阅读
相关标签
  

闽ICP备14008679号