1、select 表示菜单选择的变量i 表示月份的变量j 表示一个月中的某一天的变量sum 判断某天是一年中的第几天的变量number判断某天离公元1年1月1日还有几天的变量a 表示每月天数的数组变量year1 系统时间年份的变量month1 系统时间月份的变量day1 系统时间日期的变量2总体设计2.1应用到的C语言头文件: #include time.h #include stdio.hmath.hwindows.hconio.h在程序中应用了大量的自定义函数,都涉及为了使程序更简洁明了。其中:int isleap() /*判断是否为闰年*/ int eachyeartotal() /*判断某
2、天是一年中的第几天*/int week() /*对天数进行判断确定是星期几*/void display1() /*输出年历*/void display2() /*输出月历*/int counterdays() /*判断今天距特定日期的天数*/void whatweek() /*判断是星期几*/void jieri() /*判断是否公历节日*/void setDay2() /*通过键盘“”“”控制月历的变换*/这些函数的定义极其相应的内部程序共同构筑起了这个万年历总程序。其中的isleap函数是用来判断输入的年份是否为闰年,实现了预计功能的第一个方面;theweek函数则是为了实现判断星期而编写
3、的.2.2判断是否为闰年图2.1判断闰年2.3功能模块图图2.2功能图 3详细设计源程序 /*包含的头文件*/#define KEYNUMUp 0x48 /*宏定义*/#define KEYNUMDown 0x50 #define KEYNUMLeft 0x4b #define KEYNUMRight 0x4d#define KEYNUMPageUp 0x49 #define KEYNUMPageDown 0x51 int eachyeartotal(int year,int month,int day); /*函数声明*/ int counterdays(int year,int month
4、,int day);int nowtime(int year,int month,int day);int week(int year,int month,int day);int maxDay(int year,int month);int isleap(int year);void whatweek(int year,int month,int day);void display(int year ,int month);void display2(int year,int month);void display3(int year,int month,int day) ;void set
5、Day1(int year,int month,int day);void setDay2(int year,int month,int day);void setDay3(int year,int month,int day);void jieri(int month,int day);void display1(int year);void getmenu();void main() /*主函数*/ int year,month,day,select; while(1) getmenu(); printf( 请输入相应数字:); /*菜单选择 */ scanf(%d,&select); s
6、ystem(cls switch(select) case 1: /*当选择为1时显示年历*/ 年历显示:输入年(如2011):year); if(year0&year=1&month=12&dayday=maxDay(year,month) display3(year,month,day); 提示 按PageUp:前一天 按PageDown:后一天 按其他键: setDay3( year,month, day); case 4: exit(0); default: /*当输入其他数字时,输入无效,重新输入*/int isleap(int year) /*判断是否为闰年*/ if(year%4
7、=0&year%100!=0|year%400=0) return 1; return 0;int maxDay(int year,int month) /*每月的天数*/ int a=31,28,31,30,31,30,31,31,30,31,30,31; /*每个月中的天数*/ if(isleap( year) a1=29; /*闰年2月份有29天*/ return amonth-1; int eachyeartotal(int year,int month,int day) /*判断某天是一年中的第几天*/ int i,sum=0; for(i=1;imonth;i+) sum+=max
8、Day(year,i); sum+=day; return sum;int week(int year,int month,int day) /*对天数进行判断确定是星期几*/ int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400 +eachyeartotal(year,month,day); number=number%7 ; return number;void display(int year ,int month) /*输出年月*/ int max,number,i,j=1; max=maxDay(year,month); n
9、umber=week(year,month,1); %4s %4s %4s %4s %4s %4s %4sn,SunMoTueWed, ThuFrisat for(i=0;number;i+) /*1号前的星期补空格*/ while(jtm_year) ; month1=(1+p-tm_mon) ; day1=(p-tm_mday); /*获取系统时间year1、month1、day1分别为年、月、日*/days0=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day); days1=(ye
10、ar1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400+eachyeartotal(year1,month1,day1);days=days0-days1; /*计算出两个日期之间的时间差*/n 今天距%d年%d月%d日还有%d天nn,year,month,day,days); return days;void whatweek(int year,int month,int day) /*判断是星期几*/ int number;number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachyear
11、total(year,month,day);number=number%7 ;switch( number) case 0: printf( n %d年%d月%d日是星期日,year,month,day);break;n %d年%d月%d日是星期一printf( n %d年%d月%d日是星期二n %d年%d月%d日是星期三n %d年%d月%d日是星期四 case 5:n %d年%d月%d日是星期五 case 6:n %d年%d月%d日是星期六printf( 出现错误! );void jieri(int month,int day) /*判断是否公历节日*/ if(month=1) switch
12、(day),这天是元旦 if(month=2) case 14:,这天是情人节 if(month=3) case 8:,这天是妇女节 case 12:,这天是植树节 if(month=4) case 1:,这天是愚人节 if(month=5),这天是劳动节,这天是青年节 if(month=6),这天是儿童节 if(month=7) ,这天是建党节 if(month=8),这天是建军节 if(month=9) case 10:,这天是教师节 if(month=10),这天是国庆节void setDay1(int year,int month,int day) /*通过键盘“”“”控制年历的变换*
13、/ char k; getch(); k=getch(); switch(k) case KEYNUMUp: /*“”年份减小*/ if(year2) 警告!超出范围! year-; setDay1(year,month,day); case KEYNUMDown: /*“”年份变大*/ year+;void setDay2(int year,int month,int day) /*通过键盘“”“”控制月历的变换*/ char k; switch(k) case KEYNUMLeft: /*“”月份变小*/ if(month11) month-=12;9999); month+; void
14、setDay3(int year,int month,int day) /*通过键盘“PageUp”“PageDown”控制日期的变换*/ case KEYNUMPageUp: /*“PageUp”日期变小*/ if(daymaxDay(year,month) day=1;12)10000);void getmenu() /* 显示菜单选择*/ *主菜单* nn * 欢迎进入万年历系统 * nn * 1、年历显示 * nn * 2、月历查询 * nn * 3、日期查询 * nn * 4、退出系统 * nn * nn4调试分析打开软件,进入如下菜单界面,输入数字进行选择图4.1主界面4.1年历的显示(1)输入数字1进入年历的显示图4.2输入年历图(2)输入年份2013,显示2013年的年历如下图4.3该年年历显示(3)按键盘显示上一年(2012年)的年历,显示如下图4.4上一年年历显示(4)按键盘显示下一年(2014年)的年历,显示如下图4.5 下一年年历显示4.2月历的显示(1)在菜单中选择2,进入月历的显示,输入2013,8,显示2013年8月份月历.图4.6当月月历显示(2)按键盘显示上一个月(7月)的月历,显示效果如下图4.7上月月历显示(3)按键盘显示下个月(9月)