0

ユーザーが年を入力すると、 に格納されyearます。そして、同じ曜日になる次の年を計算して返すメソッドが呼び出されます。月日は年だけ変わらない。この場合、月は 1 月で、日は 1 です。

/**
 * @param theYear the year given
 */
public int yearSync(int theYear)
{
   int month = 1;
   int day = 1;
   int year = theYear;

   int aMonth = 1;
   int aDay = 1;
   int aYear = year++;

   Date d1 = new Date(month, day, year);
   Date d2 = new Date(aMonth, aDay, aYear);

   boolean valid = false;       

   while (!valid)
   {
      if(d1.getDayOfWeek().equals(d2.getDayOfWeek)))//another class provided is used to 
      {                                             //calc what day of the week it is
         System.out.println(aYear); //prints the year
      }                             //that falls on the same week day as the input year
      else
      {
         aYear++;
      }
   }
   return aYear;
}

答えを求めるのではなく、自分の論理の誤りがどこにあるのか、このような問題に取り組むときに思考プロセスを変えるために何ができるかを知りたいだけです。混乱がある場合に備えて、例として 2014 を入力した場合、返される年は 2020 になります。どちらも水曜日になります。

編集:ループタイプを変更しました。

4

4 に答える 4

1

あなたのループfor (int i = 0; i <= i++; i++)は決して止まりません...

1 回目iは 0 に設定され、条件は ですi < i++。これにより、i の値が i +1 に変更されますが、比較は成功します。

そのため、ループを初めて通過するとき、 の値iは 1 です。ループの最後で、i++(値 2 になる) ために値がインクリメントされi <= i++ます。 i を 3 に設定します。

したがって、iループ内の値は 1、3、5、7、... になります。

このループ状態はかなり奇妙ですが、それは実際には問題ではありません....本質的には次と同じであるためです。

while (true) {...}

奇妙な点は、実際に同じ yad-of-week を持つ年を見つけた場合、その年をインクリメントしないことです。つまり、最初の一致を見つけたら、aYear++ は変更されず、同じことをSystem.out.println(...)永遠に繰り返すだけです。 .

しかし、繰り返しになりますが、ループ内で日付の値を変更することは決してないため、これはすべて無意味ですd2.....

あなたが望むのは次のようなものです:

while(true) {
    aYear++;
    Date d2 = new Date(aMonth, aDay, aYear);
    if (d1.getDayOfWeek().equals(d2.getDayOfWeek)))//another class provided is used to 
    {                                             //calc what day of the week it is
        System.out.println(aYear); //prints the year
        return aYear;
    }
}
于 2013-11-12T03:13:07.360 に答える
0

aYear変数をインクリメントするだけですが、参照は作成時の初期値d2を常に保持します。aYearそのため、for ループでも参照を更新d2して、各ループの反復で次の年を取得する必要があります。

また、目的の年を見つけたら、ループを中断する必要があります。これが更新された for ループです。うまくいくことを願っています。

 //for sake of this question I will use a for loop
   for (int i = 0; i <= i++; i++)
   {
      if(d1.getDayOfWeek().equals(d2.getDayOfWeek)))//another class provided is used to 
      {                                             //calc what day of the week it is
         System.out.println(aYear); //prints the year
         break;
      }                             //that falls on the same week day as the input year
      else
      {
         aYear++;
      }
      d2 = new Date(aMonth, aDay, aYear);
   }
   return aYear;
}
于 2013-11-12T03:09:36.893 に答える
0

一つには、あなたのループは永遠に続きます。あなたが持っている:

for (int i = 0; i <= i++; i++) { ... }

これは次と同等です。

int i = 0;
while (i <= i++) {
    ...
}

i++評価されi、 が 1 ずつ増加iします。さらに明確にするために、何i++をしているのかを複数のステートメントに展開しましょう。

int i = 0;
while (true) {
    //left-hand-side is 'i'
    int leftHandSide = i;
    //right-hand-side is 'i++' which evaluates to 'i' and then 'i' is incremented
    int rightHandSide = i;
    i += 1;
    if (leftHandSide <= rightHandSide) {
        break;
    }
    ...
}

これはを比較するだけで終わることに気付いた場合i <= i、これは常に true であるため、ループは決して壊れません。

于 2013-11-12T03:10:49.353 に答える