万年历系统

来源:互联网 发布:越南槟知 编辑:程序博客网 时间:2024/06/06 05:08

#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; 
}