#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
int menu();                            /*菜单函数*/
void operatemenu();                    /*菜单处理函数*/
int assessyear(int year);              /*润年判断函数*/
void howmanydays(int year,int *m);      /*每月多少天函数*/
int yeardays(int year );                /*从公元0年到你输入的上一年共有多少天*/
int monthdays(int year,int yue,int *m);    /*从公元零年到你输入的上一月共有多少天*/
void printyear(int year,int *m,int n);    /*输出年日历*/
void printmonth(int year,int *m,int yue);    /*输出月日历*/
void printrunnian(int year);                  /*输出年是润年还是非闰年*/
void main()                            /*主函数*/
{
operatemenu();
}
int menu()                            /*菜单函数*/
{
int chose;
system("cls");                    /*清屏函数*/
printf("****************************\n");
printf("      08 通信2班 王韬      \n");
printf("        万年历系统          \n"); 
printf("        1查看月日历        \n");
printf("        2查看年日历        \n");
printf("        3退出              \n");
printf("****************************\n");
fflush(stdin);
printf("请选择\n");
do{                                            /*用do  while实现输错后重新输入*/
scanf("%d",&chose);
if(chose!=1&&chose!=2&&chose!=3)
printf("你输入错误请重新输入\n");
}
while(chose!=1&&chose!=2&&chose!=3);
return chose;
}
void operatemenu()                          /*菜单处理函数*/
{
int n=0,month[13],year,yue,k;              /*month[13]用来存每月多少天的其中的month[0]没用设为0*/ 
printf("请输入数字,输入-1将不会执行下面的菜单选项,程序将不会被执行,慎重!\n");
scanf("%d",&k); 
while(k!=-1)                                /*用while 循环实现菜单的重复选择*/
{
n=menu();
switch(n)
{       
case 1:printf("查看月日历\n");
printf("请输入你想查看的年份和月份\n");
scanf("%d%d",&year,&yue);
printf("年份:%d,月份:%d\n",year,yue);
howmanydays(year,month);
printmonth(year,month,yue);
break;
case 2:printf("查看年日历\n");
printf("请输入你想查看的年份\n");
scanf("%d",&year);
printf("年份:%d\n",year);
howmanydays(year,month);
printyear(year,month,12);
break;
case 3:printf("退出系统\n");
exit(0);
break;
}
printf("请输入数字输入-1后菜单将不会再次被执行,慎重!\n");
scanf("%d",&k);
}
}
int assessyear(int year)                    /*判断润年或非润年的函数*/
{
int leap;
if(year%4!=0
)
leap=2;
else if(year%100!=0)
leap=1;
else if(year%400!=0)
leap=2;
else
leap=1;
return leap;
}
void howmanydays(int year,int *m)            /*每月多少天函数*/
{
int i,n;
i=assessyear(year); 
for(n=1;n<=7;n=n+2)
*(m+n)=31;
*(m+8)=31;*(m+10)=31;*(m+12)=31;
*(m+4)=30;*(m+6)=30;*(m+9)=30;*(m+11)=30;
*m=0; 
if(i==1)  *(m+2)=29;
else      *(m+2)=28; 
}
int yeardays(int year)                  /*从公元0年到你输入的上一年共有多少天*/
{
int y,j,day=0;
for(y=1;y<year;y++)                      /*从公元0年到你输入的年份的上一年计算出一共多少天*/
{
j=assessyear(year);
if(j==1)
day+=366;
else
day+=365;
}
return day;
}
int monthdays(int year,int yue,int *m)                /*从公元零年到你输入的上一月共有多少天*/   
{
int i,day=0;
day=yeardays(year);
for(i=1;i<yue;i++)             
day+=(*(m+i));
return day;
}
void printmonth(int year,int *m,int yue)        /*输出月日历*/
{
int leap,k=1,day,x;
printf("年份:%d月份:%d的日历\n",year,yue);
printf("星期日 星期一 星期二 星期三 星期四 星期五 星期六\n");
day=monthdays(year,yue,m);
day=day-3;                          /*输入的月份的上一个月到公元0年一月一日相差的天数*/
while(k<=*(m+yue))                      /*每月有几天分别对应到星期几上去*/
{
leap=(day+k)%7;
for(x=0;x<leap;x++)
printf("      ");                  /*寻一号对应星期几*/
for(x=leap;x<=6;x++,k++)
if(k>*(m+yue))                        /*当k超过本月的最大天数也就意味着它不能在和星期几对应了*/
continue;
else  printf("%d号    ",k);
printf("\n");
}
printrunnian(year);
}
void printyear(int year,int *m,int n)
{
int day,i,k=1,leap,x;
day=yeardays(year);
day=day-3;                        /*从公元0年到你输入的年份的上一年相差几天*/
printf("年份:%d的日历\n",year);
for(i=1;i<=n;i++)                    /*一年的日历*/
{
printf("第%d的日历\n",i);
printf("星期日 星期一 星期二 星期三 星期四 星期五 星期六\n");
k=1;                                          /*k重新赋值为一有利于到下个月1号的位置*/
while(k<=*(m+i))                            /*一个月的日历*/
{
leap=(day+k)%7;
for(x=0;x<leap;x++)
printf("      ");
for(x=leap;x<=6;x++,k++)
if(k>*(m+i))                /*当k超过本月的最大天数也就意味着它不能在和星期几对应了*/
continue;
else
printf("%d号    ",k);
printf("\n");
}            /*while循环结束*/
day=day+*(m+i);
printf("\n");
}            /*for循环结束*/
printrunnian(year);
}
void printru
nnian(int year)
{
int n;
n=assessyear(year);
if(n==1)
printf("润年,谢谢使用!\n");
else函数printf
printf("非润年,谢谢使用!\n");
}