C语言简易万年历

新手上路,这是基于公历第一年的第一天是星期一的原理而做出的简易万年历,总共只有四个函数便可实现计算,应该说还是一个比较简洁的也比较简单的万年历,欢迎大家为它的进一步完善和改进提出建议

 

#include<stdio.h>
#include <time.h>
  
#define YEARDAYS 365 //定义一年天数
#define YEARMONS 12  //定义一年月数
#define WEEKDAYS 7  //定义一周天数


//用枚举数据结构定义一个星期里的每一天的称呼
typedef enum{
    Sun,Mon,Tue,Wed,Thu,Fri,Sat
}WEEK;

//用枚举数据结构定义十二个月
typedef enum{
    JAN=1,FEB,MAT,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
}MONTH;
//输出万年历
void printMonth(const WEEK firstDay, int length)
{
 WEEK weekDay = firstDay ;
 int i;
 printf("     Sun    Mon    Jue    Wed    Thu    Fri    Sat\n");
 for(i=1;i<=weekDay;i++)
 {
  printf("       ");//输入空位以顶替当月第一周第一天之前的所缺天数
 }
 for(i=1;i<=length;++i)
 {
  weekDay = (++weekDay) % WEEKDAYS;
  printf("%7d",i);
  if(weekDay == 0)
   printf("\n");
 }
    printf("\n");
}

//判断是否是闰年,是就返回1,不是就返回0

int isLeapYear(const int y)
{
 return(y % ( y % 100 ? 4 : 400 ) ? 0 : 1);
}


//得到当年的第一个月的第一天是第一周的第几天
int getYearOfDay(const int year)//得到年份
{
 int yearNumber = year - 1;//由于公元纪年的起点是公元1年
 int n = 0,i=0;
 
 if(year == 0)
  return 1;

 for( i=1;i<year;i++)
  if(isLeapYear(i)==1)
   n++;//记录出因为闰年而多出的天数

 return(YEARDAYS * yearNumber + n+1) % WEEKDAYS;//1是第一天
}
//计算天数
void printCalendar(const int y , const int m)
{
 int i=0;
 WEEK yDAY = getYearOfDay(y);
 int vDay = isLeapYear(y);//如果是闰年则等于1
 int monWeeks [YEARMONS+1];
 int monLen [YEARMONS+1];

 //为每个月设置具体天数
 monLen[0] = 0;
 monLen[JAN] = 31;
 monLen[FEB] = 28 + vDay;//计算闰月
 monLen[MAT] = 31;
 monLen[APR] = 30;
 monLen[MAY] = 31;
 monLen[JUN] = 30;
 monLen[JUL] = 31;
 monLen[AUG] = 31;
 monLen[SEP] = 30;
    monLen[OCT] = 31;
 monLen[NOV] = 30;
 monLen[DEC] = 31;


 monWeeks[0] = 0;
 monWeeks[JAN] = yDAY;//得到当年的第一个月的第一天是第一周的第几天
 for(i = JAN ; i < DEC ; i++)
  monWeeks[i+1] = ((monWeeks[i] + monLen[i]) % WEEKDAYS);//得到每个月的第一天是第一周的第几天

 printf("&d, &d \n", y, m);
 printf("---------------------------------------------------\n");
 printMonth(monWeeks[m] , monLen[m]);//传入当月的第一天是第一周的第几天,和当月的天数
    printf("\n");
}

int main(void)
{
    struct tm when;  //定义系统自带的tm结构体对象when
    time_t now;    
    int Y = 0;//所需的年份储存变量
    int m = JAN;//所需的月份储存变量
    int quit = 0;//循环控制变量
   //设置循环,便于多次查询
    time( &now );//获取当前时间,存now里
       when = *localtime( &now );   //获取当地时间,根据地址传值;
    printf( "Current time is %s\n", asctime( &when ) );//输出当前时间
    printCalendar (when.tm_year+1900,when.tm_mon+1);//输出当前万年历
 while(!quit)
 {
  printf("Please input the year,month;-1 for break\n");//提示输入所需年月
  scanf("%d,%d",&Y,&m);//输入年月
  if(Y == -1)
   quit = 1;//退出程序
  else if(Y < 10000 && Y > 0 && m > 0 && m < 13)
   printCalendar (Y,m);//输出Y年m当月的万年历
  else
   printf("请按要求输入数字!\n");//确保输入正确
 }
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值