《C语言的科学与艺术》学习笔记之万年历代码

来源:互联网 发布:如何自学大数据 编辑:程序博客网 时间:2024/05/16 18:18

万年历算法:根据具体的某一天的真实日期及星期为基点,往前往后运算。 

 

#include <stdio.h>
#include <genlib.h>
#include <simpio.h>

#define Sunday    0
#define Monday    1
#define Tuesday   2
#define Wednesday 3
#define Thursday  4
#define Friday    5
#define Saturday  6

void GiveInstructions(void);
int GetYearFromUser(void);
void PrintCalendar(int year);
void PrintCalendarMonth(int month,int year);
void IndentFirstLine(int weekday);
int MonthDays(int month,int year);
int FirstDayOfMonth(int month,int year);
string MonthName(int month);
bool IsLeapYear(int year);

//主函数
main()
{
 int year;

 GiveInstructions();
 year=GetYearFromUser();
 PrintCalendar(year);
}

//程序说明

void GiveInstructions(void)
{
 printf("This program displays a calendar for a full\n");
 printf("year. The year must not be before 1900.\n");
}

//获取年份

int GetYearFromUser(void)
{
 int year;

 while (TRUE)
 {
  printf("Which year?");
  year=GetInteger();
  if (year>=1900) return (year);
  printf("The year must be at least 1900.\n");
 }
}

//打印日历函数

void PrintCalendar(int year)
{
 int month;

 for (month=1;month<=12;month++)
 {
  PrintCalendarMonth(month,year);
  printf("\n");
 }
}

//打印月份

void PrintCalendarMonth(int month,int year)
{
 int weekday,nDays,day;

 printf("    %s %d\n",MonthName(month),year);
 printf(" Su Mo Tu We Th Fr Sa\n");
 nDays=MonthDays(month,year);
 weekday=FirstDayOfMonth(month,year);
 IndentFirstLine(weekday);
 for (day=1;day<=nDays;day++)
 {
  printf(" -",day);
  if (weekday==Saturday)
  {
   printf("\n");
  }
  weekday=(weekday+1)%7;
 }
 if (weekday!=Sunday)
 {
  printf("\n");
 }
}

//显示第一行

void IndentFirstLine(int weekday)
{
 int i;

 for (i=0;i<weekday;i++)
 {
  printf("   ");
 }
}

//计算月份的天数

int MonthDays(int month,int year)
{
 switch (month)
 {
  case 2:
   if (IsLeapYear(year))
   {
    return (29);
   }
   return (28);
  case 4:
  case 6:
  case 9:
  case 11:
   return(30);
  default:
   return (31);
 
}

//计算月份中第一天是星期几

int FirstDayOfMonth(int month,int year)
{
 int weekday,i;

 weekday=Monday;
 for (i=1900;i<year;i++)
 {
  weekday=(weekday+365)%7;
  if(IsLeapYear(i))
   weekday=(weekday+1)%7;
 }
 for (i=1;i<month;i++)
 {
  weekday=(weekday+MonthDays(i,year))%7;
 }
 return (weekday);
}

//显示月份的名字

string MonthName(int month)
{
 switch(month)
 {
 case   1: return ("January");
 case   2: return ("February");
 case   3: return ("March");
 case   4: return ("April");
 case   5: return ("May");
 case   6: return ("June");
 case   7: return ("July");
 case   8: return ("August");
 case   9: return ("September");
 case  10: return ("October");
 case  11: return ("November");
 case  12: return ("December");
 default:  return ("Illegal month");
 }
}

//判断是否为闰年

bool IsLeapYear(int year)
{
 return (((year%4==0)&&(year0!=0))||(year@0==0));
}
 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 北京租房遇到黑中介怎么办 上海租房子不让带孩子怎么办 租的房子没窗户怎么办 北京安河桥安河家园租房被骗怎么办 领完失业金后怎么办 北京公租房太小怎么办 申请公租房太小怎么办 房东电费收贵了怎么办 申请公租房工资超了怎么办 重庆公租房工资超了怎么办 公租房申请父母房子贷款怎么办 公产房父母去世办公证怎么办 动迁过程中承租人去世了怎么办 公租房的房间带阳台怎么办 公租房合同到期没有社保怎么办 租房合同没有到期违约了怎么办 租房户到期不搬怎么办 公租房摇号摇到了又怎么办 公租房被清退会怎么办 公租房摇不到号怎么办 公租房到期不搬怎么办 租房到期租客不搬怎么办 房产证面积与实际不符怎么办 社保晚交了1天怎么办 个人社保忘交了怎么办 个人社保晚交了怎么办 医保晚交了几天怎么办 辞职后转为灵活就业养老怎么办 公司名称变更提取不了公积金怎么办 五险合一软件已经减员怎么办 法人社保不在投标单位怎么办 换工作单位后社保怎么办 在北京孩子没有一老一小怎么办 深户小孩怎么办社保卡 社保卡没办下来去医院住院怎么办 老年社保卡丢了怎么办 外墙掉瓷砖伤车伤人怎么办 医保卡姓名弄错了怎么办 走工伤和走社保怎么办 公司在朝阳社保在海淀怎么办 公司没缴纳个税怎么办