用c语言编写一个万年历

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上面试运行,测试成功。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值