首页 > 解决方案 > c++ 两个给定日期之间的天数

问题描述

所以我一直在为这个作业苦苦挣扎......这仍然不起作用,老师的评论是我必须更改代码并添加 set/get 运算符......我自己尝试过,它只会变得更糟. 程序只允许用户插入第一个日期,输出完全错误。我应该从哪里开始修复它?

#include <cmath>

using namespace std;

class Date
{
   private:
   int m;
   int d;
   int y;

   public:
   Date(int, int, int);
   int getLeapYears(Date&);
   int getDifference(Date&);
   int operator-(Date&);
 };

  int main()
  {
   int day, month, year;
   char c;

   cout << "Enter a start date (m/d/y): " << endl;
   cin >> month >> c >> day >> c >> year;

   Date start = Date(month, day, year);

   cout << "Enter an end date (m/d/y): " << endl;
   cin >> month >> c >> day >> c >> year;

   Date end = Date(month, day, year);
   int duration = end-start;

    cout << "The number of days between those two dates are: " <<
    duration << endl;

    return 0;
  }


   Date::Date(int a, int b, int c)
   {
   m = a;
   d = b;
   y = c;
   }

   const int monthDays[13] = {0,31,28,31,30,31,30,31,31,31,31,30,31};

  int Date::getLeapYears(Date& d)
  {
     int years = d.y;
     if (d.m <= 2)
     years--;
     return years / 4 - years / 100 + years / 400;
   }

  int Date::getDifference(Date& other)
  {

     int n1 = other.y*365 + other.d;

     for (int i=0; i<other.m - 1; i++)
    {
      n1 += monthDays[i];
      n1 += getLeapYears(other);
     }

     return n1;
     }

  int Date::operator-(Date& d) {
     int difference = getDifference(d);
     return difference;
   }

标签: c++

解决方案


getDifference计算自 0 年以来的天数。显然,如果您有两个日期,则可以计算每个日期自 0 年以来的总天数,然后减去这两个总数,即日期之间的天数。我相信你知道这一点。

现在问自己以下问题。

你打了多少次电话getDifference?显然,每个日期都需要调用它,但会发生这种情况吗?

如上所述,您在代码中的何处执行两天总数的减法?

计算自第 0 年以来的天数的函数是getDifference一个好名字吗?(或其他)不会getTotalDays更好吗?

您显然已经将自己与自己的代码混淆了,它没有按照您的意愿去做。花时间为您的函数选择有意义的名称是一种重要的方式,不要让自己对自己的代码感到困惑。

这是我建议的重写

int Date::getLeapYears()
{
     int years = y;
     if (m <= 2)
         years--;
     return years / 4 - years / 100 + years / 400;
}

int Date::getTotalDays()
{
     int n1 = y*365 + d;
     for (int i=0; i<m - 1; i++)
     {
         n1 += monthDays[i];
         n1 += getLeapYears();
     }
     return n1;
}

int Date::operator-(Date& d) {
    int difference = getTotalDays() - d.getTotalDays();
    return difference;
}

并不是说这会修复每个错误(我还没有检查过),但请注意改进,我已重命名getDifferencegetTotalDays,现在它被调用了两次,结果被减去。我还从and中删除了other参数。这些方法现在对当前对象而不是参数进行操作。getTotalDaysgetLeapYearsthis

似乎是从operator-(在两个日期运行)到getTotalDaysgetLeapYears(仅在一个日期运行)的转换让你感到困惑。


推荐阅读