0

我需要为接受日期的程序创建一个方法,如果有效,将添加从 01/01/xx 到当年日期的所有天数,例如 10/1/1999 将显示“1999 年第 274 天”。我在下面有以下代码,但它没有添加正确的值。不知道我做错了什么。

    public static int dayNumber(int day, int month, int year){  
      int daysInMonth = 0;  
      int days = 0;  
      boolean leapYear = isLeapYear(year);  
        for(int i = 1; i <= month; i++){  
            switch(month){  
                case 1: daysInMonth += 31;  
                case 2: if(leapYear)  
                     daysInMonth += 29;  
                    else  
                     daysInMonth += 28;  
                case 3: daysInMonth += 31;  
                case 4: daysInMonth += 30;  
                case 5: daysInMonth += 31;  
                case 6: daysInMonth += 30;  
                case 7: daysInMonth += 31;  
                case 8: daysInMonth += 31;  
                case 9: daysInMonth += 30;  
                case 10: daysInMonth += 31;  
                case 11: daysInMonth += 30;  
                case 12: daysInMonth += 31;  
                break;  
            default:  
            break;  
         }  
         while(month <= 12){  
            days += daysInMonth + day;  
            month++;  
         }  
        }  
        return days;  
    }  
4

2 回答 2

3

您需要使用以下命令终止case每个break

            case 1: daysInMonth += 31;  
                    break;
            case 2: if(leapYear)  
                      daysInMonth += 29;  
                    else  
                      daysInMonth += 28;  
                    break;
            case 3: daysInMonth += 31;  
                    break;

等等。

没有这个,语句switch就会失败

此外,您的循环变量是i并且您打开month(但随后month在另一个嵌套循环中进行修改)。

于 2013-11-01T20:53:44.180 回答
0

这里真的不需要循环......这应该可以解决问题:

days = day
days += (month-1)*30;
days += (month)/2; // every odd month until July has 31 days
days += (month >= 8 && month % 2 == 1) ? 1 : 0;   // so if we have august or later and in an even month, add 1 day
if (month > 2) {
    days -= (isLeapYear(year)) ? 1 : 2;
}

只需阅读您对学校练习的评论,因此我会更好地解释我的代码。

首先,我们假设每个月只有 30 天。

这当然是不正确的——从一月开始,每隔一个月就有 31 天。所以我们正在计算到目前为止有多少个月有 31 天。由于它是具有 31 天的奇数月份(至少到 8 月),我们将月份除以 2(请记住 - 整数除法,我们将得到 floor(month/2))以获得具有过了31天。

这仍然是不正确的,因为从 8 月开始,我们还有一天要添加 - 我们之前的计算结果是一个月,比实际少了 31 天。因此,如果经过偶数个月,我们只需添加一天(我们可以通过将月份除以 2 并查看剩余部分来判断这一点,这称为“模除法”并写为“月 % 2”)。

最后,我们要去二月。如果二月已经过去(=我们在三月或更晚),我们只需减去两天 - 如果是闰年,则减去一天。我在这里使用了所谓的“三元语句”(......?......:......东西)。基本上是缩写if (isLeapYear(year)) { days -= 1; } else { days -= 2; }

于 2013-11-01T21:04:15.307 回答