c - 计数未在嵌套 for 循环中更新
问题描述
我有一个程序旨在计算星期一在特定范围内发生的天数。我无法通过每次迭代更新计数。我尝试更改计数方法,甚至将其放入某些 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", &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 = %d\n", 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。
解决方案
您想要的输出是非常具体的。您希望将第一个匹配的星期一(您打印该范围内的星期一总数)与随后打印的星期一区分开来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", &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 = %d\n", day, m, year, i);
i = 0;
day += 6; // skip other weekdays
}
}
}
return 0;
}
推荐阅读
- delphi - 为什么 DOF 会删除线条?
- odoo-12 - odoo 12 根据状态值显示不同的形式
- tensorflow - 使用CNN的专利牌照空间定位
- java - 为什么没有调用“通用” MessageBodyReader/Writer 实现?
- r - 将现有的多参数函数逐行应用于多个数据帧,并使用联合输出数据帧
- r - 如何在 R 函数中插入文本?
- matplotlib - Seaborn 中的堆积条形图
- svg - flutter_svg -> 如何从不同的 svg 文件合成图像并获取合成图像的特定区域
- angular - 您可以将整个“this”关键字设置为 Typescript 类的构造函数中的对象吗?
- typescript - 此表达式不可调用。联合类型的每个成员都有签名,但这些签名都不兼容