基本信息
源码名称:c++ 制作 万年历 实例源码(C语言基础巩固与提高)
源码大小:0.01M
文件格式:.cpp
开发语言:C/C++
更新时间:2019-06-02
   源码介绍

                    巩固C语言基础,开发的万年历程序。

                    




                    #include "time.h"       /*包含的头文件*/
#include "stdio.h"
#include "math.h"
#include "windows.h"
#include "conio.h"
 
#define   KEYNUMUp                   0x48         /*宏定义*/
#define   KEYNUMDown                 0x50  
#define   KEYNUMLeft                 0x4b   
#define   KEYNUMRight                0x4d
 
int eachyeartotal(int year,int month,int day);    /*函数声明*/
int counterdays(int year,int month,int day);
int nowtime(int year,int month,int day);
int week(int year,int month,int day);
int maxDay(int year,int month);
int isleap(int year);
void whatweek(int year,int month,int day);
void display(int year ,int month);
void display2(int year,int month);
void display3(int year,int month,int day) ;
void setDay1(int year,int month,int day);
void setDay2(int year,int month,int day);
void setDay3(int year,int month,int day);
void jieri(int month,int day);
void display1(int day);
void getmenu();
 
 
int main()                                              /*主函数*/
{
 int year,month,day,select; 
 while(1)
 {
  system("cls");
  getmenu();
   printf("  请输入相应数字:");                         /*菜单选择 */
   scanf("%d",&select);
   system("cls");
   switch(select)
   {
     case 1:                                   /*当选择为1时显示日期查询*/
     printf(" 日期查询:输入天数(如5):"); 
     scanf("%d",&day);
     if(day>0&&day<10000)                    /*日期选择从0-10000 */
      { display1(day);
       printf(" 提示  按任意键:返回菜单\n\n");
       setDay2( year,month, day); 
       }
        else
        system("cls");
        printf("  输入无效,重新输入!\n");
         break;
     
     case 2:                                  /*当选择为2显示月历*/
     printf("  月历查询:输入年月(如2011,6):");
     scanf("%d,%d",&year,&month);
     if(year>0&&year<10000&&month>=1&&month<=12)
      {
       display2(year,month);
       printf(" 提示  按←:上个月   按→:下个月   按其他键:返回菜单\n\n");
       setDay2( year,month, day);
       }
        else
        system("cls");
        printf("  输入无效,重新输入!\n");
        break;
     
     case 3:                                 /*当选择为3时显示日历*/
     printf("  日期显示:输入年月日(比如2011,6,23):");
     scanf("%d,%d,%d",&year,&month,&day);
     if(year>0&&year<10000&&month>=1&&month<=12&&day>=1&&day<=maxDay(year,month))
      {
       display3(year,month,day);
       printf(" 提示  按↑:前一天    按↓:后一天   按其他键:返回菜单\n\n");
       setDay3( year,month, day);
       }
        else
        system("cls");
        printf("  输入无效,重新输入!\n");
        break;
        
      case 4:
    printf("\n\n\n\n\n\n\n\n\n\n");
    printf("                  *******************************************\n\n");
    printf("                  *         感谢使用本万年历工具            *\n\n");
          printf("                  *                            制作人:第五组 *\n\n");
    printf("                  *******************************************\n\n");
    printf("\n\n\n\n\n\n\n\n");
      exit(0);
        
     default:                  /*当输入其他数字时,输入无效,重新输入*/
     system("cls");
     printf("  输入无效,重新输入!\n");
    
   }
 }
}
 
int isleap(int year)                                /*判断是否为闰年*/
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else
return 0;
}
 
 
int maxDay(int year,int month)  /*每月的天数*/
{
 int a[]={31,28,31,30,31,30,31,31,30,31,30,31};            /*每个月中的天数*/
 if(isleap( year))  
 a[1]=29;                                     /*闰年2月份有29天*/
 return a[month-1];
}
 
 
int eachyeartotal(int year,int month,int day)       /*判断某天是一年中的第几天*/
{
 int i,sum=0;
 for(i=1;i<month;i )
 sum =maxDay(year,i);
 sum =day;
 return sum;
 }
 
 
int week(int year,int month,int day)           /*对天数进行判断确定是星期几*/
{
 int number=(year-1) (year-1)/4-(year-1)/100 (year-1)/400
  eachyeartotal(year,month,day);
 number=number%7  ;
 return number;
}
 
 
void display(int year ,int month)                           /*输出年月*/
{
 int max,number,i,j=1;
 max=maxDay(year,month);
 number=week(year,month,1);
 printf("  %4s  %4s  %4s  %4s  %4s  %4s  %4s\n","Sun","Mon","Tue","Wed",
"Thu","Fri","sat");
 for(i=0;i<number;i )  
 printf("      ");                             /*1号前的星期补空格*/
 while(j<=max)
 {
   printf("%6d",j);
   if (i%7==6)  
    printf("\n");                                    /* 每7格换一行*/
    i ;
    j ;
  }
  printf("\n\n");
}
 
 
void display1(int day)                                       /*输出年历*/
{    struct tm when;
   time_t now, result;
  
 char *a;
   time( &now );
   when = *localtime( &now );
 printf("\n");
 printf( "现在时间是 %s\n", asctime( &when ) );
   printf( "查询距离时间是: " );
  
   when.tm_mday = when.tm_mday day;
 
   if( (result = mktime( &when )) != (time_t)-1 )
 {   a=asctime( &when );
 printf( " %d天后时间是 %s\n", 
       day, a);
 }   else
       perror( "mktime failed" );
 
}
 
 
 
 
void display2(int year,int month)                             /*输出月历*/
{
 printf("\n%d 年  %d 月\n ",year,month);
 display(year,month);
}
 
 
void display3(int year,int month,int day)                     /*输出日历*/
{
 whatweek( year,month,day);
 jieri(month,day); 
 counterdays(year,month, day);
 }
 
 
 
int counterdays(int year,int month,int day)        /*判断今天距特定日期的天数*/
{
 int year1, days0,days1,month1,days, day1;
 time_t timep;
  struct tm *p;
   time(&timep);
    p=gmtime(&timep);
     year1=(1900 p->tm_year) ;
      month1=(1 p->tm_mon) ;
       day1=(p->tm_mday);              /*获取系统时间year1、month1、day1分别为年、月、日*/
        days0=(year-1)*365 (year-1)/4-(year-1)/100 (year-1)/400 eachyeartotal(year,month,day);
         days1=(year1-1)*365 (year1-1)/4-(year1-1)/100 (year1-1)/400 eachyeartotal(year1,month1,day1);
          days=days0-days1;             /*计算出两个日期之间的时间差*/
           printf("\n  今天距%d年%d月%d日还有%d天\n\n",year,month,day,days);
           return days;
            }
 
 
void whatweek(int year,int month,int day)                  /*判断是星期几*/

 int number;
 number=(year-1) (year-1)/4-(year-1)/100 (year-1)/400 eachyeartotal(year,month,day);
 number=number%7  ;
 switch( number)
 {
   case 0:
   printf( "\n  %d年%d月%d日是星期日",year,month,day);break;
   case 1:
   printf( "\n  %d年%d月%d日是星期一",year,month,day);break;
   case 2:
   printf( "\n  %d年%d月%d日是星期二",year,month,day);break;
   case 3:
   printf( "\n  %d年%d月%d日是星期三",year,month,day);break;
   case 4:
   printf( "\n  %d年%d月%d日是星期四",year,month,day);break;
   case 5:
   printf( "\n  %d年%d月%d日是星期五",year,month,day);break;
   case 6:
   printf( "\n  %d年%d月%d日是星期六",year,month,day);break;
   default:
   system("cls");
   printf(" 出现错误!\n" );
     }
}
 
 
void jieri(int month,int day)                           /*判断是否公历节日*/
{
 if(month==1)
 switch(day)
 {
   case 1:
   printf(",这天是元旦");
   } 
    if(month==2)
    switch(day)
     {
       case 14:
       printf(",这天是情人节");
        }
         if(month==3)
         switch(day)
       {
         case 8:
         printf(",这天是妇女节");
         break;
         case 12:
         printf(",这天是植树节");
       }
        if(month==4)
         switch(day)
          {
           case 1:
           printf(",这天是愚人节");
          } 
           if(month==5)
            switch(day)
            { 
              case 1:
              printf(",这天是劳动节");
              break;
              case 4:
              printf(",这天是青年节");
            }
             if(month==6)
              switch(day)
              {
               case 1:
               printf(",这天是儿童节");
              }
               if(month==7)
                switch(day)
                { 
                 case 1:
                 printf(",这天是建党节");
                }
                 if(month==8)
                  switch(day)
                   { 
                     case 1:
                     printf(",这天是建军节");
   break;
   case 23:
   printf(",今天是我的生日");
                    }
                    if(month==9)
                     switch(day)
                      {  
                       case 10:
                       printf(",这天是教师节");
                      }
                      if(month==10)
                       switch(day)
                        { 
                         case 1:
                         printf(",这天是国庆节");
                        }
    if(month==12)
    switch(day)
    {
    case 24:
    printf(",今天是平安夜");
    break;
    case 25:
    printf(",今天是圣诞节");
    }
    
                   
}
 
 
void setDay1(int year,int month,int day) /*通过键盘返回主菜单*/
{   char k;
   getch();
   k=getch();
 
     system("cls");
 getchar();
   }
   
 
 
 
void setDay2(int year,int month,int day) /*通过键盘"←""→"控制月历的变换*/
 { 
   char k;
   getch();
   k=getch();
   switch(k)
   {
     case KEYNUMLeft:                       /*"←"月份变小*/
          if(month<2)
          {
           month =12;
           year--;
           }
            if(year<1)
             { 
              system("cls");
              printf("  警告!超出范围!\n");
               break;
              }
            month--;
            display2(year , month);
            setDay2(year,month,day);
            break;
     case KEYNUMRight:/*"→"月份变小*/
          if(month>11)
           {
            month-=12;
            year ;
           }
            if(year<9999);
            month ;
            display2(year , month);
            setDay2(year,month,day);
            break;
      default: 
      system("cls");
   ;
     
   }
   
 }
 
 
 
void setDay3(int year,int month,int day)        /*通过键盘"↑""↓"控制日期的变换*/
{
    char k;
    getch();
    k=getch();
    switch(k)
    {
      case KEYNUMUp :                   /*"↑"日期变小*/
           if(day<2)
           {
            month--;
            day=maxDay(year,month);
            }
             if(month<1)
              {
               month =12;
               year--;
               }
                if(year<1)
                 {
                  system("cls");
                  printf(" 警告!超出范围!\n");
                  break;
                 }
                  day--;
                  display3(year , month,day);
                  setDay3(year,month,day);
                  break;
      case KEYNUMDown:               /*"↓"日期变大*/
           day ;
           if(day>maxDay(year,month))
           {
            day=1;
            month ;
           }
            if(month>12)
             {
               month-=12;
               year ;
             }
             if(year<10000);
                display3(year , month,day);
                setDay3(year,month,day);
                break;
       default: 
       system("cls");
       ;
   }
}
 
 
void getmenu() /* 显示菜单选择*/
{  
struct tm when;
  time_t now, result;
    int    days;
    time( &now );
  when = *localtime( &now );
  printf("                   ***************主菜单***************\n\n");
    printf("                   *        欢迎进入万年历系统        *\n\n");
  printf("                   *            现在时间是            *\n\n");
    printf("                         %s                            \n",asctime( &when ) );
   printf("                   *          1、日期查询             *\n\n");
   printf("                   *          2、月历查询             *\n\n");
   printf("                   *          3、日历查询             *\n\n");
   printf("                   *          4、退出系统             *\n\n");
   printf("                   ************************************\n\n");
 
}