万年历的C语言编程实现源程序:
#include
#include
int Isleapyear(int y)/*判断是否是闰年*/
{
if((y%4==0&&y%100!=0)||(y%400==0))
return 1;
else
return 0;
}
int Getdaysofmonth(int y,int m)/*确定某个月的天数*/
{
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(Isleapyear(y))/*如果是闰年则2月份的天数改变为29*/
months[2]=29;
return months[m];
}
int Gettotaldays(int y,int m)/*计算从1901年1月开始到给定年月的天数*/
{
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int days=0;
int i,j;
if((Isleapyear(y)))
months[2]=29;
for(i=1901;i
{
if(Isleapyear(i))
days+=366;
else
days+=365;
}
for(j=1;j
days+=months[j];
return days;
}
int Getfirstdayintable(int y,int m)/*计算给定年月的第一天在日历表中的位置*/
{
int d;
d=Gettotaldays(y,m);
d=d+3;/*1901年1月1日是星期二,在日历中星期二是第三个位置*/
d=d%7;
return d;
}
void Showdate(int y,int m)/*显示日历*/
{
int first;
int d;
int i,k;
first=Getfirstdayintable(y,m);/*得到第一天在日历中的第一个位置*/
d=Getdaysofmonth(y,m);/*得到这个月的天数*/
k=0;
printf("-------------------------------------\n");
printf(" SUN MON TUE WEN THU FRI STA\n");
for(i=1;i
{
printf(" ");
k++;/*k用于确定日历中是否回车*/
}
for(i=1;i<=d;i++)
{
printf("%5d",i);/*每个具体的日期占5个字符的宽度*/
k++;
if(k==7)/*每行打印7个日期数字后回车*/
{
printf("\n");
k=0;
}
}
printf("\n-------------------------------------\n");
}
int main(){
int y,m;
printf("Input year:");
scanf("%d",&y);
printf("Input month:");
scanf("%d",&m);
Showdate(y,m);
return 0;
}