1、每 4年(3个平年+1个闰年)共208周+5天 注意这个“5天” 每百年共100*(208周+5天)-1天=5217周+5天 注意这个“5天”(整百年暂设为平年) 每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天注意这个“0天”和“1天”(4个整百年只有一个闰年) 即400年一轮回!(原来万年历400年前是一家)【二】根据万年历以上特点进行编写:首先对万年历年、月、日进行编写,编写程序先定义每月的天数为28天,如月份为1、3、5、7、8、10、12就定义天数为31天反之如果月份为4、6、9、11就输出天数为30天,由上可见2月份为28天但是如果为闰年就有29天就要
2、定义另一个函数#define Year(x) (x%4=0&x%100!=0|x%400=0) ? 1:0当为闰年时可得1加上该程序便可得到每月的天数。 具体程序见(五、万年历程序)再对其中的星期进行编写:由于公元1月1日设为星期六,故3月1日为星期三,可以用万年3月1日星期算法(特别是那个三)由于其公式为:某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7或 某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7 闰4百年3月1日星期算法(百年%4=
3、0) 其公式为:某年3月1日星期几=(年+年/4+月星期表+日+2天)%7 例:0000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三 1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三 2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三 2001年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四 2004年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一 2008年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六 2042年3月1日星期几=(42+42/4+0+1+2)%7=55%7=星
4、期六 平4百年3月1日星期算法(百年%46 即2027年元旦是星期六2018年春节 16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5 2月表=0(平年) 故 0+5=5 即2018年春节是星期五2099年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2 12月表=2(平年) 故 2+2=4 即2099年12月31日是星期四对于上面的分析以及公式的推论和计算证明可以对万年历中的星期进行了编写具体编写程序见(五 、万年历程序)中。五 、万年历源程序#includestdio.h dos.hconio.hstdlib.h#defin
5、e Year(x) (x%4=0&0 /*判断闰年*/int numofMonth(int y,int m) int day,t=28;if(m=1|m=3|m=5|m=7|m=8|m=10|m=12) day=31; /*定义以上月份为31天*/else if(m=4|m=6|m=9|m=11) day=30; /*定义以上月份为30天*/elset+=Year(y);day=t; /*闰年二月29天,平年28天*/return day; int numofYear(int y) int t=365; /*平年365天*/t+=Year(y);/*闰年366天*/return t;int n
6、umofbeforeDays(int y,int m,int d) int sum=d,i;for(i=1;im;i+) sum+=numofMonth(y,i);return sum;int numofafterDays(int y,int m,int d) int sum=0,i;for(i=m;=12;sum-=d;int isDay(int y,int m,int d) int year=1900,month=1,week=1,i; /*定义万年历是从1900年开始*/long sum=0;for(i=year;y;sum+=numofYear(i);/* +sum;*/ i=sum%
7、7;week=(week+i)%7;return week;void empty(int n) int i;for(i=0;n;printf(%*c,6, );void OutPutCalender(int y,int m,int d)/*计算x年x月x是星期几*/ int week,i,num,t;week=isDay(y,m,1);%6d/%02d/%02dn,y,m,d);%6s%6s%6s%6s%6s%6s%6sn,SunMonTueWedThuFriSatempty(week);num=numofMonth(y,m);=num;i+) %6d,i);t=(week+i)%7;if(t
8、=0) n /*光标移到下一行*/long numBTDays(int y1,int m1,int d1,int y2,int m2,int d2)/*定义两个不同日期*/ for(i=y1+1;y2;if(y1=y2) sum-=d1;for(i=m1;m2;sum+=numofMonth(y1,i);sum+=d2;elsesum+=numofafterDays(y1,m1,d1);sum+=numofbeforeDays(y2,m2,d2);int Select_mean() int sm;1. OutPut Calendern /*输出当前月份的日历*/2. Helpn /*帮助*/0
9、. Quitn /*退出*/Please enter choose(0-2): /*从0-2中选择*/do scanf(%d,&sm); /*输入sm*/while(sm3);return sm;void Help()/*输出帮助栏的内容*/ 1. OutPut Calendern 2. System Helpn 0. QuitnPage Up: Up yearn /*上一年*/Page Down: next yearn /*下一年*/ - : next monthn /*上一月*/ 8;if(inkeySCAN=77) if(month=12)month=1;year1+;OutPutCal
10、ender(year1,month,day);/*输出日历*/ elsemonth+; if(inkeySCAN=75) if(month=1)month=12;year1-;elsemonth-;if(inkeySCAN=73) if(year1=1900) year1=year;elseyear1-;if(inkeySCAN=81) if(inkeySCAN=28)break;break; /*终止循环*/case 2:Help();case 0:exit(0);default:Enter ERROR! 六 运行过程2. 在光标处按下“1”后回车,将会显示:以上的显示也证明了条件的第2条可
11、以“显示星期!”3. 在光标处按下“2”后回车,将会显示:按着帮助所讲进行了运行可知:按“ Page Up ”键其下面接着会显示上一年该月的万年历,按“ Page Down ”键其下面会接着显示下一年该月的万年历;按“ ”键下面将会接着显示当年上一个月的万年历,按“ ”键将会接着在下面显示去下一个月的万年历。4. 由上所显示键入“0”后将会退去该程序。七、心得体会 万年历的编写过程中我们体会到了做事情一定要细心、认真。更加知道了要掌握好基础知识。还有体会到了成功的感觉!在万年历的设计过程中更加体会到了团队合作的重要性,“一个诸葛亮比不上三个臭皮匠。”知道了只有团队合作才会更好的完成设计!也体会
12、到以后在工作中团队合作的必要性和重要性!通过本项课程设计也培养了我独立思考、 综合运用所学有关相应知识的能力,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!在这次课程设计中也知道了自己的动手能力不强有待进一部的提高! 也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!为以后的工作打下良好的知识基础和技能基础!八、附录职务学号姓名工作组长200902013401阙小花程序编写组员200902013439李继淼程序测试与调试200902013426郑泽龙页面设置与布局参考文献资料与索引名编著者出版社C语言程序设计向 华清华大学出版社C程序设计第二版谭浩强
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1