#include<stdio.h>
#include<stdlib.h>
int isleapyear(int);
int leapyearnum(int);
void lastmonth(int *,int *);
void nextmonth(int *,int *);
void lines();
int firtocurmon(int year,int month);
int main()
{
int year;//输入的年份
int month;//输入的月份
int blanks;//一个月开头的单元空格个数
int i;
int days;//要查看月份的天数
int totaldays;//从公元元年元旦到查看月份(不包括本月)这之间的天数
char ch;
printf("请输入年份和月份:");
scanf("%d %d",&year,&month);
while(year<1||month<1||month>12)
{
printf("你的输入有误,请重新输入年份和月份:");
scanf("%d %d",&year,&month);
}
do{
totaldays=(year-1)*365+leapyearnum(year)+firtocurmon(year,month);
blanks=totaldays%7;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days=31;
break;
case 4:
case 6:
case 9:
case 11:
days=30;
break;
case 2:
days=28+isleapyear(year);
break;
default:
break;
}
system("cls"); //清屏
printf("%4d年%2d月的日历\n",year,month);
lines();
printf("一 二 三 四 五 六 日 \n");
lines();
for(i=1;i<=blanks;i++)
printf(" ");
for(i=1;i<=days;i++)
{
printf("%-10d",i);
if((i+blanks)%7==0)
{
printf("\n");
lines();
}
}
fflush(stdin);
printf("\n\n键入<返回上一个月,键入>进入下一个月,键入#号结束程序");
scanf("%c",&ch);
switch(ch)//判断是想查看上个的日历,还是下一个月的日历
{
case'<':
lastmonth(&year,&month);
break;
case'>':
nextmonth(&year,&month);
break;
case'#':
exit(1);
break;
default:
exit(1);
break;
}
}while(1);
return 0;
}
//判断某一年是否为闰年
int isleapyear(int oneyear)//oneyear是表示某一年
{
if(oneyear==0)
return 0;
if(oneyear%400==0||oneyear%4==0&&oneyear%100!=0)
return 1;
else
return 0;
}
//计算出从公元元年起到某年共有多少闰年
int leapyearnum(int year)
{
int i,sum=0;
for(i=1;i<year;i++)
sum+=isleapyear(i);
return sum;
}
//计算当年元月至当月的天数
int firtocurmon(int year,int month)
{
int isleapyear(int );
int i,cday;//cday代表当年元月至当月的天数
i=isleapyear(year);
switch(month)
{
case 1:cday=0;break;
case 2:cday=31;break;
case 3:cday=59+i;break;
case 4:cday=90+i;break;
case 5:cday=120+i;break;
case 6:cday=151+i;break;
case 7:cday=181+i;break;
case 8:cday=212+i;break;
case 9:cday=243+i;break;
case 10:cday=273+i;break;
case 11:cday=304+i;break;
case 12:cday=334+i;break;
default:exit(1);
}
return cday;
}
//如果要想查看上月的日历
void lastmonth(int *yearaddr,int *monthaddr)
{
if(*monthaddr!=1)
*monthaddr=*monthaddr-1;
else
{
*yearaddr=*yearaddr-1;
*monthaddr=12;
}
}
//如果要想查看下月的日历
void nextmonth(int *yearaddr,int *monthaddr)
{
if(*monthaddr!=12)
*monthaddr=*monthaddr+1;
else
{
*yearaddr=*yearaddr+1;
*monthaddr=1;
}
}
//打印出一条线
void lines()
{
int i;
for(i=1;i<=7*10;i++)
printf("_");
printf("\n");
}