万年历程序设计new_第1页
万年历程序设计new_第2页
万年历程序设计new_第3页
万年历程序设计new_第4页
万年历程序设计new_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-1 2011 年 1 月 13 日 目 录 第一章 课程设计的目的和要求.1 1.1 课程设计的目的 .1 1.2 课程设计的要求 .2 第二章 课程设计任务内容.3 2.1 功能需求.3 2.2 功能模块.6 2.2.1 功能模块图 .6 2.2.2 主要模块说明 .7 第三章 详细设计说明.9 3.1 程序设计思路 .9 3.2 函数功能说明.9 3.2.1 总函数流程图 .10 3.2.2 参数说明 .10 第四章 软件使用说明.13 第五章 课程设计心得与体会.17 附录 1 参考文献 .18 附录 2 源程序 .19 - -2 万年历系统 第一章第一章 课程设计的目的和要求课程设计

2、的目的和要求 1.1 课程设计的目的 通过本项课程设计,可以培养独立思考、 综合运用所学有关相应知识 的能力,能更好的巩固C 语言程序设计课程学习的内容,掌握 工程软件设 计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加 了解了 c 语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加 也体会到以后在工作中团队合作的重要性和必要性! 根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容; 通过调试典型例题或习题积累调试 C 程序的经验;通过完成辅导教材中的编程 题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。 在学习程序设计之前,我们首先要了解程序设

3、计的基础是什么,在学习 的时候应该重点掌握什么。 其实这一问题很好回答,重点是程序设计的基本概念、方法和思维方式, 其次才是程序设计语言(在本课程中就是 C 语言) 。我们开发程序的目的是为 了解决问题,而解决问题首先需要找出合适的解决方案,然后用合适的语言把 方案描述出来。显然,该过程的关键是分析问题并找出解决方案,而不是描述 方案。因此,程序设计课程的首要目标,是培养解决问题的基本思维方式,其 次才是语言知识。 因此,同学们在学习 C 程序设计的时候必须树立以下观念:(1)学习 思考的方法比学习语言更重要, (2)琢磨程序设计的思维模式比琢磨 C 语言的 知识更重要, (3)培养自己的思考

4、能力比记忆语言知识更重要。 另外,C 语言本身的复杂性也是其比较难学的原因之一。C 不仅可以用 来开发应用程序,更可用来设计系统程序。比起其他语言,C 增加的许多特点 - -3 就是为了设计高质量的系统软件。显然,这些特点也增加了学习 C 的难度。 通过 C 语言课程设计,使学生了解高级程序设计语言的结构,掌握基本 的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力, 具备初步的高级语言程序设计能力。为后续各门计 - -4 算机课程的学习和毕业设计打下坚实基础 1.2 课程设计的要求 本课程设计是C 语言程序设计课程实践环节的深化和延续。此次课程 设计的目的是以 C 程序设计语

5、言为基础,通过完成具有一定难度的课程设计题 目的功能描述、总体设计、程序编写及调试工作,加深对 C 语言相关知识的理 解与 Visual C+集成开发环境的使用,重点掌握文件操作函数的熟练运用,并 养成良好的程序设计习惯,提高自我分析问题、解决问题的能力,为进一步学 习高级编程技术及其相关课程打下良好基础 掌握面向对象程序设计的基本方法 ,熟练掌握 C+编程工具 ,根据问题 进行学习,拓广、深化 ,独立完成一个小型应用程序的设计、编码和测试,为 以后学习软件工程打下实践基础 系统说明书要求提交打印版或手写版(这是检查作业的依据)。内容包括: 系统需求描述(问题描述),系统结构设计(类体系设计)

6、,类的详细设计(各类定 义的基本功能,即主要数据和函数功能描述,以及类和类之间的交互),拟采用 开发平台(Visual C+) 作业报告:根据原有的系统设计,编码阶段的工作,整理书写作业报告, 内容包括:问题描述,系统设计,使用说明,讨论, 最后提交(电子版):实 验报告, 基本要求:1、要求利用 C 语言面向过程的编程思想来完成系统的设计; 2、突出 C 语言的函数特征,以多个函数实现每一个子功能;3、画出功能模块 图; 4、进行简单界面设计,能够实现友好的交互;5、具有清晰的程序流程图和数 据结构的详细定义;6、熟练掌握 C 语言对文件的各种操作。7、分析程序的功 能要求,划分程序功能模块

7、。8、代码的编写。定义数据结构和各个功能子函数。 9、程序的功能调试;10、完成系统总结报告以及使用说明书 (4)指导教师应做到教书育人。设计开始时要进行动员布置,对学生提出明 确的设计任务要求及注意事项,在设计期间要每天进行辅导和检查,及时予以 指导和帮助,使设计顺利进行。基层教学单位的指导教师应创造条件让学生使 - -5 用计算机进行设计,培养学生的计算机应用能力。 第二章第二章 课程设计任务内容课程设计任务内容 本程序通过 C 语言编程实现了一个万年历,能实现基本的万年历功能。万 年历的实现核心是要判断闰年和根据给定的日期计算其对应的星期,并按照合适 的方式输出日历. 2.1 功能需求

8、万年历能实现一些功能,主要包括以下几点: (1)日历显示功能。能根据系统日期进行初始化,如果没有任何输入,则显示系 统日期所在月份的月历。 判断星期,但根据蔡勒公式,可以很容易地有年月日推断出星期: nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nDay%7; 其中 year:要查询的年份 nday:从该年的一月一日起到该天的天数 w:得出的星期数,w=0 表示星期天。 在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过 定长度输出日期,在遇到某天时星期六时,就换行输出,因此可以按照月历的 格式输出。对于初始输

9、入当前月历,可以通过中的 time 和 localtime 函数取出系统时间进行初始化。 time_t timer; struct tm* gmt; time( gmt=localtime( gmt 就是一个时间结构体,可以从中取出年月日 (2)日历查询、闰年判断功能。输入日期进行查询,显示查询日期所在月份的 月历,还将显示所在年份是否为闰年 能被 4 整除但不能被 100 整除,或者能被 400 整除的年份为闰年,否则为平 - -6 年。日期的查询,就是直接打印改天所在月份的月历 (3)参数检查功能。如果输入日期不合法,查询将被拒绝,并显示提示信息。 判断日期是否合法,可以先判断年月日是否有

10、小于 0 的值,月和日是否有超出 最大值 12 和 31 ,如果通过此判断合法,再判断是否时闰年,如果时闰年,则 判断二月份是否满足要求,闰年二月份不能超过 29 天,平年二月份不能超过 28 天。在查询过程中,如果发现输入不合法或者不满足输入要求,则要求重新 输入。 (4)通过键盘操作(如:光标上、下、左、右移动键,pageup、pagedown 键) 调整年份、月份和日期,并显示调整后的日期及月历。 捕获键盘的输入,通过两个 getch();将后一个 getch()的返回值付给整型 或字符型 k,k 为相应键的 ascii 值,判断 ascii 值,就可以知道时哪个键的输 入。若捕获到某键

11、的输入,则设置相应的年或月或日的值,再进行刷性输出, 就可以实现日期的调整。 2.2 功能模块 2.2.1 功能模块图 本系统包括 4 个模块,分别是功能控制模块打印输出模块日历显示模块 和键值获取模块。 1、功能控制模块。该模块用于实现日期有效性检查判断是否是闰年和返 回指定日期对应的日期。 2、打印输出模块。该模块主要是进行输出显示,包括打印指定个数的空格 打印分隔线打印用户使用手册打印当前日期对应的星期以及打印指定的 星期。 3、日历显示模块。该模块是系统的核心模块,是用来显示指定日期所在月 份的月历。 4、键值获取模块。该模块接受键盘操作,获取键值,来进行日期调整,并 调用日历显示模块

12、中的函数来显示调整后的日历。 - -7 图 2-1 功能模块图 2.2.2 主要模块说明 (1)日历显示模块 日历显示是系统的核心模块,它控制着日历的生成和显示。其实现流程如 图所示。程序输入的是包含年月日的日期,输出 month 所在月份的月历,并突 出显示 day 所在的日期和 year 是否是闰年的标识。程序首先根据判断 year 其 是否是闰年,如果是则需要将该年 2 月份的天数设置为 29 天,接着判断 day 是 否超过 month 所在的月份的最大天数,如果超过则显示系统日期所在的月历。 然后进行星期输出的判断,如果输出的是该月的第一个星期,则判断该星期中 还有几天在本月(如,该

13、月 1 号是星期五,则表示该月第一个星期中只有两天 在本月,星期一到星期四在上月,则星期一到星期四在本月就不输出,仅有空 万年历体系 功能 控制 模块 打 印 输 出 模 块 日 历 显 示 模 块 键 值 获 取 模 块 日 历 显 示 日 历 查 询 修 改 日 期 帮 助 退 出 - -8 格表示) ,输出完第一周后,接着输出第二到第五(或者六)周,每周 7 天。在 输出过程中,如果遇到了 day 所在的日期,则突出显示 (2)键值获取模块 键值获取实现的是从键盘调整日期并显示调整后的日历。系统首先 判断 从键盘输入的 值,如果是右移键,表示增加月份。如果 左移键,表示减少月 份。如果上

14、移键,表示增加年份。如果下移键表示减少年份。如果上翻页键表 示减少日期。如果是下翻页键表示增加日期。如果 Q/q 键表示查询日期,此时 将输出提示信息,提示用户输入查询日期。在用户输入查询日期后,系统将调 用日期检查函数对输入日期的 合法性进行检测,如果输入日期不合格,则提示 错误信息并显示当前系统日期所在月的 月历;如果是 空格键表示重置,显示 当前系统日期所在月的 月历;如果是 Esc 键表示退出系统,按此键后,系统将 询问用户是否确定退出,在得到确定回答(用户输入 Y/y)后将退出系统。 - -9 第三章 详细设计说明 3.1 程序设计思路 (1)由于万年历具有以下特点: 平年 365

15、天(52 周+1 天),闰年 366 天(52 周+2 天)。平年 2 月 28 天,闰 年 2 月 29 天。 (2)根据万年历以上特点进行编写 1)首先对万年历年、月、日进行编写,编写程序先定义每月的天数为 28 天,如月份为 1、3、5、7、8、10、12 就定义天数为 31 天反之如果月份为 4、6、9、11 就输出天数为 30 天,由上可见 2 月份为 28 天但是如果为闰年就 有 29 天就要定义一个数组存放天数,用 while 循环控制。 2)再对其中的星期进行编写: 由于公元 1 月 1 日设为星期六,故 3 月 1 日为星期三,可以用万年 3 月 1 日星期算法(特别是那个三

16、)由于其公式为:某年 3 月 1 日星期几=(百年%4*5 天+年/4*5 天+年%4+月星期表+日+2 天)%7 闰 4 百年 3 月 1 日星期算法(百年%4=0)其公式为:某年 3 月 1 日星期 几=(年+年/4+月星期表+日+2 天)%7 例: 2000 年 3 月 1 日星期几 =(0+0/4+0+1+2)%7=3%7=星期三 平 4 百年 3 月 1 日星期算法(百年%40)其公式为:某年 3 月 1 日星期 几=(百年%4*5 天+年+年/4+月星期表+日+2 天)%7 例:2100 年 3 月 1 日星期几 =(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%

17、7=8%7=星期一(注意:2100 年是平年) 其中万年某日星期算法 其公式为:某日星期几=(百年%4*5 天+年+年 /4+月星期表+日+2 天)%7 3.2 函数功能说明 - -10 3.2.1 总函数流程图 图 3-1 总函数流程图 3.2.2 参数说明 (1)int isleapYear(int year); - -11 该函数判断某年是否是闰年,参数year表示要判断的年份,返回值1表示该 年为闰年,0表示该年为平年。 int IsLeapYear( int year ) if (year %4 = 0) else return 0; 流程图: Y N Y N N Y 图 3-2 闰

18、年判断 (2)struct tm* getDay(); 该函数用以取得系统的时间。该函数没有参数,返回值类型为 struct tm*,是 一个包含时间的结构体 struct tm* getDay()/从系统取得当前时间 time_t timer; struct tm* gmt; time( gmt=localtime( return gmt; 开始 Year%400Return 1 Year%4 Year%100 Return 0 Return 0Return 1 - -12 (3)int getwDay(int year,int month,int day); 该函数用以根据一个日期推断星期

19、,参数为要判断的年月日。返回值为整 型,123456分别表示星期一到星期六,0表示星期天。 int getwDay(int year,int month,int day)/取得星期 int nday=0,nDay,i,w; for(i=0;imonth-1;i+) nday+=daysOfMonthrunYear(year)i; nday+=day; nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nDay%7; return w; - -13 第四章 软件使用说明 1、进入程序后显示 图 4-1 程序显示 2、按任意字符键返回

20、主菜单 图 4-2 主菜单 3、进入主菜单后按 1,显示当前时间 - -14 图 4-3 日历显示、 4、在主菜单界面按 2,进行日历的查询并经行日期的合法性判断和闰年的判断。 图 4-4 输入合法 图 4-5 日历查询 - -15 图 4-6 输入不合法 图 4-7 修改日期 此情况下,当输入正确的日期后,就可以显示月历,然后可以返回主菜单。 5、在主菜单输入 3,进入日期调整界面,可以通过方向键以及 PageUp 和 PageDown 进行日期的调整 按向上键后出现如下结果 图 4-8 日期调整 6、在主菜单中输入 4,进入帮助界面 - -16 图 4-9 帮助菜单 7、在主界面中输入 5

21、,程序退出 图 4-10 程序退出 - -17 第五章 课程设计心得与体会 通过课程设计,一方面是为了检查我们一个学期来我们学习的成果,另 一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足 之处和薄弱环节,加以弥补和加强。通过对万年历的设计进一步的巩固了用 c 语言和 C+编写程序,并且有利于更好的掌握程序设计语言! 此程序是自己所写的第一个功能比较完整的能实现一定的实际功能的程序, 代码比较短,不到 250 行,实现的功能有显示当前日历,进行某天的查询,闰 年的判断,日期的合法性判断,日期的调整。然后在程序编写过程中,遇到了 一些细节性的问题,比如在乱输入的情况下,有时会

22、出现程序崩溃,后来通过 修改,修正了漏洞。到写报告为止,漏洞基本被找出,并得到修正。通过写这 个程序,我对程序的健壮性有了更深的认识,也更加注意程序的细节问题。在 万年历的编写过程中也体会到了做事情一定要细心、认真。更加知道了要掌握 好基础知识。还有体会到了成功的感觉。 通过本项课程设计也培养了我独立思考、综合运用所学有关知识的能力, 掌握工程软件的基本方法,强化上机动手变成能力,闯过理论与实践相结合的 难关! 在课程设计的过程中也知道了自己在以前的学习中有很大的不足导致在设 计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设 计过程中也学习了很多,掌握了自己以前没有学好的知

23、识,虽然一时可以掌握 完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面, 要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!都是要更好的 掌握该门知识,提高自己的自身的修养,提高自己的能力!为以后的工作打下 良好的知识基础和技能基础! - -18 附录 1 参考文献 1谭浩强, 张基温. C 语言程序设计教程. 北京: 高等教育出版社, 2000 2吴伟民. 数据结构课程设计. 北京: 清华大学出版社.2010 孙宝山. Visual 3 c#.NET 应用程序设计. 北京:中国铁道出版社. 2008 4谭洪强. C+程序设计. 北京: 清华大学出版社. 2009 5

24、李兰友,潘旭华,王占刚,孙宝山等编著.Visual c#.net 应用程序设计.北京. 中国铁道出版社. 2008 - -19 附录 2 源程序 #include #include #include #include #include #define KEYNUMUp 0 x48 #define KEYNUMDown 0 x50 #define KEYNUMLeft 0 x4b #define KEYNUMRight 0 x4d #define KEYNUMPageUp 0 x49 #define KEYNUMPageDown 0 x51 int year,month,day;/全局变量记录时

25、间 int daysOfMonth212=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,3 1,30,31, 30,31; int runYear(int year)/判断是否是闰年 int flag=0; if(year%400=0|(year%4=0 return flag; struct tm* getDay()/从系统取得当前时间 time_t timer; struct tm* gmt; time( gmt=localtime( return gmt; int dayExame(int year,int month,

26、int day)/检查日期是否正确 if(year0|month12|day31) return 0; switch(month) case 1: case 3: case 5: case 7: - -20 case 8: case 10: case 12: if(day31)return 0;break; case 4: case 6: case 9: case 11: if(day30)return 0;break; default: if(runYear(year) else if(runYear(year)=0 return 1; int getwDay(int year,int mo

27、nth,int day)/取得星期 int nday=0,nDay,i,w; for(i=0;imonth-1;i+) nday+=daysOfMonthrunYear(year)i; nday+=day; nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nDay%7; return w; void printCalender(int year,int month,int day); void setDay(int printf(%c:上个月 %c:下个月n,27,26); printf(PageUp:昨天 PageDown:明

28、天n); printf(其他:返回主菜单n); char k; getch(); k=getch(); switch(k)/通过方向键和 PageUp、PageDown 键来调整日期 case KEYNUMUp:year-; if(dayExame(year,month,day)=0)year+; printf(%c,7);/检查日期 的合法性,/若错误,保持日期不 - -21 变,并警告 system(cls);printCalender(year,month,day);setDay(year,month,day);break; case KEYNUMDown:year+; if(dayEx

29、ame(year,month,day)=0)year-;printf(%c,7); system(cls);printCalender(year,month,day);setDay(year,month,day);break; case KEYNUMLeft:month-; if(dayExame(year,month,day)=0)month+;printf(%c,7); system(cls);printCalender(year,month,day);setDay(year,month,day);break; case KEYNUMRight:month+; if(dayExame(ye

30、ar,month,day)=0)month-;printf(%c,7); system(cls);printCalender(year,month,day);setDay(year,month,day);break; case KEYNUMPageUp:day-; if(dayExame(year,month,day)=0)day+;printf(%c,7); system(cls);printCalender(year,month,day);setDay(year,month,day);break; case KEYNUMPageDown:day+; if(dayExame(year,mon

31、th,day)=0)day-;printf(%c,7); system(cls);printCalender(year,month,day);setDay(year,month,day);break; default:; void printCalender(int year,int month,int day)/打印月历 int i; char wday74=Sun,Mon,Tue,Wed,Thu,Fri,Sat; printf( %d 年%d 月%d 日n,year,month,day); printf(*n); for(i=0;i7;i+) printf(%5s,wdayi); printf(n); int w; int nowDay=1; w=getwDay(year,month,nowDay);/找到第一天的星期 int n; n=daysOfMonthrunYear(year)month-1; switch(w)/放置第一天 case 0:printf(%5d,nowDay);break; - -22 case 1:printf(%10d,nowDay);break; case 2:printf(%15d,nowDay);break; case 3:printf(%20d,nowDay);b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论