我目前正在开发日历应用程序。我从互联网上得到了这个想法,代码如下。确定日期代码的公式对我来说并不容易记住。所以我尝试以for循环/while循环的形式实现它来计算从0年开始的daycode。 注意:第 0 年的日期代码为 0,第 1 年的日期代码为 1。 快速总结: Daycode 代表一年的第一天。范围从 0 到 6,其中 0 代表星期日,6 代表星期六。
#include<stdio.h>
#define TRUE 1
#define FALSE 0
int days_in_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char *months[]=
{
" ",
"\n\n\nJanuary",
"\n\n\nFebruary",
"\n\n\nMarch",
"\n\n\nApril",
"\n\n\nMay",
"\n\n\nJune",
"\n\n\nJuly",
"\n\n\nAugust",
"\n\n\nSeptember",
"\n\n\nOctober",
"\n\n\nNovember",
"\n\n\nDecember"
};
int inputyear(void)
{
int year;
printf("Please enter a year (example: 1999) : ");
scanf("%d", &year);
return year;
}
int determinedaycode(int year)
{
int daycode;
int d1, d2, d3;
d1 = (year - 1.)/ 4.0;
d2 = (year - 1.)/ 100.;
d3 = (year - 1.)/ 400.;
daycode = (year + d1 - d2 + d3) %7;
return daycode;
}
int determineleapyear(int year)
{
if(year% 4 == FALSE && year%100 != FALSE || year%400 == FALSE)
{
days_in_month[2] = 29;
return TRUE;
}
else
{
days_in_month[2] = 28;
return FALSE;
}
}
void calendar(int year, int daycode)
{
int month, day;
for ( month = 1; month <= 12; month++ )
{
printf("%s", months[month]);
printf("\n\nSun Mon Tue Wed Thu Fri Sat\n" );
// Correct the position for the first date
for ( day = 1; day <= 1 + daycode * 5; day++ )
{
printf(" ");
}
// Print all the dates for one month
for ( day = 1; day <= days_in_month[month]; day++ )
{
printf("%2d", day );
// Is day before Sat? Else start next line Sun.
if ( ( day + daycode ) % 7 > 0 )
printf(" " );
else
printf("\n " );
}
// Set position for next month
daycode = ( daycode + days_in_month[month] ) % 7;
}
}
int main(void)
{
int year, daycode, leapyear;
year = inputyear();
daycode = determinedaycode(year);
determineleapyear(year);
calendar(year, daycode);
printf("\n");
}
我所尝试的问题:我得到了除闰年之外所有年份的正确日历。我为此使用了 for 循环;
int daycode=0;
for(int i=1;i<=year;i++)
{ if(//check for leap year)
{daycode++;}
daycode ++;}
daycode=daycode %7;
谢谢大家的建议和解答。我找到了问题的答案。所以基本上每当我进入闰年时,for 循环都会将日期代码增加两次。但由于日期代码是 2 月 29 日之前而不是之后的一天,因此您只需增加日期代码一次。所以我不得不即兴创作 for 循环;
{ int daycode=0;
int i=1;
for(i=1;i<=year;i++)
{ if((//check for leap year)&&(i!=year)
daycode++;
i++;}
daycode=daycode%7;
return daycode;
}
因此,if 条件不仅检查年份是否为闰年,还检查输入的年份是否为闰年。如果当前年份是闰年,则日期代码仅增加一次。这个条件基本上适用于任何年份,直到 I 的值不等于输入的年份