【发布时间】:2022-01-04 04:16:43
【问题描述】:
我试图制作一个程序来显示特定年份的给定月份的日历,但我真的找不到能找到该月第一天的算法。
我的程序:
#include <stdio.h>
#include <stdlib.h>
int get_first_weekDay(int year, int months1, int monthDays[months1])
{
int day;
int months2 = monthDays[months1];
int beginning = 3;
while(months1 > 0)
{
months2 = months2 + monthDays[months1];
months1 = months1 - 1;
}
for (int i = 1800; i < year; i++)
{
if ((i % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
beginning = beginning + 366;
}
else
{
beginning = beginning + 365;
}
}
day = (beginning + months2) % 7;
return day;
}
int main(int argc, char* argv[])
{
if(argc != 3)
{
printf("Usage: ./calendar year month \n");
return 1;
}
int year = atoi(argv[1]);
int months1 = atoi(argv[2]) - 1;
int day = 0, dayInMonth, weekDay = 0, startingDay ,month;
char *months[] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
int monthDays[] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (argc == 3)
{
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
monthDays[1] = 29;
}
startingDay = get_first_weekDay(year, months1, &monthDays[months1]);
for(month = 0; month < 12; month++)
{
if(months1 == month)
{
dayInMonth = monthDays[month] + 1;
printf(" %s %d \n ---------------------------", months[month], year);
printf("\n Sun Mon Tue Wed Thu Fri Sat\n");
for(weekDay = 0; weekDay < startingDay; weekDay++)
{
printf(" ");
}
for(day = 1; day < dayInMonth; day++)
{
printf("%4d", day);
if(++weekDay > 6)
{
printf("\n");
weekDay = 0;
}
startingDay = weekDay;
}
}
}
printf("\n");
return 1;
}
}
例如,如果我想知道 1800 年的第一个月,它会给我作为输出:
~/calendar/ $ ./calendar 1800 1
Jan 1800
---------------------------
Sun Mon Tue Wed Thu Fri Sat
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
但不正确,因为 1800 年 1 月的第一天不是星期六。 Calendar 1800
谁能帮我找到这样的算法。我真的很感激!
【问题讨论】:
-
这是哪个cs50问题集?讲座中没有解释吗?
if (argc == 3)块只会创建不必要的缩进。如果不是 3,程序会提前退出,所以当你到达那里时,它必须是 3,所以不需要检查。 -
请不要编辑代码来修复答案指出的错误。它使答案无效。
-
您在测试旧年时需要小心,因为过去对日历进行了一些奇怪的调整,这基本上使得这样的程序无法正常工作。一个例子是这样的:en.wikipedia.org/wiki/1752