您的位置:首页 > 编程语言 > C语言/C++

用c语言编写一个万年历

2015-05-10 18:21 281 查看
33

#include<stdio.h>

#include<stdlib.h>

typedef struct  /*于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明)

             这里的Stu实际上就是struct Student的别名。Stu==struct Student*/

{

 int year;

 char month;

 char day;

} *DATE;   /*给结构体重命名,比如在定义了typedef struct node{int a;node *p} NODE;申请一个node型变量可用NODE来代替,如NODE a;相当于struct node a;*/

DATE NewDate(void);

int DestroyDate(DATE date);

int DaysAMonth(DATE date);

int CheckDate(DATE date);

int SetDate(DATE date,int year,int month,int day);

int GetWeek(DATE date);

int QueryDay(void);

int ShowMonth(DATE date);

int QueryMonth(void);

int QueryYear(void);

int ConfirmExit(void);

int Calendar(void);

DATE NewDate(void)

{

 DATE date;

 date=(DATE)malloc(sizeof(*date));

 return date;

}

int DestroyDate(DATE date)

{

 if(!date)

  return 0;

 free(date);

  return 1; 

}

int DaysAMonth(DATE date)

{

 int days;

 if(!date)

  return 0;

 switch(date->month)

 {

  case 1 :

  case 3 :

  case 5 :

  case 7 :

  case 8 :

  case 10 :

  case 12 :

      days=31;

      break;

  case 4 :

  case 6 :

  case 9 :

  case 11 :

      days=30;

      break;

  default :

      days=0;

      break;

 }

 if(date->month==2)

 if(date->year%4==0&&date->year%400!=0||date->year%400==0)

  days=29;

 else

  days=28;

 return days;

}

int CheckDate(DATE date)

{

 if(!date)

  return 0;

 if(date->month<1||date->month>12)

  return 0;

 return 1;

}

int SetDate(DATE date,int year,int month,int day)

{

 if(!date)

  return 0;

 date->year=year;

 date->month=month;

 date->day=day;

 return CheckDate(date);

}

int GetWeek(DATE date)

{

 int year,month,day;

 if(!date)

  return 0;

 year=date->year;

 month=date->month;

 day=date->day;

 if(month<=2)

 {

  month+=12;

  --year;

 }

 return (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7+1;

}

int QueryDay(void)

{

 DATE date;

 char cont;

 int year,month,day;

 static char *week[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};

 if(!(date=NewDate()))

  return 0;

 do{

    printf("请输入年月日 (XXXX,XX,XX)");

    scanf("%d,%d,%d",&year,&month,&day);

    if(SetDate(date,year,month,day))

    {

     printf("%4d年%2d月%2d日是%s,是否继续查询(Y/N)?",year,month,day,week[GetWeek(date)-1]);

     scanf("%c",&cont);

    }

    else 

    {

     printf("日期输入错误!\n");

    }

   }while(cont=='Y'||cont=='y');

 DestroyDate(date);

 return 1;

}

int ShowMonth(DATE date)

{

 int startweek;

 int days;

 int i;

 if(!date)

  return 0;

 startweek=GetWeek(date);

 days=DaysAMonth(date);

 printf("  S   M   T   W   S   F   S \n");

 startweek=startweek%7;

 for(i=0;i<startweek;++i)

 printf("    ");

 for(i=1;i<=days;++i)

 {

  printf(" %2d ",i);

  startweek=(startweek+1)%7;

  if(startweek==0)

   printf("\n");

 }

 if(startweek!=0)

 {

  printf("\n");

 }

 return 1;

}

int QueryMonth(void)

{

 int year,month;

 DATE date;

 

 if(!(date=NewDate()))

  return 0;

 printf("请输入要打印的月份(XXXX,XX)");

 scanf("%d,%d",&year,&month);

 if(SetDate(date,year,month,1))

 {

  printf("%4d年%2d月\n",year,month);

  ShowMonth(date); 

 }

 else

 {

  printf("月份输入错误!\n"); 

 }

 DestroyDate(date);

 return 1;

}

int QueryYear(void)

{

 int year;

 int month;

 DATE date;

 char cont;

 if(!(date=NewDate()))

  return 0;

 do{

    printf("请输入要打印的年份(XXXX)");

    scanf("%d",&year);

    printf("%4d年\n",year);

    for(month=1;month<=12;++month)

    {

     SetDate(date,year,month,1);

     printf("%2d月\n",month);

     ShowMonth(date);

    }

    printf("是否继续打印(Y/N)?");

    scanf("%c",&cont);

   }while(cont=='Y'||cont=='y');

 DestroyDate(date);

 return 1;

}

int ConfirmExit(void)

{

 char exit;

 printf("是否要真的退出(Y/N)");

 scanf("%c",&exit);

 if(exit=='Y'||exit=='y')

  return 1;

 else 

  return 0;

}

int Calendar(void)

{

 int menu=1;

 int tmp;

 do{

    switch(menu)

    {

     case 1 :

        printf("\n|1 查星期|  |2 月日历|  |3 年日历|  |4 退出|:");

        scanf("%d",&tmp);

     switch(tmp)

     {

      case 1 :

         menu=11;

         break;

      case 2 :

          menu=12;

          break;

      case 3 :

          menu=13;

          break;

      case 4 :

          menu=14;

          break;

      default :

          printf("选择有误!\n");

          break;

     }   

     break; 

     case 11 :

         QueryDay();

         menu=1;

         break;

     case 12 :

         QueryMonth();

         menu=1;

         break;

     case 13 :

         QueryYear();

         menu=1;

         break;

     case 14 :

       if(ConfirmExit())

        menu=0;

       else

        menu=1;

       break;

       default :

       return 0;

    }

    

   }while(menu);

   return 1;

}

void main()

{

 Calendar();

 system("pause");
}

//本程序在devc上面试运行,测试成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 万年历
相关文章推荐