2013-11-12 3 views
0

Пользователь вводит год и хранится в year. И называется метод, который вычисляет и возвращает следующий год, который упадет в тот же день недели. Месяц и день не меняются только год. В этом случае месяц Ян и день 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; они оба падают в среду.

Редактировать: изменить тип петли.

+2

Обратите внимание, что у вас есть бесконечный цикл. –

+0

рассмотрите использование цикла while, поскольку вы не знаете, сколько итераций потребуется для получения вашего ответа. –

+0

@SotiriosDelimanolis Я пробовал цикл while с логическим значением вроде 'while (! Valid)', но я также получил бы бесконечный цикл. Я знал, что цикл for бесконечен, должен был упомянуть об этом, мой плохой. – PeterLion

ответ

1

Ваш цикл for (int i = 0; i <= i++; i++) никогда не остановится ...

В первый раз через, 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; 
    } 
} 
+0

Спасибо! Я заметил, что 'aYear' никогда не будет обновляться, мне не приходило создавать объект Date в самом цикле. Итак, почему бы создать второй объект «Date» вне цикла, чтобы предотвратить «aYear» от обновления в обычном режиме? – PeterLion

0

Вы только увеличиваете переменную aYear, но d2 Ссылка всегда будет содержать начальное значение aYear, поскольку оно было создано с помощью. Поэтому вам нужно обновить ссылку 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; 
} 
0

Ну, на ваш взгляд, ваша петля будет продолжаться вечно. У вас есть:

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

Это эквивалентно:

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

Что i++ делает это имеет значение i и приращения 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, которое всегда верно, поэтому цикл никогда не будет ломаться.

0

Вы можете использовать это найти совпадающие значения из двух массивов. добавьте getDayofWeek() и все, что вам нужно.

 for(int x : d1){ 

     //Some counter = 0; 

     for(int y : d2) { 
      if(x.equals(y)) 
      //counter++; 
     } 
     System.out.println(y); 

     }} 
Смежные вопросы