0

日付を受け入れるプログラムのメソッドを作成する必要があり、有効な場合は 01/01/xx からその年の日付までのすべての日を追加します。以下のコードがありますが、正しい値が追加されていません。私が間違っているのかわかりません。

    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 日しかないと仮定します。

もちろん、これは正しくありません。1 月から始まる 2 か月ごとに 31 日あります。したがって、これまでに 31 日ある月が何月あるかを計算しています。奇数月 (少なくとも 8 月まで) で 31 日あるので、その月を 2 で割ります (覚えておいてください - 整数の割り算、floor(month/2) を取得します)。合格し、31日ありました。

これはまだ正しくありません。8 月からもう 1 日追加する必要があります。以前の計算では、実際よりも 31 日少ない 1 か月となります。したがって、偶数の月が経過した場合は、その 1 日を追加するだけです (これは、月を 2 で割って残りを見ることでわかります。これは「モジュロ除算」と呼ばれ、「月 % 2」と書きます)。

いよいよ、2月に入ります。2 月が過ぎた場合 (= 3 月以降) は 2 日、閏年の場合は 1 日を差し引くだけです。ここでは、いわゆる「三項ステートメント」を使用しました (... ? ... : ... のこと)。基本的には略ですif (isLeapYear(year)) { days -= 1; } else { days -= 2; }

于 2013-11-01T21:04:15.307 に答える