计算日期时结果总是不准确。这是什么原因?

include "iostream"
using namespace std;
int main()
{
    int year, month, day;
    int days;
    int sum;
    cout << "请输入年:";
    cin >> year;
    cout << "请输入月:";
    cin >> month;
    cout << "请输入日:";
    cin >> day;
    cout << "请输入日期";
    cin >> days;
    switch(month)
    { 
        case 1:
        sum = 0;
        break;
        case 2:
        sum = 31;
        break;
        case 3:
        sum = 59;
        break;
        case 4:
        sum = 90;
        break;
        case 5:
        sum = 120;
        break;
        case 6:
        sum = 151;
        break;
        case 7:
        sum = 181;
        break;
        case 8:
        sum = 212;
        break;
        case 9:
        sum = 243;
        break;
        case 10:
        sum = 273;
        break;
        case 11:
        sum = 304;
        break;
        case 12:
        sum = 334;
        break;
        default:
        cout << "你输入的月份有误。";
        break;
    }
    sum += day - 1;
    //减1的目的是为了保证当sum值为0时,year仍为当年
    if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
        {
            if (month > 2)
            sum++;
            //如果该年为闰年,且月份大于2月,那么sum值加1
        }
    days -= sum;
    //将天数减去sum的值
    while (days > 365)
    //如果天数大于365
    {
        if ((year - 1) % 400 == 0 || (year - 1) % 100 != 0 && (yea r- 1) % 4 == 0)
        //如果该年减1后的年为闰年
        {
            days -= 366;
            //天数减366
        }
        else
        {
            days -= 365;
            //否则天数减365
        }
        year -= 1;
        //年份随之减1
    }
    while (365 >= days > 0)
    //当天数不大于365且大于0时
    {
        days -= 1;
        day -= 1;
        //天数减1,日随之减1
        if (day == 0)
        //如果日为0
        {
            if (month == 1)
            //如果月为1
            {
                month = 12;
                day = 31;
                year -= 1;
                //月份更改为12,日更改为31,年减1
            }
            else if (month == 5 || month == 7 || month == 10 || month == 12)
            //如果月为5,7,10,12
            {
                day = 30;
                month -= 1;
                //天数更改为30,月减1
            }
            else if ( month == 2 || month == 4 || month == 6 || month == 8 || month == 9 || month == 11)
            //如果月为2,4,6,8,9,11
            {
                day = 31;
                month -= 1;
                //天数更改为31,月减1
            }
            else if (month == 3)
            //如果月为3
            {
                if (year % 400 == 0 || year % 100 != 0 && year % 4 == 0)
                //如果当年为闰年
                {
                    day = 29;
                    month -= 1;
                    //天数更改为29,月减1
                }
                else
                {
                    day = 28;
                    month -= 1;
                    //否则天数更改为28,月减1
                }
            }
            else
            //如果月不是以上的值
                cout << "此月份不存在。";
        }
    }
    cout << "计算得到的日期是" << year << "年" << month << "月" << day << "日";
    return 0;
}

这段代码的目的大致如下:

输入年、月、日后,输入一个天数(大于0),计算该日期指定天数之前的日期。

例如:依次输入2032、9、25、1836,计算2032年9月25日的1836天之前的日期。

具体过程,请参考注释。

但是在测试过程中,总是出现年为负数,月和日也不正确的结果。这是什么原因?

玄天
浏览 1249回答 2
2回答

JustWannaHugU

设置断点调试一下吧,更清晰一点。现在我手里没电脑

慕名不来

第85行: while (365 >= days > 0) 这个条件表达式写错了,没仔细看逻辑,你自己再检查下吧。建议可以写个借口函数,由天数推日期,由日期推天数。你这样反着来好绕啊
打开App,查看更多内容
随时随地看视频慕课网APP