万年历程序设计说明书_第1页
万年历程序设计说明书_第2页
万年历程序设计说明书_第3页
万年历程序设计说明书_第4页
万年历程序设计说明书_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

. . 数据结构课程设计数据结构课程设计 设设计计说说明明书书 万年历的实现 学生姓名 学号 班级 成绩 指导教师 数学与计算机科学学院数学与计算机科学学院 20122012 年年 9 9 月月 8 8 日日 . . 数据结构课程设计评阅书 题 目万年历的实现万年历的实现 学生姓名学号 成绩: 教师签名: 年 月 日 成绩: 教师签名: 年 月 日 总成绩: 室主任签名: 年 月 日 注:指导教师成绩 60%,答辩成绩 40%,总成绩合成后按五级制记入。 . . 课程设计任务书 2012201220132013 学年第学年第 1 1 学期学期 专业: 计算机科学与技术 学号: 姓名: 课程设计名称: 数据结构课程设计 设计题目: 万年历的实现 完成期限:自 2012 年 8 月 27 日至 2012 年 9 月 8 日共 2 周 设计依据、要求及主要内容(可另加附页): 运用 C/ C+结构体、函数、数据结构等基知识,按以下要求编程实现万年历的功能:1) 阐述设 计思想,画出流程图;2) 输入任一年,判断该年是否为闰年; 输入年月日计算该日为当年的那一天; 3)输入任一年,显示该年的日历,日历包括阳历、农历、节气;4). 说明测试方法,写出完整的运 行结果,较好的界面设计. 设计要求: 1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么? (而不是怎么做?)限制条件是什么?确定问题的输入数据集合。 2)逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原 则划分模块,定义主程序模块和各抽象数据类型。逻辑设计的结果应写出每个抽象数据类型的定义 (包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用 关系图; 3)详细设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要综合考虑系统功 能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操 作的规格说明尽可能明确具体。详细设计的结果是对数据结构和基本操作做出进一步的求精,写出数 据存储结构的类型定义,写出函数形式的算法框架; 4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使 程序中逻辑概念清楚; 5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的 各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序 及其注释,形成格式和风格良好的源程序清单和结果; 6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法 的时间、空间复杂性分析; 7)编写课程设计报告; 以上要求中前三个阶段的任务完成后,先将设计说明书的草稿交指导老师面审,审查合格后方可 进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。 指导教师(签字): 教研室主任(签字): 批准日期: 2012 年 8 月 27 日 . . . . 摘要摘要 设计了一个万年历软件,该万年历具有闰年判断,输入某年月日查询该日期所对应的星期,计算 该日期是本年中的第几天及输出年历的功能。本计算器采用 VC+作为软件开发环境,采用年历推算的 方法输出年历。操作简单易懂,界面清晰明了,易于被用户接受。 关键词关键词:万年历; 闰年;查询 . . 目目 录录 1 1 课题描述课题描述 .1 2 2 需求分析需求分析 .2 3 3 流程设流程设计计 .3 4 4 详细设计详细设计 .6 5 5 程序编码程序编码 .7 6 6 程序调试与运行结果程序调试与运行结果 .10 7 7 结果分析及总结结果分析及总结.12 参考文献参考文献.13 . . 1.1. 课题描述课题描述 运用 C/ C+结构体、函数、数据结构等基知识,按以下要求编程实现万年历的功能: 1).输入任一年,判断该年是否为闰年; 2).输入年月日计算该日为当年的哪一天; 3).输入任一年,显示该年的日历,日历包括阳历、农历、节气。 在程序设计的过程中,要注意以下要求:1).阐述设计思想,画出流程图;2).说明测试方法,写出 完整的运行结果,较好的界面设计。 . . 2.2. 需求分析需求分析 1).闰年的判断 该函数主要对年份进行判断,当年份满足一定的条件,则该年为闰年,若不满足,则该年为平年。 2).输入年月日计算该日为本年的哪一天 该函数首先要明确需要计算的是输入日期是星期几,其次是计算输入日期是该年中的第几天。该 函数是先进行闰年的判断,以便其后对数组的调用,依次将月份相加,最后所得总和加上日期即可得 到所要计算的天数;然后利用这个天数和公式 first=(n+(n-1)/4-(n-1)/100+(n-1)/400)%7,计算出星期几。 3).年历的输出 该函数主要是输入某年年份,对其进行计算,而后输出该年年历。 . . 3.3. 流程设计流程设计 该函数包括三个主要的子函数,闰年的判断,输入任一年月日,计算该日为当年的哪一天及输出 年历函数。 1).闰年的判断,如图 3.1 开 始 输入年份 判断条件 平 年闰 年 结 束 不满足满足 图 3.1 判断闰年的流程图 . . 2).输入任一年月日,计算该日为当年的哪一天,如图 3.2 开始 输入年月日 判断闰年 2 月为 28 天2 月为 29 天 For 循环计算天数For 循环计算天数 计算星期几 结 束 3.2 判断输入日期为哪一天的流程图 3).输出年历,如图 3.3 开 始 输入年份 计算星期 输出年历 结 束 3.3 输出年历的流程图 满足 不满足 . . 4).主函数,如图 3.4 开 始 While 循环 判断闰年 查询输入年月日为该年 的哪一天 输出年历 结束 3.4 主函数的流程图 . . 4.4. 详细设计详细设计 1).int judge(int b) / 判断是否闰年 if(b%4=0 else return -1; 该函数是用来判断输入年份是否为闰年。函数利用 b%4=0 int sum=0; a=judge(year); /判断是否为闰年 if(a=1) /当该年为闰年时,计算天数 for(i=1;imonth;i+) sum=sum+ryeari-1; sum=sum+day; if(a=-1) /当该年为平年时,计算天数 for(j=1;jmonth;j+) sum=sum+nryearj-1; sum=sum+day; return sum; 该函数是输入任一年月日,计算该日为当年的哪一天。函数首先判断闰年,再将闰年和平年分开 计算天数,最后输出要求的天数。 3).void display() 该函数的作用是输出年历。该函数调用了判断闰年的函数,计算天数的函数及计算星期的函数, 用蔡勒公式 first=(n+(n-1)/4-(n-1)/100+(n-1)/400)%7 计算出某年的第一天是星期几,并推算出该年年历, 最后调整格式输出年历。 4).void main() 该函数是程序的主函数,用以调用各个子函数。 . . 5.5. 程序编码程序编码 #include #include int ryear12=31,29,31,30,31,30,31,31,30,31,30,31; /存储闰年每月天数 int nryear12=31,28,31,30,31,30,31,31,30,31,30,31; /存储非闰年每月天数 int judge(int b) / 判断是否闰年 if(b%4=0 else return -1; int sumdays(int year,int month,int day) /计算天数 int i,j,a; int sum=0; a=judge(year); /判断是否为闰年 if(a=1) /当该年为闰年时,计算天数 for(i=1;imonth;i+) sum=sum+ryeari-1; sum=sum+day; if(a=-1) /当该年为平年时,计算天数 for(j=1;jmonth;j+) sum=sum+nryearj-1; sum=sum+day; return sum; int week(int days,int n) /用总天数计算星期 int b; int first; first=(n+(n-1)/4-(n-1)/100+(n-1)/400)%7; /蔡勒公式(计算某年的第一天是星期几) b=(first+days-1)%7; return b; void display() /打印年历 int n,days; int i,j,c; . . int a,m,w; while(n=0) /判断数据合法性 printf(n-请输入需要打印的日历年份:); scanf(%d, printf(n); a=judge(n); for(i=0;i12;i+) days=sumdays(n,i+1,1);/计算总天数并将值赋给 days w=week(days,n); /计算星期并将值赋给 w if(a=1) m=ryeari; if(a=-1) m=nryeari; printf(ttt %d 年 %d 月nn,n,i+1); printf(t 周日t 周一t 周二t 周三t 周四t 周五t 周六n); for(j=1;j=m;j+) /当 j 值小于每月最大值 if(j=1) /当每月 1 号小于当前星期值时,跳格 for(c=0;cw;c+) printf(t); printf(t %d,j); /否则打出与星期所对应的日期 if(w%7=6) /当星期值除以 7 的余数为六时,换行 printf(n); w=week(days+j,n) ; /计算下一个星期值 printf(nn); void main() /主函数 int year,month,day; int n,a; int sum,w; printf(tt=万年历=nn); printf(t1=查询年份是否为闰年!nn); printf(t2=计算您输入的日期为该年中的第几天!nn); printf(t3=输出该年年历!nn); printf(t4=退出!n); while(1) printf(n-请输入您要进行的操作(序号 1-4):); scanf(%d, while(n4) /判断数据合法性 printf(n-输入有误! 请重新输入(序号 1-4):); scanf(%d, . . if(n=1) /当 n 等于 1 时,调用 judge 函数 while(year=0) printf(n-请输入您要查询的年份:); scanf(%d, a=judge(year); if(a=1) printf(nt-%d 年是闰年!n,year); if(a=-1) printf(nt-%d 年是平年!n,year); if(n=2) /当 n 等于 2 时,调用 sumdays 函数 while(year31|day=0) /判断数据 的合法性 printf(n-请输入您要查询的年月日(如*/*/*):); scanf(%d/%d/%d, a=judge(year); sum=sumdays(year,month,day); w=week(sum,year); if(w=0) w=7; if(a=1) printf(nt-%d/%d/%d 是星期%d,为本年中的第%d 天! !n,year,month,day,w,sum); if(a=-1) printf(nt-%d/%d/%d 是星期%d,为本年中的第%d 天! !n,year,month,day,w,sum); if(n=3) display(); /当 n 等于 3 时,调用 display 函数 if(n=4) /当 n 等于 4 时,程序结束 printf(nt-谢谢使用! O(_)Onn); break; . . 6. 程序调试与运行结果 1).首先是程序主界面,先进行数据合法性验证,输入正确选项 1,进入判断闰年功能,输入-1, 判断数据合法性,数入 2012,进行判断,为闰年。如图 6.1 图 6.1 程序主界面及进行操作 1 时的界面 2).输入正确选项 2 时,先进行数据合法性判断,再输入 2012/03/01,进行计算,输出结果为该 天是星期四,是 2012 年中的第 61 天。如图 6.2 . . 图 6.2 进行操作 2 时的界面 3).输入正确选项 3 时,先输入 0,进行数据合法性判断,再输入 2012,然后输出年历。如图 6.3 . . 图 6.3 进行操作 3 时的界面 4).输入正确选项 4 时,程序结束。如图 6.4 图 6.4 进行操作 6.4 时的界面 . . 7. 结果分析及总结 该程序是一个可以实现日历查询的程序,可以进行星期及闰年的查询。在编写该程序时,经常会 犯一些细节性的错误,比如传参数时有问题,函数调用也有一些小错误,从而导致程序运行有错误。 该程序要求须作出万年历的阴历,阳历及节气,但由于在完成的途中,对该程序的阴历及节气的 算法掌握有很大欠缺,所以最终只是将万年历的阳历输出,此外完成了该程序所要求的其他项目,及 对闰年的判断和对某日的查询。 在程序的设计中,最大的困难是万年历的输出模块,首先是对阳历计算的核心算法的设计,其次 是对数据合法性的验证,最后是将输出格式调整好,保证程序的美观性。该程序中部分函数不利于模 块化,主函数过于累赘,不利于程序的健壮性。 在以后程序设计的过程中,希望尽可能将各个子函数增强其可调用性,尽可能减少程序多余的

温馨提示

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

评论

0/150

提交评论