c++ - 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;
}
解决方案
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;
}
并不是说这会修复每个错误(我还没有检查过),但请注意改进,我已重命名getDifference
为getTotalDays
,现在它被调用了两次,结果被减去。我还从and中删除了other
参数。这些方法现在对当前对象而不是参数进行操作。getTotalDays
getLeapYears
this
似乎是从operator-
(在两个日期运行)到getTotalDays
和getLeapYears
(仅在一个日期运行)的转换让你感到困惑。
推荐阅读
- javascript - TypeScript/Electron.js 中的导入问题
- db2 - 带有 db2 事务隔离的 ebean=none 被忽略
- ansible - 使用 ansible 解析 api 返回
- javascript - jQuery表单提交未触发
- selenium - 如何使用逻辑应用启动运行 Selenium Web 驱动程序的控制台应用?
- javascript - 考虑到时间和空间复杂性,对数组进行排序的最佳方法是什么?
- javascript - 如何使用循环将对象合并到 Javasript 中的数组中
- google-apps-script - 在应用程序脚本中使用 github 存储库
- apache-spark - 在处理第一个 hdfs 流文件后停止 Spark Streaming
- python - 在 Python 中执行 SQL Server 查询