#include<stdio.h>#include<time.h>#include<math.h>#include<windows.h>#include<conio.h>#define KEYNUMUp 0x48#define KEYNUMDown 0x50#define KEYNUMLeft 0x4b#define KEYNUMRight 0x4d#define KEYNUMPageUp 0x49#define KEYNUMPageDown 0x51int year,month,day; //全局变量记录时间intdaysOfMonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31, 31,30,31, 30,31}};int runYear(int year) //判断是否是闰年{int flag=0;if(year%400==0||(year%4==0&&year%100!=0))flag=1;return flag;}struct tm* getDay()//从系统取得当前时间{time_t timer;struct tm* gmt;time(&timer);gmt=localtime(&timer);return gmt;}int dayExame(int year,int month,int day)//检查日期是否正确{if(year<0||month<1||month>12||day<1||day>31)return 0;switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(day>31)return 0;break;case 4:case 6:case 9:case 11:if(day>30)return 0;break;default:if(runYear(year)&&day>29)return 0;else if(runYear(year)==0&&day>28)return 0;}return 1;}int getwDay(int year,int month,int day)//取得星期{int nday=0,nDay,i,w;for(i=0;i<month-1;i++)nday+=daysOfMonth[runYear(year)][i];nday+=day;nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;w=nDay%7;return w;}void printCalender(int year,int month,int day);void setDay(int &year,int &month,int &day)//调节日期{printf("%c:上一年 %c:下一年\n",24,25);printf("%c:上个月 %c:下个月\n",27,26);printf("PageUp:昨天 PageDown:明天\n");printf("其他:返回主菜单\n");char k;getch();k=getch();switch(k) //通过方向键和PageUp、PageDown键来调整日期{case KEYNUMUp: year--;if(dayExame(year,month,day)==0){year++; printf("%c",7);} //检查日期的合法性,//若错误,保持日期不变,并警告system("cls");printCalender(year,month,day);setDay(year,month,day);break;case KEYNUMDown: year++;if(dayExame(year,month,day)==0){year--;printf("%c",7);}system("cls");printCalender(year,month,day);setDay(year,month,day);break;case KEYNUMLeft: month--;if(dayExame(year,month,day)==0){month++;printf("%c",7);}system("cls");printCalender(year,month,day);setDay(year,month,day);break;case KEYNUMRight: month++;if(dayExame(year,month,day)==0){month--;printf("%c",7);}system("cls");printCalender(year,month,day);setDay(year,month,day);break;case KEYNUMPageUp: day--;if(dayExame(year,month,day)==0){day++;printf("%c",7);}system("cls");printCalender(year,month,day);setDay(year,month,day);break;case KEYNUMPageDown: day++;if(dayExame(year,month,day)==0){day--;printf("%c",7);}system("cls");printCalender(year,month,day);setDay(year,month,day);break;default: ;}}void printCalender(int year,int month,int day)//打印月历{int i;char wday[7][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};printf(" %d年%d月%d日\n",year,month,day);printf("***********************************\n");for(i=0;i<7;i++)printf("%5s",wday[i]);printf("\n");int w;int nowDay=1;w=getwDay(year,month,nowDay);//找到第一天的星期int n;n=daysOfMonth[runYear(year)][month-1];switch(w) //放置第一天{case 0:printf("%5d",nowDay);break;case 1:printf("%10d",nowDay);break;case 2:printf("%15d",nowDay);break;case 3:printf("%20d",nowDay);break;case 4:printf("%25d",nowDay);break;case 5:printf("%30d",nowDay);break;default:printf("%35d\n",nowDay);}nowDay++;for(i=1;i<n;i++){w=getwDay(year,month,nowDay);printf("%5d",nowDay);if(w==6) //如果是星期六则换行打印puts("\n");nowDay++;}printf("\n***********************************\n\n");}void checkCalender()//查询日历{system("cls");int year,month,day;printf("请输入你要查询的日期(格式为年月日,如2011 12 22):");scanf("%d%d%d",&year,&month,&day);while(!dayExame(year,month,day)) //如果日期输入不正确,则重新输入{printf("%c你输入的日期错误,请重新输入:",7);scanf("%d%d%d",&year,&month,&day);}system("cls");if(runYear(year))printf("\n 闰年\n\n");else printf("\n 平年\n\n");printCalender(year,month,day);}void inline backMenu(){printf("请按任意字符键返回主菜单:");getch();system("cls");}void mainMenu(int &year,int &month,int &day)//主菜单{printf(" ************主菜单************\n");printf(" * 1、日历显示 *\n");printf(" * 2、日历查询 *\n");printf(" * 3、修改日期 *\n");printf(" * 4、帮助 *\n");printf(" * 5、退出 *\n");printf(" ******************************\n");char menu[100];int flag=0;do{int f=0;do{f=0;printf("\n 请输入相应数字:");scanf("%s",menu);if(strlen(menu)>2)f=1;}while(f==1);switch(*menu){case '1':system("cls"); //清屏printCalender(year,month,day);backMenu(); //实现任意键返回主菜单mainMenu(year,month,day);break;case '2':system("cls");checkCalender();backMenu();mainMenu(year,month,day);break;case '3':system("cls");printCalender(year,month,day);setDay(year,month,day);printf("请按任意字符键返回主菜单:");getch();system("cls");mainMenu(year,month,day);break;case '4':system("cls");printf("在主菜单中输入相应的数字就可以完成以下功能:\n\n");printf("* 1、显示今天所在月的月份\n\n");printf("* 2、输入日期,判断该年是否是闰年,并显示所在月份的月历\n\n");printf("* 3、用%c %c %c %c PageUp PageDown 进行日期的调整\n\n",24,25,27,26);printf("* 4、显示功能及操作方法\n\n");printf("* 5、退出程序\n\n");backMenu();mainMenu(year,month,day);break;case '5':system("cls");printf("程序已退出!\n");exit(0);default:printf("%c 输入错误!\n",7);flag=1;}}while(flag);}void main(){struct tm *gmt=getDay();year=gmt->tm_year+1900;month=gmt->tm_mon+1;day=gmt->tm_mday;printCalender(year,month,day);//用系统时间进行初始化,打印当前月历backMenu();mainMenu(year,month,day);}。