【问题标题】:Why is my code adding 93 days to the output?为什么我的代码在输出中添加了 93 天?
【发布时间】:2020-02-25 04:12:54
【问题描述】:

我有一个 c++ 作业,要求输入一个日期和第二个日期,并找出两者之间的天数,包括闰年。我的代码显示两个日期的正确值,但是在测试 1/2/3 到 3/21/12345 时,它显示 4507994,比正确值 4507901 多 93 天。为什么会发生这种情况?我包括 cstdlib 和 iostream

using namespace std;

bool isLeapYear (int year)
{
  bool tf;
if (year%4 !=0)
{
    tf = true;
}

else if (year%4 == 0)
{
   if (year%1000 == 0)
   {
        if (year %400 == 0)
        {
            tf = false;
        }
        else
        {
            tf = true;
        }
    }
    tf = false;
}
return tf;
}

int last_day(int month, int year)
{
int lday;
if (month == 2)
{
    if (isLeapYear (year) == false)
    {
        lday = 29;
    }
    else
    {
        lday = 28;
    }
}
else if (month == 1 || month == 3 || month == 5 || month ==  7 || month == 8|| month == 10 || month ==12)
{
    lday = 31;
}
else if (month == 4 || month == 6 || month == 9 || month == 11)
{
    lday = 30;
}
return lday;
}

void howlongwait (int &month, int &day, int &year)
{

if (day == last_day(month, year))
{
    if (month == 12 && day == 31)
    {
        month = 1;
        day = 1;
        year = year+1;
    }
    else
    {
        month = month+1;
        day = 1;
        year = year;
     }
  }
    else
    {
    month = month;
    day = day+1;
    year = year;
    }
}


int main()
{
 int month, month2, day2, day, year, year2;
 int days = 0;
 char trash, garb, garb2, trash2;
 cout << "Enter start date (no spaces): " << endl;
 cin >> month >> trash >> day >> garb >> year;
 cout << "Enter end date (no spaces): " << endl;
 cin >> month2 >> trash2 >> day2 >> garb2 >> year2;
 if (year2 < year)
{
    cout << "Never..." << endl;
    return 0;
}
else
{
   while ((month != month2) || (day != day2) || (year != year2))
    {
        howlongwait (month, day, year);
        days=days+1;
    }
}
 cout << "You have to wait " << days << " days" << endl;
}

`

【问题讨论】:

  • 您在isLeapYear 中缺少else...并且(不相关)您的命名是倒退的,因为“isLeapYear”在闰年时返回false。
  • 解决此问题的一种方法是缩小输入范围,直到找到问题为止。将天数减半,然后重试。用一半重复此操作,结果不正确,直到找到出现问题的确切日期。对于 450 万的起始范围,这只需要大约 20 次重复。一旦你有一个确切的日期要注意,你可以检查每一行代码,因为它处理该日期,看看哪一行导致它出错。

标签: c++ function loops date leap-year


【解决方案1】:

isLeapYear 应该这样修复:

bool isLeapYear (int y)
{
    return y%4 == 0 && (y%400 == 0 || y%100 != 0);
}

请将isLeapYear (year) == false 替换为isLeapYear (year) == true


您的isLeapYear 版本是:

  • year%1000 == 0 应该是 year%100 == 0
  • 缺少对应的else
  • 翻转truefalse,或根据需要更改函数名称

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多