#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;
}