Подсчет не обновляется во вложенном цикле for

#c #for-loop #count #printf #std

Вопрос:

У меня есть программа, которая предназначена для подсчета количества дней, в течение которых понедельник происходит в определенном диапазоне. У меня возникают проблемы с обновлением подсчета на каждой итерации. Я попытался изменить методы подсчета, даже поместив его в некоторые циклы if, но безрезультатно.

Текущий Код

 #include <stdio.h>

#define SIZE 1000

#include "printVday.h"

int main() {
    //update date opposite of year so go through all the days first then the year
    //while loop that checks if the date was on a Monday and gets all the Mondays from the month then checks the second last one 
    int d = 15, m = 5, y, day, month, year, yearplus, i = 0;
    char dates[SIZE];

    printf("Enter a year: ");
    scanf("%d", amp;y);
    
    for (year = y; year <= y   20; year  ) {
        i  ;
        for (day = 15; day <= 24; day  ) {
            int dow = weekday(day, m, year);
            if (dow == 1) {
                printf("n%d /%d /%d count = %dn", day, m, year, i);
                i = 0;
            }
        }
    }
    return 0;
}

int weekday(int d, int m, int y) {

    return (d  = m < 3 ? y-- : y - 2, 23 * m / 9   d   4   y / 4 - y / 100   y / 400) % 7; //Michael Keith and Tom Craver expression to minimise number of keystrokes for conversion of a gregorian date into numerical day of week. Algorithm invented by John H. Conway

}
 

В настоящее время мой счетчик обновляется, но неправильно

Текущий вход и выход

 Enter a year: 2015

18 /5 /2015 count = 1

16 /5 /2016 count = 1

23 /5 /2016 count = 0

15 /5 /2017 count = 1

22 /5 /2017 count = 0

21 /5 /2018 count = 1

20 /5 /2019 count = 1

18 /5 /2020 count = 1

17 /5 /2021 count = 1

24 /5 /2021 count = 0

 

… вплоть до 2035 года

Желаемый Результат

 18 /5 /2015 count = 1

16 /5 /2016 count = 2

23 /5 /2016 count = 0

15 /5 /2017 count = 2

22 /5 /2017 count = 0

21 /5 /2018 count = 1

20 /5 /2019 count = 1

18 /5 /2020 count = 1

17 /5 /2021 count = 2

24 /5 /2021 count = 0
 

Если в указанном диапазоне есть только один день, который выпадает на понедельник, то он будет засчитан как 1… если в указанном диапазоне есть 2 дня, которые выпадают на понедельник, первый экземпляр будет засчитан как 2, а последний будет обновлен до 0.

Ответ №1:

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

Вот измененная версия:

 #include <stdio.h>

#define SIZE 1000

#include "printVday.h"

int weekday(int d, int m, int y) {
    // Michael Keith and Tom Craver expression to minimise number 
    // of keystrokes for conversion of a Gregorian date into 
    // numerical day of week. Algorithm invented by John H. Conway
    return (d  = m < 3 ? y-- : y - 2, 23 * m / 9   d   4   y / 4 - y / 100   y / 400) % 7;
}

#define MONTH      5
#define START_DAY 15
#define END_DAY   24

int main() {
    // while loop that checks if the date is a Monday and gets all the Mondays
    // from the month then checks the second last one 
    int y, day, m = MONTH, year, i;

    printf("Enter a year: ");
    if (scanf("%d", amp;y) != 1)
        return 1;
    
    for (year = y; year <= y   20; year  ) {
        i = 1;
        for (day = START_DAY; day <= END_DAY; day  ) {
            int dow = weekday(day, m, year);
            if (dow == 1) {
                if (i != 0) {
                    /* on first match, add number of other Mondays in range */
                    i  = (END_DAY - day) / 7;
                }
                printf("n%d /%d /%d count = %dn", day, m, year, i);
                i = 0;
                day  = 6;  // skip other weekdays
            }
        }
    }
    return 0;
}