C语言实现万年历

  #include

  #include

  #include

  #include

  typedef struct today

  {

  int day;

  int month;

  int year;

  } today;

  int day_cankao[2][13]={

  {0,31,28,31,30,31,30,31,31,30,31,30,31},

  {0,31,29,31,30,31,30,31,31,30,31,30,31}

  };

  char *week[]=

  {

  "Sun","Mon","Tue","Wen","Thu","Fir","Sat"

  };

  struct tm *todayuse;//struct tm定义c语言中time的结构体

  today today_current;

  int getweekday(today today_usenow)

  {

  // w = y + [y/4] + [ c/4 ] – 2c+ [13 * (m+1) / 5] + d – 1

  //其中,c是年份的前两位,y是年份的后两位,m是月份,d是日期,这里需要注意的是,如果是1月和2月,c和y需要按照上一年来取值。

  int w=0;

  int year=today_usenow.year;

  int month=today_usenow.month;

  if(today_usenow.month==1 || today_usenow.month==2)

  {

  month+=12;

  year--;

  }

  int y=year%100;

  int c=year/100;

  int m=month;

  w=y + y/4 + c/4 - 2*c+ 26* (m+1) / 10 + today_usenow.day -1;

  while(w<0)

  {

  w+=7;

  }

  return (w%7);

  }

  int is_leap(int year)

  {

  if( (year%4==0 && year%100!=0) || (year%400==0))

  {

  return 1;

  }

  else

  return 0;

  }

  int getmonthdays(int year,int month)

  {

  return day_cankao[is_leap(year)][month];

  }

  void print_calendar(today today_usenow)

  {

  printf("---------------------------

  ");

  printf("Sun Mon Tue Wen Thu Fir Sat

  ");

  int firstday=0;

  today today_usehere=today_usenow;

  today_usehere.day=1;

  int day=getweekday(today_usehere);//日期前

  //int daysuseafter

  int days=getmonthdays(today_usenow.year,today_usenow.month);//月总数

  // 0 1 2 3 4 5 6 // 6

  int daysbefore=0;

  if((today_usenow.month-1)==0)

  {

  //现在为1月,去年的十二月份

  daysbefore=getmonthdays(today_usenow.year-1,12);

  // printf("%d is",daysbefore);

  }

  else

  {

  daysbefore=getmonthdays(today_usenow.year,today_usenow.month-1);

  }

  int daysbefoeit=daysbefore-day+1;

  printf("");

  int count=1;

  if(day==0)

  {

  daysbefoeit-=7;

  for(int i=0;i

  {

  printf("%d ", daysbefoeit);

  daysbefoeit++;

  }

  printf("

  ");

  count=7;

  }

  else

  {

  for(int i=0;i

  {

  printf("%d ", daysbefoeit);

  daysbefoeit++;

  }

  count=day;

  }

  int m=1;

  for(int i=0;i<=6-day;i++)

  {

  if(m<10)

  {

  printf(" %d ",m);

  }

  else

  {

  printf("%d ",m);

  }

  m++;

  }

  printf("

  ");

  if(day==0)

  {

  count=14;

  }

  else

  {

  count=7;

  }

  int hang=0;

  while(m<=days)

  {

  if(m<10)

  {

  printf(" %d ",m);

  }

  else

  {

  printf("%d ",m);

  }

  hang++;

  if(hang==7)

  {

  printf("

  ");

  hang=0;

  }

  m++;

  }

  if(day==0)

  {

  count=days+7;

  }

  else

  {

  count=day+days;

  }

  int newmonth=1;

  for(int j=hang;j<7;j++)

  {

  if(newmonth<10)

  {

  printf(" %d ",newmonth);

  }

  else

  {

  printf("%d ",newmonth);

  }

  newmonth++;

  }

  printf("

  ");

  count=count+7-hang;

  for(int j=0;j< 42-count;j++)

  {

  if(newmonth<10)

  {

  printf(" %d ",newmonth);

  }

  else

  {

  printf("%d ",newmonth);

  }

  newmonth++;

  }

  }

  //int getmonth

  int main()

  {

  time_t timep;

  struct tm *p;

  time(&timep);

  p =localtime(&timep); //此函数获得的tm结构体的时间,是已经进行过时区转化为本地时间

  //p = gmtime(&timep); //把日期和时间转换为格林威治(GMT)时间的函数

  /*printf("Year: %d

  ", 1900+p->tm_year);

  printf("Month: %d

  ", 1+p->tm_mon);

  printf("Day: %d

  ", p->tm_mday);

  printf("Hour: %d

  ", p->tm_hour);

  printf("Minute: %d

  ", p->tm_min);

  printf("Second: %d

  ", p->tm_sec);

  printf("Weekday: %d

  ", p->tm_wday);

  printf("Days: %d

  ", p->tm_yday);

  printf("Isdst: %d

  ", p->tm_isdst);

  */

  //printf("%d",day_cankao[0][12]);

  today_current.year=1900+p->tm_year;

  today_current.month=1+p->tm_mon;

  today_current.day= p->tm_mday;

  today use=today_current;

  int c1,c2;

  printf(" %d 年 %d 月 %d 日

  ",today_current.year,today_current.month,today_current.day);

  print_calendar(today_current);

  while(1)

  {

  c1 = getch();

  if(c1==27)

  {

  printf("您已经退出系统");

  break;

  }

  if(c1==110)

  {

  printf(" %d 年 %d 月 %d 日

  ",today_current.year,today_current.month,today_current.day);

  //printf("%d

  ",getweekday(today_current));

  print_calendar(today_current);

  use=today_current;

  continue;

  }

  c2 = getch();

  //printf( "%d %d",c1,c2);

  if(c1==224 && c2==72)

  {

  use.month+=1;

  if(use.month==13)

  {

  use.month=1;

  use.year+=1;

  }

  printf(" %d 年 %d 月 %d 日

  ",use.year,use.month,use.day);

  //printf("%d

  ",getweekday(today_current));

  print_calendar(use);

  }

  if(c1==224 && c2==80)

  {

  use.month-=1;

  if(use.month==0)

  {

  use.month=12;

  use.year-=1;

  }

  printf(" %d 年 %d 月 %d 日

  ",use.year,use.month,use.day);

  //printf("%d

  ",getweekday(today_current));

  print_calendar(use);

  }

  if(c1==224 && c2==75)

  {

  use.year-=1;

  printf(" %d 年 %d 月 %d 日

  ",use.year,use.month,use.day);

  //printf("%d

  ",getweekday(today_current));

  print_calendar(use);

  }

  if(c1==224 && c2==77)

  {

  use.year+=1;

  printf(" %d 年 %d 月 %d 日

  ",use.year,use.month,use.day);

  //printf("%d

  ",getweekday(today_current));

  print_calendar(use);

  }

  printf("

  ");

  printf("按上下按钮,进行月份变换

  ");

  printf("按左右按钮,进行年份变换

  ");

  printf("按ESC按键,退出系统

  ");

  printf("按N按钮,查看当前日期

  ");

  }

  //上 224 72

  //下 224 80

  //左 224 75

  //右 224 77

  //esc 27

  // n 110

  return 0;

  }