C++给定一个日期, 计算n天之后的日期

不念不忘少年蓝@ 2024-04-17 23:20 144阅读 0赞

设计一个日期类,包含以下功能:
1、只能通过传入年月日初始化。
2、可以加上一个数字n,返回一个该日期后推n天之后的日期。

值得注意的是, 闰年并不是4年一闰, 我们通常习惯理解为4年一闰
闰年判断条件 (year % 400 == 0 || (year % 4 == 0 && year % 100)), 可以看到, 当年份是4的倍数, 但可以被100整除, 且不能被400整除时, 并不是闰年, 例如2096年是闰年, 按习惯2100年是闰年, 但2100年不能满足判断条件,不是闰年,下一个闰年是2104, 相隔8年, 还可以发现 2100,2200,2300,2500,2600,2700,2900等等都不是闰年, 遇到这种年份前后闰年相隔8年

Date.h

  1. #pragma once
  2. #include<iostream>
  3. using namespace std;
  4. class Date {
  5. static int m_s_month[12];
  6. int m_year;
  7. int m_month;
  8. int m_day;
  9. public:
  10. Date(int y = 0, int m = 0, int d = 0) {
  11. m_year = y;
  12. m_month = m;
  13. m_day = d;
  14. }
  15. friend ostream& operator<<(ostream& os, Date& a);
  16. friend istream& operator>>(istream& os, Date& a);
  17. static int getMonthDay(int y, size_t n);//返回y年n月的天数
  18. bool LeapYear(int year)const;
  19. int countLeapYear(int year)const;
  20. Date operator+(size_t n)const;
  21. };

Date.cpp

  1. #include "Date.h"
  2. int Date::m_s_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  3. int Date::getMonthDay(int y, size_t n) {
  4. return m_s_month[n - 1] + (n == 2 && (y % 400 == 0 || (y % 4 == 0 && y % 100)));
  5. }
  6. bool Date::LeapYear(int y)const {
  7. return y % 400 == 0 || (y % 4 == 0 && y % 100 != 0);
  8. }
  9. ostream& operator<<(ostream& os, Date& a) {
  10. os << a.m_year << "年" << a.m_month << "月" << a.m_day << "日";
  11. return os;
  12. }
  13. istream& operator>>(istream& os, Date& t) {
  14. printf("请输入年份\n");
  15. while (1) {
  16. os >> t.m_year;
  17. if (t.m_year >= 0) {
  18. break;
  19. }
  20. cout << "年份必须非负,请重新输入年份\n";
  21. }
  22. cout << "请输入月份\n";
  23. while (1) {
  24. os >> t.m_month;
  25. if (t.m_month < 1) {
  26. cout << "月份必须大于0, 请重新输入\n";
  27. continue;
  28. }
  29. if (t.m_month > 12) {
  30. cout << "月份必须小于等于12, 请重新输入\n";
  31. continue;
  32. }
  33. break;
  34. }
  35. cout << "请输入日\n";
  36. while (1) {
  37. os >> t.m_day;
  38. if (t.m_day < 1) {
  39. cout << "请输入大于0的天数\n";
  40. continue;
  41. }
  42. if (t.m_day > Date::getMonthDay(t.m_year, t.m_month)) {
  43. cout << "你输入的号数大于本月天数" << Date::getMonthDay(t.m_year, t.m_month) << "请重新输入\n";
  44. continue;
  45. }
  46. break;
  47. }
  48. return os;
  49. }
  50. int Date::countLeapYear(int year)const {
  51. if (m_year == year) {
  52. return LeapYear(year);
  53. }
  54. int begin = m_year;
  55. int end = year - 1;
  56. if (m_year > year) {
  57. begin = year;
  58. end = m_year - 1;
  59. }
  60. while (!(LeapYear(begin))) {
  61. ++begin;
  62. }
  63. while (!(LeapYear(end))) {
  64. --end;
  65. }
  66. int tmp = begin;
  67. int count = 0;
  68. if (begin <= end) {
  69. while (tmp <= end && tmp % 100) {
  70. ++tmp;;
  71. }
  72. for (; tmp <= end; !LeapYear(tmp) ? ++count : count, tmp += 100);
  73. return (end - begin) / 4 + 1 - count;
  74. }
  75. return 0;
  76. }
  77. Date Date::operator+(size_t n)const {
  78. Date tmp = *this;
  79. size_t count = 0;
  80. for (int i = 1; i < (int)tmp.m_month; ++i) {
  81. count += getMonthDay(tmp.m_year, i);
  82. }
  83. count += tmp.m_day;
  84. if (n >= (365 + LeapYear(tmp.m_year) - count)) {
  85. n -= (365 + LeapYear(tmp.m_year) - count);
  86. tmp.m_month = 12;
  87. tmp.m_day = 31;
  88. while ((int)n >= (365 + LeapYear(tmp.m_year + 1))) {
  89. n -= (365 + LeapYear(++tmp.m_year));
  90. }
  91. }
  92. for (; n > 0; --n) {
  93. if (tmp.m_day == getMonthDay(tmp.m_year, tmp.m_month)) {
  94. tmp.m_day = 1;
  95. tmp.m_month == 12 ? tmp.m_month = 1, ++tmp.m_year : ++tmp.m_month;
  96. }
  97. else {
  98. ++tmp.m_day;
  99. }
  100. }
  101. return tmp;
  102. }

main.cpp

  1. #include"Date.h"
  2. int main() {
  3. int n;
  4. Date a, b;
  5. cout << "请输入日期\n";
  6. cin >> a;
  7. cout << "你想知道多少天后的日期,请输入\n";
  8. cin >> n;
  9. b = a + n;
  10. cout << a << endl;
  11. cout << "在" << n << "天后是";
  12. cout << b << endl;
  13. system("pause");
  14. return 0;
  15. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDcxMDY4_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,144人围观)

还没有评论,来说两句吧...

相关阅读