程序因循环而冻结

Program gets frozen because of a loop

我正在制作一个程序,该程序通过为程序提供日期和天数来计算日期,以便在输入中添加到该日期。为此,我需要进行切换并使其循环重复,但由于某些原因,程序被冻结并且在用户插入要添加的天数后不执行任何操作。我试过删除循环并且程序有效。 期待有人能帮我解决这个问题。

这是获取要添加到循环末尾的天数的代码部分:

    cin>>addDays;
    
    while (addDays > 0) {
        switch (month) {
            
            //months with 31 days
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            {
                finalDay = day + addDays;
                if (finalDay > 31) {
                    addDays = finalDay - 31;
                    month++;
                    day = 1;
                }
                break;
            }
            
            //months with 30 days
            case 4:
            case 6:
            case 9:
            case 11:
            {
                finalDay = day + addDays;
                if (finalDay > 30) {
                    addDays = finalDay - 30;
                    month++;
                    day = 1;
                }
                break;
            }   
            
            //december
            case 12:
            {
                finalDay = day + addDays; //oggi è 10. Voglio aggiungere 30
                if (finalDay > 31) {       //40 è maggiore di 31
                    addDays = finalDay - 31;    //l'aggiunta 30 diventa 40 - 31 che fa 9
                    year++;
                    day = 1;
                    month = 1;
                }
                break;
            }
            
            //february
            case 2:
            {
                finalDay = day + addDays;
                if (year % 4 == 0) {
                    if (finalDay > 29) {
                        addDays = finalDay - 29;
                        month++;
                        day = 1;
                    }
                }
                else {
                    if (finalDay > 28) {
                        addDays = finalDay - 28;
                        month++;
                        day = 1;
                    }
                }
                break;
            }
        }
    }

你的循环运行直到 addDays 下降到 <= 0。问题是,当你将 addDays 添加到 day 时,如果结果 finalDay 在当前 month 的数量内天,你没有打破循环,你没有调整dayaddDays的值,所以循环再次迭代相同的 dayaddDays 值,计算相同的 finalDay 值,一遍又一遍,无休止。这就是您的程序出现冻结的原因。

修正后,您也没有考虑 addDays 可能跨越超过一个月的天数的可能性。用户可以要求一次添加超过 1 个月。因此,您需要每月更精细地调整 addDays

另外,当当前month2(二月)时,你的闰年计算不完整。被 4 整除并不是您需要检查以了解 year 是否为闰年的唯一规则。可以被 4100 整除但不能被 400 整除的 year 不是闰年。

话虽如此,请尝试更像这样的东西:

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

int lastDayInMonth(int year, int month)
{
    switch (month) {
            
        //months with 31 days
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
            
        //months with 30 days
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
            
        //month with 28 or 29 days
        case 2:
            return isLeapYear(year) ? 29 : 28;
    }

    return 0;
}
int year, month, day, addDays, lastDay;
...
cin >> addDays;
    
while (addDays > 0) {

    lastDay = lastDayInMonth(year, month);

    day += addDays;
    if (day <= lastDay) break;

    addDays -= (lastDay - day);

    if (++month == 13) {
        ++year;
        month = 1;
    }
    day = 1;
}

也就是说,看看 this answer,它将这种逻辑包装在一个名为 Date 的可重用 struct 中,它有一个重载的 operator+=添加天数。

非常感谢您的帮助!你让我明白错误在哪里。我已经修好了,现在可以正常使用了。但是因为我没有你那么有经验,而且我在阅读该代码时遇到了困难,所以我没有像你那样做,而是在 [=13= 中的每个 if 中添加了一个 else ],这会将 addDays 重置为 0,因为赋值语句会复制它们的值,它们不会移动它,出于某些原因我没有考虑这个愚蠢而基本的事情。

也感谢您让我注意到不完整的闰年算法。 这是固定代码。祝你有美好的一天!

cin>>addDays;
        
        while (addDays > 0) {
            switch (month) {
                
                //months with 31 days
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                {
                    finalDay = day + addDays;
                    if (finalDay > 31) {
                        addDays = finalDay - 31;
                        month++;
                        day = 0;
                    }
                    else {
                        addDays = 0;
                    }
                    break;
                }
                
                //months with 30 days
                case 4:
                case 6:
                case 9:
                case 11:
                {
                    finalDay = day + addDays;
                    if (finalDay > 30) {
                        addDays = finalDay - 30;
                        month++;
                        day = 0;
                    }
                    else {
                        addDays = 0;
                    }
                    break;
                }   
                
                //december
                case 12:
                {
                    finalDay = day + addDays; //oggi è 10. Voglio aggiungere 30
                    if (finalDay > 31) {       //40 è maggiore di 31
                        addDays = finalDay - 31;    //l'aggiunta 30 diventa 40 - 31 che fa 9
                        year++;
                        day = 0;
                        month = 1;
                    }
                    else {
                        addDays = 0;
                    }
                    break;
                }
                
                //february
                case 2:
                {
                    finalDay = day + addDays;
                    if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) {
                        if (finalDay > 29) {
                            addDays = finalDay - 29;
                            month++;
                            day = 0;
                        }
                        else {
                            addDays = 0;
                        }
                        
                    }
                    else {
                        if (finalDay > 28) {
                            addDays = finalDay - 28;
                            month++;
                            day = 0;
                        }
                        else {
                            addDays = 0;
                        }
                    }
                    break;
                }
            }
        }