#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 0x51
intyear,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@0==0||(year%4==0&&year0!=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)return0;break;
case 4:
case 6:
case 9:
case 11:
if(day>30)return0;break;
default:
if(runYear(year)&&day>29)
return0;
elseif(runYear(year)==0&&day>28)
return0;
}
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;
caseKEYNUMPageDown: 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;
charwday[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) //放置第一天
{
case0:printf("]",nowDay);break;
case1:printf("d",nowDay);break;
case2:printf("d",nowDay);break;
case 3:printf("d",nowDay);break;
case4:printf("%d",nowDay);break;
case5:printf("0d",nowDay);break;
default:printf("5d\n",nowDay);
}
nowDay++;
for(i=1;i<n;i++)
{
w=getwDay(year,month,nowDay);
printf("]",nowDay);
if(w==6) //如果是星期六则换行打印
puts("\n");
nowDay++;
}
printf("\n***********************************\n\n");
}
void checkCalender()//查询日历
{
system("cls");
int year,month,day;
printf("请输入你要查询的日期(格式为年月日,如2009 11 3):");
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);
}
int 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);
return 0;
}