Этот код действительно прост, но я просто не могу заставить его работать. Он продолжает говорить, что массив выходит за границы в строке 8 (цикл while), и я понятия не имею, почему, потому что u сбрасывается каждый раз. Любые идеи? Вероятно, это простое решение, но спасибо за помощь.

public class potato {
    public static void main(String[] args) {
        int year;
        int day = (int)((System.currentTimeMillis() + java.util.TimeZone.getDefault().getRawOffset()) / 1000.0 / 60.0 / 60.0 / 24.0);
        int[] months = {31,28,31,30,31,30,31,31,30,31,30,31};
        int u;
        for (year = 1970; year < 2018; year++) {
            u = 0;
            while (day > months[u] && u < 12) {
                day -= months[u];
                u++;
            }
        }
    }
}
0
Isaak Johnson 27 Фев 2018 в 07:33

3 ответа

Лучший ответ

Проверьте значение переменной u, прежде чем проверять дни. Измените условие цикла

 while ( u < 12 && day > months[u] )
2
moh ro 27 Фев 2018 в 05:05

Если вы внимательно посмотрите здесь

 u = 0;
 while (day > months[u] && u < 12) {
                    day -= months[u];
                    u++;
                }

Вы фактически получаете доступ к массиву в заголовке цикла while, когда увеличиваете его. Он снова проверяет массив, который вызывает months[12], который выходит за пределы.

Аналогично предыдущему ответу, когда вы говорите while(u<12&&day>months[u]), он использует методы тестирования с коротким замыканием. Поэтому, когда u==12 немедленно отменяет вход в цикл, а также отменяет проверку второго условия.

1
arc 27 Фев 2018 в 04:39

Вероятно, это не ответ на вопрос, но. Я посмотрел на этот пример кода, и у меня есть некоторые заметки.

  1. Не ясно, что делает этот код.
  2. При работе с date настоятельно рекомендуется использовать специальные классы: Calendar или YodaTime.
  3. Я не знаю почему, но вы не беспокоитесь о разных днях в Febriary в високосном году.
  4. System.currentTimeMillis() возвращает миллисекунды между текущим временем и полуночей, January 1, 1970 UTC: поэтому неясно, почему вы используете 1970 в коде.

Как пример кода, посмотрите на этот. Может быть, это может помочь вам.

public static int getDays(int yearFrom, int yearTo) {
    Calendar calendar = Calendar.getInstance();
    int days = getTotalDays(yearFrom, yearTo, calendar);

    for (int year = yearFrom; year < yearTo; year++) {
        calendar.set(Calendar.YEAR, year);

        for (int month = Calendar.JANUARY; month <= Calendar.DECEMBER; month++) {
            calendar.set(Calendar.MONTH, month);
            int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

            if (days <= maxDayOfMonth)
                break;

            days -= maxDayOfMonth;
        }
    }

    return days;
}

private static int getTotalDays(int yearFrom, int yearTo, Calendar calendar) {
    calendar.set(Calendar.DAY_OF_MONTH, 1);

    int days = 0;

    for (int year = yearFrom; year < yearTo; year++) {
        calendar.set(Calendar.YEAR, year);
        days += calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
    }

    return days;
}

P.S. Я не знаю контекста этой задачи, но в соответствии с кодом вы можете избежать всех циклов между 1970 и 1917 годами и работать только с текущим годом.

0
oleg.cherednik 27 Фев 2018 в 06:01