бесконечный цикл при подсчете дат - PullRequest
2 голосов
/ 10 марта 2011

Я пытаюсь решить проблему, которая требует выяснить, сколько раз 13-й день происходит в каждый рабочий день в период 1990 + N-1 лет.

int weekDay = 1;
int week[] = {0,0,0,0,0,0,0};

N = 20;

for (int year = 1990; year <= 1990+N-1; year++){
    for (int month = 1; month <= 12; month++){
        int days = numberOfDays(year,month);

        for (int day = 1; day <= days; day++){
            if (day == 13)
                week[weekDay] += 1;

            weekDay += 1;
            if (weekDay > 7)
                weekDay = 1;
        }
    }
}

Вот мое решение, однако я застреваюв бесконечном цикле в году и не может исправить это.

РЕДАКТИРОВАТЬ: функция numberOfDays.

int numberOfDays(int year, int month)
{
    if (month == 2 && leapYear(year))
        return 29;
    else if (month == 2)
        return 28;

    if (month == 9 || month == 4 || month == 6 || month == 11)
        return 30;

    return 31;
}

Ответы [ 2 ]

5 голосов
/ 10 марта 2011

Вы используете дни недели в диапазоне 1..7, но ваш массив гистограмм week[] проиндексирован 0..6.


Одно из возможных решений - изменить:

            week[weekDay] += 1;

to:

            week[weekDay - 1] += 1;

Другое решение - сделать week[] на один элемент больше и не использовать элемент 0, т. Е. Изменить:

int week[] = {0,0,0,0,0,0,0};

на:

int week[] = {0,0,0,0,0,0,0,0};

Третье возможное решение - использовать дни недели в диапазоне 0,6, т. Е. Изменить:

int weekDay = 1;

на:

int weekDay = 0;

иизменить:

        if (weekDay > 7)
            weekDay = 1;

на:

        if (weekDay > 6)
            weekDay = 0;

0 голосов
/ 10 марта 2011

Off-на-один.Ваш массив week[] имеет 7 элементов с индексом 0..6.Вы пишете в week[7], который перезаписывает то, что вы не намеревались, например, переменную year.

...