代码及注释:
#include<stdio.h>
int numday[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};//闰年与非闰年每月天数
//函数功能:判断闰年与否
int LeapYear(int year)
{
return (year%4==0&&year%100!=0||year%400==0);
}
//函数功能:输出任意年的任意月份的1号是是星期几
int DayOfWeek(int year, int j)
{
int i;//循环计数变量
int n;//存储距离1990.1.1天数
int w;//星期几
n = (year - 1990) * 365 + 1;
for (i=1; i<=j; i++)
{
n += numday[LeapYear(year)][i-1];
w = n % 7;
}
return w;
}
//函数功能:输出万年历
void Output(int year)
{
int i;//控制打印空格
int j;//循环计数,打印12个月
int h;//控制每月1号开始的位置
for (j=1; j<=12; j++)
{
printf("Calendar %d - %d\n", year, j);
printf("---------------------\n");
printf("Su Mo Tu We Th Fr Sa \n");
printf("---------------------\n");
for (i=0; i<DayOfWeek(year, j); i++)
{
printf(" ");//控制1号开始位置
}
h = i;
for (i=1; i<=numday[LeapYear(year)][j]; i++)
{
printf("%-3d", i);//打印1 ~ 28、29、30、31
h++;//控制当打印到星期六时,换行
if(h%7 == 0)
{
printf("\n");
}
}
printf("\n");//每打印一个月换行一次
}
}
int main()
{
int year;
printf("请输入年份:");
scanf("%d", &year);
Output(year);
return 0;
}
示例输出: