您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于C语言的万年历(内附程序)
课程设计课程名称C语言程序课程设计题目名称编写万年历系统学生学院专业班级学号学生姓名指导教师2009年06月04日广东工业大学课程设计任务书题目名称编写万年历系统学生学院专业班级姓名学号一、课程设计的内容二、课程设计的要求与数据1、进一步掌握和利用C语言进行程序设计的能力;2、进一步理解和运用结构化程序设计的思想和方法;3、初步掌握开发一个小型实用系统的基本方法;4、学会调试一个较长程序的基本方法;5、学会利用流程图或N-S图表示法;6、掌握书写程序设计开发文档能力。三、课程设计应完成的工作1、编写完成相应题目程序;2、编写课程设计报告,课程设计报告的内容包括一下6个部分:1)需求分析:包括设计题目、设计要求以及系统功能需求分析;2)总体设计:包括系统总体设计框架和系统功能模块图;3)详细设计:包括主要功能模块的算法设计思路以及对应的工程流程图;4)调试分析过程描述:包括测试数据、测试输出结果,以及对程序调试过程中存在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等,适当的包含结果截图);5)总结:课程设计完成了哪些功能,有没有什么扩展功能?还有哪些地方需要改经?课程设计过程中的学习体会和收获、对本次课程设计的认识以及自己的建议等内容;6)附录:主要源代码,含必要的注释。3、答辩:在实验式建立程序运行的环境,并在指导老师的监督下,独立解决问题、运行程序和回答老师问题。四、课程设计进程安排序号设计各阶段内容地点起止日期1下达任务书,说明设计要求;收集资料实验3#51316周前2总体方案设计,详细设计实验3#51716周前3编写程序,调试分析实验3#51715、16周4撰写报告并上交,答辩实验3#51716周五、应收集的资料及主要参考文献发出任务日期:年月日指导老师签名:计划完成日期:年月日基层教学单位负责人签章:主管院长签章:目录1目的与要求——————————————42总体方案——————————————53系统设计——————————————53.1功能模块设计——————————————54调试分析——————————————95总结和展望——————————————96附录——————————————107答辩记录——————————————168指导教师意见——————————————171目的与要求目的:编写一个一万年历系统,为学生提供一个动手动脑、独立实践的机会,将课本上的理论知识和实际应用问题进行有机结合,锻炼学生分析、解决实际问题的能力,提高学生项目开发及程序调试能力。总体要求:1)对系统进行功能模块分析、控制模块分析正确;2)系统分析要实用;3)编程简练,可用,功能全面,具有较好的健壮性;4)说明书、流程图要清楚;题目要求:模仿现实生活中的挂历。当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)。当系统日期变到下一月时,系统自动翻页到下一月。2总体方案要模仿现实生活中的挂历,因此我认为程序功能至少要以下方面:1)显示系统的年、月、日和时间(时间为可选模块,因为题目不作要求);2)模仿现实挂历的外表,即每7天换一行,每一天对应当天是星期几;3)每月天数及星期几要与现实一致;4)最好有查询功能,能够查询某年某月的挂历;5)在各功能间切换时要自然,并有相应的文字提示;6)界面友好、美观。7)程序函数合理,简洁,名称含义明了,有相应注释。3系统设计3.1功能模块设计1)定义全局变量和全局数组、指针等;2)把程序分为若干个函数,分别为:1·showtime():显示系统时间;2·nowyear()、nowmonth()、nowday():得到系统时间的年、月、日。3·getkey1(intyear,intkey)、getkey2(intmonth,intkey):检测按键,若按了上下左右方向键就return给下一个应用它的函数。4·isleap(intyear):计算该年份是否为闰年,因为闰年和非闰年的2月份天数不同。5·isweek(intyear,intmonth,intday):计算某年某月某天为星期几,在本程序中他有两个作用,1是计算某月的第一天星期几,以决定前面有多少个空格,2是计算系统时间当天是星期几。6·showdata():显示系统时间当月的挂历——题目要求之一。7·checkdata():显示要查询月的挂历。8·reno():刷新系统时间和当月的挂历,能够实现题目中“当系统时间变为下一月时自动翻到下一月。9·str():显示要查询月的挂历并实现循环查询。10·main():主函数,整合其它函数实现显示系统时间、查询月挂历等一系列功能。3)流程图:主流程:showtime():nowyear()、nowmonth()、nowday():getkey1(intyear,intkey)getkey2(intmonth,intkey):Isleap(intyear):intisweek(intyear,intmonth,intday):intreno():intshowdata():main():intcheckdata():各个函数互相嵌套,并最终汇集到main()函数下,共同实现目的功能——(1)显示系统时间并能够自动翻页;(2)查询某年某月功能;(3)两模块间无缝连接,自由切换。intstr():4调试分析按题目的要求,我最初制作了一个挂历,完全满足题目要求——显示当前月的挂历、时间变后自动翻页。但是我认为这个最初的作品不够完美,偏短(只有几十行),因此后来我在最初作品的基础上加入了新的功能并加以完善,最终完成了我现在的作品。在原基础上,我加入了3个新的功能——(1)显示时间精确到秒,并每秒刷新一次,即保持与系统时间一致;(2)加入查找功能,通过方向键可以查询公元后的任何一个月的挂历;(3)显示当月挂历模块与查询模块之间实现无缝转换。在制作过程中也遇到了很多问题,通过努力都一一得到解决:1)许多函数以前没见过,最终通过百度获取到——时间函数time(NULL)、localtime(<)、ctime(<);刷屏函数clrscr();检测键盘输入函数getch()、!kbhit(),等等。2)最初在函数isweek()中,用week=allday%7-1来计算当天是星期几,在调试中发现,有时正常有时出错,经检查发现是上述代码有问题:当星期六时结果是-1,很明显错误。后来改为week=(allday-1)%7后恢复正常。3)调试过程中发现在查询模式下只能查询当前月(年)的前一个月(年)和后一个月(年),经研究发现是因为变量不在str()函数中而是在另一个函数中,修改值无法保存,因此每次循环后年和月就初始化了。后来我把年和月的变量放到str()函数中,问题解决。······经过最终调试,本程序已经可以完美的实现上述各个功能。5总结和展望经过本次任务,我对C语言的制作有了更深层次的了解,制作技巧也相应有了提高,也熟悉了很多以前没学过、考试不会考但很实用的函数、制作方法等。更重要的是,这是我的第一次C语言大作业,它令我从以前的最多编写几十行的程序的程度进步到能够编写几百行的代码,学会宏观的思考如何编写一个大程序,学会全面思考问题。通过这次作业,我也增加了对C语言的兴趣,相信我以后会有更多进步。我还有更多的想法去改进我的这个程序,由于时间有限,这次无法实现。我期待在有空后能修改出一个更完美的程序。6附录#includestdio.h#includetime.hintkey;intyear,month;intmon[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}};time_tlt;intshowtime()/*显示系统时间*/{lt=time(NULL);printf(星期/月/日时间年\n);printf(%s,ctime(<));/*输出字符串形式的系统时间*/}intnowyear()/*系统的年份*/{structtm*local;lt=time(NULL);local=localtime(<);returnlocal-tm_year+1900;/*系统年份从1900年为0年开始计算*/}intnowmonth()/*系统的月份*/{structtm*local;lt=time(NULL);local=localtime(<);returnlocal-tm_mon+1;}intnowday()/*系统在哪一天*/{structtm*local;lt=time(NULL);local=localtime(<);returnlocal-tm_mday;}intgetkey1(intyear,intkey)/*检测键盘的上下方向键*/{if(72==key)/*上方向键代码是72*/{year++;}elseif(80==key)/*下方向键代码是80*/{year--;}returnyear;}intgetkey2(intmonth,intkey)/*检测键盘的左右方向键*/{if(77==key)/*右方向键代码是77*/{month++;}elseif(75==key)/*左方向键代码是75*/{month--;}returnmonth;}intisleap(intyear)/*判断是否是闰年*/{/*被4整除但不被100整除的年时闰年*/intleap;/*被400整除的是闰年*/leap=((year%4==0)&&(year%100!=0)||(year%400==0));returnleap;}intisweek(intyear,intmonth,intday)/*判断X年X月X日是星期几*/{inti,j,week;intallday=0;for(i=0;iyear;i++){if(1==isleap(i))/*闰年有366天*/{allday=allday+366;}else{allday=allday+365;/*非闰年有365天*/}}for(j=1;jmonth;j++){allday=allday+mon[isleap(year)][j];}allday=allday+day;week=(allday-1)%7;/*计算当天为星期几,星期日至六为0至6*/returnweek;}intshowdata()/*显示系统月份的挂历*/{inti,z;intj=0;printf(\n);printf(%d年%d月\n,nowyear(),nowmonth());printf(*********************************************\n);printf(SunMonTuesWedThurFriSat\n);printf(*********************************************\n);z=isweek(nowyear(),nowmonth(),1);for(i=0;iz;i++){printf();}for(i=0;imon[isleap(nowyear())][nowmonth()];i++){if((i==nowday()-1)&&(i9))/*在系统时间的今天上做记号【】*/{printf([%d],i+1);}elseif(i==nowday()-1){printf([%2d],i+1);}elseif(i==nowday()){printf(%5d,i+1);}else{printf(%6d,i+1);}if((0==(z+i+1)%7)&&((i+1)!=mon[isleap(nowyear())][nowmonth()])){/*每7天换一行*/j++;printf(\n);}}if(j==3)/*令提示语保持在同一行*/{printf(\n\n\n\n);}if(j==4
本文标题:基于C语言的万年历(内附程序)
链接地址:https://www.777doc.com/doc-5108882 .html