万年历设计报告_第1页
万年历设计报告_第2页
万年历设计报告_第3页
万年历设计报告_第4页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、精品文档C 语言程序设计实训任务书题目:万年历学生姓名:学号:班级: _ 物联网工程 _题目类型:软件工程( R)指导教师:一、设计目的1. 进一步掌握和利用 C语言进行程序设计的能力;2. 进一步理解和运用结构化程序设计的思想和方法;3. 初步掌握开发一个小型实用系统的基本方法;4. 学会调试一个较长程序的基本方法;5. 学会利用流程图或 N-S 图表示算法;6. 掌握书写实训开发文档的能力(书写实训报告)。二、设计任务及内容用 C语言编写万年历1. 功能选择可以用菜单实现。例如可以选择1按年查询2 按月查询3按日查询0 退出用户通过不同的数字进入不同的菜单2. 万年历显示公元后任何年份的日

2、历,类似于一般挂历上的格式3. 输入年份,判断是否为闰年4. 输入年月日,判断改日为星期几5. 输入年份,打出 12 个月历,输入月份,打出该月的日历6. 要求用多个函数实现三、设计要求1. 用 C 语言实现系统;1欢迎。下载精品文档2. 利用结构体、数组等实现数据结构设计;3. 系统的各个功能模块要求用函数的形式实现;4. 文档:实训说明书每个学生一份,并装在统一的资料盒中。5. 光盘:每个学生文档和程序资料分别建在一个以自己学号和姓名命名的文件夹下,并要求每班负责人汇总每个学生的文件放在以班级姓名命名的文件夹下, 刻录成一张光盘,放在一个专门的资料袋中。四、提交的成果1. 设计任务书一份(

3、学校统一格式)2. 设计说明书一份,内容包括:1) 中文摘要 100 字, 关键词 3-5 个。2) C 语言课程实训题目、内容、要求。3)总体设计(包含几大功能模块)。4)详细设计(各功能模块的具体实现算法 流程图)5)数据结构设计描述,各模块(函数)的功能介绍,参数说明等。6)调试分析(包含各模块的测试用例,及测试结果。)7)总结(实训完成了哪些功能,还有哪些地方需要改进,及通过实训有何收获,调试程序的体会等)8) 参考文献、致谢等。五、主要参考资料1. 王连相 . C/C+程序设计 武汉大学出版社2. 谭浩强 C语言程序设计 ( 第 2 版) 学习指导清华大学出版社3. 杨莉 , 龚义建

4、 C 语言程序设计实训指导教程华中科技大学出版社4. 张小东 , 郑宏珍 C 语言程序设计与应用人民邮电出版社5. 郭翠英 C 语言 C 语言课程实训案例精编中国水利水电出版社6郭有强 C 语言程序设计清华大学出版社7李丹程 , 刘莹 , 那俊 C 语言程序设计案例实践清华大学出版社2欢迎。下载精品文档8李丽娟 C 语言程序设计教程人民邮电出版社9武雅丽 , 王永玲 , 解亚利 C 语言程序设计清华大学出版社六、各阶段时间安排(共1 周)日期内容地点星期一教师讲解设计要求,准备参考资料1B203星期二分析系统,方案设计1B203星期三方案设计,编程1B203星期四调试程序,书写实训说明书1B2

5、03星期五完成实训说明书,答辩1B2033欢迎。下载精品文档摘要C 语言在近年来国内外得到了很广泛的推广, 而电子万年历也是人们在日常的生活需求中必不缺少的一部分。 我们通过这学期对 C 语言的学习,做出了一个万年历程序。该程序实现了简易的万年历的功能,实现了万年历的四个基本功能。 当进入此程序,通过界面的提示可以很容易的进入万年历功能选择所实现的功能。 此万年历有以下四个常能用的功能:按年查询、按月查询、按日查询、打印整年日历。这四个常用功能基本满足了人们在生活中的对万年的需求, 本万年历跨度较其他万年历稍大一些,可以查询到更广的年历。关键词 :C语言;电子万年历;数组4欢迎。下载精品文档5

6、欢迎。下载精品文档目录1 绪论 .11.1 设计目的 .11.2 设计背景 .11.3 需求背景 .11.4 小组分工 .2 总体设计32.1 总模块设计 .32.2 使用头文件说明32.3 使用变量声明 .42.4 运用到 C语言的函数42.5 函数调用关系 .53 详细设计63.1 函数运行流程图63.2 闰年判断模块 .73.3 年历打印模块 .83.4 星期计算模块 .93.5 打印月历模块 .113.6 日期合法性检查模块134 调试分析144.1 错误分析 .144.2 错误修改 .144.3 运行程序 .154.4 闰年的判断 .154.5星期计算的功能164.6 月历查询功能

7、.174.7 打印整年年历功能185 源程序清单19总结266欢迎。下载精品文档致谢27参考文献.7欢迎。下载精品文档8欢迎。下载精品文档1 绪论本课题主要是针对简易电子万年历的功能,以及子模块的设计展开探究。 课题主要包括了使用 C语言来调用各个模块的函数,使这些函数相互之间联系起来,解决用户需要的简易问题,同时考察组员对C 语言中的函数、顺序、循环、if语句的嵌套、for 语句的嵌套的操作能力。 并且在探究的过程中培养组员分析问题和解决问题的能力,提高组员之间团结合作的能力。1.1 设计目的1. 通过实训可以综合运用所学有关相应知识的能力,能更好的巩固C语言程序设计课程学习的内容,掌握工程

8、软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关。更加了解了 C 语言的好处和其可用性。 同时增加了同学之间的团队合作精神,更加也体会到以后在工作中团队合作的重要性和必要性。2. 通过实训,使学生了解高级程序设计语言的结构, 掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力, 具备初步的高级语言程设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。1.2 设计背景C 语言是近年在国内外得到迅速推广应用的一种机器语言。 C语言功能丰富,表达能力强,应用灵活方便,应用范围广,目标成序效率高,可移植,极有高级语言的优点,又具有低级语言的许多特点。

9、因此, C语言特别适合于编写各种软件。在这次的实训中我将把日常生活中最经常接触的 日历的查询,利用 C语言的程序编成一个简单的万年历查询系统。 通过这个小小的系统可以实现部分功能。 在程序中你能看到很多熟悉的 C语言关键字,同时也加入了很多自己课外了解到的一些关键字。1.3 需求背景目前比较流行电子万年历程序,比较典型的是 windows 中各版本的日历程序。 但是这些程序总是有一定的限制,需要一个跨度很大的日历来方便人们的生活,而 C 语言程序与设计充分发挥了这个优点, 用很短的文本填补了这一个空白。 同时也用强有力的证据告诉人们 C语言这个新生事物的应用范围是极其广阔的。1.4 小组分工组

10、内成员是一个整体,小组是一个团队,强调集体行动,不搞个人主义,组内对于各种任务要有明确分工,并且要明确落实到人。9欢迎。下载精品文档组长:白博康在以身作则的基础上,对组员的学习、行为、思想等进行监督、督促和指导。包括随时与指导老师联系,分派组员任务。同时负责实训内容的收尾、排版、制图、检查错误、部分程序的调试等工作。组员:蔡家豪在报告书中做了很大的贡献,在我们的报告书中担任了流程图制作,资料搜集的工作, 为我们的工作顺利进行起到了很大的作用。同时为组内同学做好了后勤保障工作。组员:程虞华在我们组中寻找源代码以及对源代码进行改进,为我们提供了程序设计的基础,并和其他组员一起查询错误。在报告书中为

11、我们编辑了详细程序这一部分。同时协助其他组员进行实训中表格的制作,流程图的制作。10欢。迎下载精品文档2 总体设计2.1 总模块设计用户通过不同的数字进入不同的菜单, 万年历显示公元后任何年份的日历, 类似于一般挂历上的格式,输入年份,判断是否为闰年;输入年月日,判断为星期几;输入年份,打印出查询月历;输入年份,打出该月的日历。万年历星月期历打闰查查询询印年整判年断日历图 2.1功能模块图2.2 使用头文件说明本程序应用到的头文件:#includestdio.h在使用标准函数库中的输入输出函数时,编译系统 要求程序提供有关的信息 (例如对这些输入输出函数的声明),#include的作用就是用来

12、提供这些信息的, stdio.h是 C 编译系统提供的一个文件名,stdio是“standard input & output”的缩写,即有关 标准输入输出 的信息。11欢。迎下载精品文档在程序中用到系统提供的标准函数库中的输入输出函数时,应在程序的开头写上一行: #includestdio.h或者是 #include,这样才能调用 库函数。二者主要在于查找效率上有差别,#include一般用包含系统文件,它是查找先从系统目录查找开始查找; #includestdio.h一般用包含项目文件,它是查找先从项目目录查找开始查找。在编写 C语言中,常用到 printf()和 scanf() 函数,他

13、们就是 stdio.h中的两个标准输入输出函数,所以编程语句中如果要用到此两个函数就一定要在头文件中加入#include。#includewindows.h头文件封装了库函数以及一些类, 将一些复杂的工作由库函数处理, 而用户不必把精力放在这些地方。比如说 cout ,为标准输出流,其实说到底还是 函数调用 ,不过这个函数有些特殊,用的是 运算符重载 ,确切地说是重载了 “表示菜单选择的变量x表示月份的变量y表示一个月中的某一天的变量sum判断某天是一年中的第几天的变量number判断某天离公元 1 年 1 月 1 日还有几天的变量a表示每月天数的数组变量12欢。迎下载精品文档2.4 运用到

14、C语言的函数在程序中应用了大量的自定义函数,都 为了使程序更简洁明 了。其中:intIsLeapYear ()/* 判断是否为闰年 */char *NameOfMonth ()/* 判断某天是一年中的几月*/char *WeekDay ()/* 对天数进行判断确定是星期几*/int jiri() /* 判断这一月的总天数 */int X=(int)(year/100);/*世纪数 */int Y=X-(int)(X/4);/*如果按 4 年一闰来算, Y 指的是比实际上多算的天数,在下面需要减去 */int GetDayOfMonth () /* 输出某一年中的月历 */int tmp_day

15、s=GetDays(year,month,1);/*本月积日 */int ShowCalendar() /* 输出某一年的某一月的详细日历 */int DateCheck /*判断合法性 */jiri=GetDays(year,month,1);/*获取特定日期的总天数 */ShowCalendar(year,month,1);/*输出年历 */int counterdays()/* 判断今天距特定日期的天数 */int dayofweek()/* 判断是星期几 */int GetDays/* 判断今天的日期 */2.5 函数调用关系上述函数调用关系如下图所示:主函数 main()IsLeap

16、YearGetDaysGetDayOfMoShowCalendanthrDateCheck(是否合法)否结束是13欢。迎下载精品文档图 2.5函数调用关系3 详细设计3.1 函数运行流程图通过外部菜单的功能和相应的提示进行输入即进入所要运行的功能。定义了一个主函数 int main ()这个函数就是我们整个程序运行的主要框架。通过 while 这个主循环让用户输入相应的功能前的代码来实现想要的功能。通过在Choise之后输入所需运行的程序的代码进行执行相应的程序。3输入年月调用打印月历打印该月月历开始输入选项数字判断1 或 414输入年份调用闰年调用年历判断打印判断该打印该年是否年年历闰年。1

17、4欢迎下载2输入年月日调用星期判断判断该日为星期几精品文档图 3.1 函数运行流程图3.2 闰年判断模块用户通过输入1 进入闰年判断的程序,进入闰年判断后,通过对函数intIsLeapYear ()的循环进行判断,最后输出结果,输出结果后返回主菜单。开始输入 year是否year%4=0是否year%100!=0year%400=0是是闰年非闰年返回图 3.2 闰年判断模块15欢。迎下载精品文档进入菜单选择闰年判断功能,输入进行查询, 查询后将显示查询的年份是否为闰年。若是,则显示此年为闰年,若不是闰年则显示此年不是闰年。首先第一步定义了IsLeap year这个函数,这个函数主要是为实现闰年

18、判断这个功能的。通过year%4=0&year%100!=0|year%400=0判断输入的该年是否为闰年,从而通过接下的步骤 return返回相应的数据。相关代码如下:int IsLeapYear (int year)if(year%4=0&year%100!=0|year%400=0)return 1;/*闰年返回 1*/else return 0;/*平年返回 0*/3.3 年历打印模块通过输入 4,选择打印整年日历功能,输入正确即可执行,输入不正确返回主界面。年份判断输入年份调用闰年判断函数调用大小月判断函数打印该年月份返回16欢。迎下载精品文档图 3.3 年历打印模块进入主界面后,

19、用户通过选择打印整年日历的功能。进入打印整年日历的程序中后,用户只需输入想要打印当年的年份,接下来就是对月份的判断,此时年份的判断已经通过了,这时先对大月小月进行判断,if中列出的都是小月,通过判断大小月和之前石否为闰年的判断接下来进一步对二月的天数进行确定。当return 0之后,这些月份都为小月,每都有30 天,之前判断的闰年此时调用判断闰年的函数,用是否闰年对二月的天数进行判断,系统即可进行打印,该程序在循环中截止于 break ,打印部分的程序如下:if (uMonth=4|uMonth=6|uMonth=9|uMonth=11)if (uDay30)return 0;else if

20、(uMonth=2)if (IsLeapYear(uYear)if (uDay29)return 0;elseif (uDay28)return 0;return 1;printf(请输入要判断的年份: Year);scanf(%d,&year);17欢。迎下载精品文档for (month=1;month);scanf(%d %d %d,&year,&month,&day);totaldays=GetDays(year,month,day);printf(%d年%d月%d日是%srnrn,year,month,day,WeekDay(totaldays+1)%7);break;3.5 打印月历

21、模块通过之前对年的判断, 现在可通过输入某一年的某一个月来打印该月的日历。在打印月历的时候,需要调用之前的年历的函数。开始输入一个年月调用年历的函数打印出输入的该年的月份的日历返回19欢。迎下载精品文档图 3.5 年历打印模块代码如下:if (month0year-;/*把 1 月、 2 月视为上一年的13 月、 14 月(纯粹为了计算需要)*/month+=12;sum=(int)(365.25*(year-1900)+(int)(30.6*(month+1)+day-Y-49;/*以365.25 (本来实际太阳年是365.2425 天)来计算是为了计算按4 年一闰的整数年总天数 , 加上月

22、份天数再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加的)*/* 月份以 30.6 天的平均值计算。最后减去的49,是多加的一个月以及其余相差天数的和,可得到1900 年 1 月 1 日的积日为 0*/return sum;/*返回距离 1900 年 1 月 1 日的总天数(积日) */int GetDayOfMonth(int month,int year)int tmp_days=GetDays(year,month,1);/*本月积日 */int DayOfMonth=0;month+;/*下个月 */if (month12)month=1;/*遇到月份为 12 月的情况,月份为1,

23、年份加 1*/year+;DayOfMonth=GetDays(year,month,1);/*下个月的积日 */20欢。迎下载精品文档DayOfMonth-=tmp_days;/*下月 1 日的总天数(距离1900 年 1 月 1 日的积日)减去当前月 1 日的总天数 */return DayOfMonth;/*返回当前月总天数 */进入主界面菜单之后,通过用户选择月历查询的功能即可进入阅历查询的功能。进入月历查询的功能之后,用户需输入具体的年月进行查询。输入的格式为: “年月 ”,输入后,系统将进入年和月的循环结构中进行计算,计算完成之后,此循环中止于 break 。case 3:prin

24、tf(请输入要显示的月份(空格隔开):Year Month);scanf(%d %d,&year,&month);ShowCalendar(year,month,1);break;3.6 日期合法性检查模块在使用输入时, 总会有输入错误的情况, 根据不同情况下输入错误的情况,程序也做出了相应的判断。详细情况如下:在闰年判断的过程中, 通过之前的判断, 在最后进行合法性的判断, 判断输入的年份是否合法。int IsLeapYear (int year)if(year%4=0&year%100!=0|year%400=0)return 1;/*闰年返回 1*/elsereturn 0;/*平年返回

25、 0*/21欢。迎下载精品文档int DateCheck(int uYear,int uMonth,int uDay)/*合法返回 true ,非法或超出范围返回 false*/在年份的判断中if(uYear9999|uMonth12|uDay31)是对年份合法性的判断, 年份判断成功之后即可执行if之后的语句,进行下一步月份的判断。if (uYear9999|uMonth12|uDay31)return 0;在之前的天数判断后, 此时就有对输入有误日期判断的语句,通过这几句调用了之前的 int year和 int day进行求和,之后若有错误,即返回输出日期有误。int GetDays (i

26、nt year,int month,int day)int sum=0;if (DateCheck(year,month,day)=0)return -1;/*日期有误 */4 调试分析4.1 错误分析在我们调试程序的过程中, 同时出现了很多的问题。 我们将程序输入 C-Free 中提示了以下的错误:1、系统提示了: error: mainmust return int .经过我们对问题的分析,我们发现在 C-Free 编译器中 main 函数的前缀不能够是 void ,必须是 int 才可以运行,这是编译器不同造成的错误2、系统提示了: error : printru dose not na

27、me a type. 经过我们的分析和资料的查询, 我们发现是头文件的名字和自定义函数的名字有了冲突, 此时,通过我们对自定义函数名称的改变,程序此处错误被解决22欢。迎下载精品文档3、系统提示了: waring :no newline at end of file.经过我们查询相关资料发现,这句话的英文意思是说文末没有换行符。在代码中我们添加了 n ,此时此处的错误被解决4、系统提示了: error : expected unqualified-id before“int ”error:expected)before “int ”error:leap was not declared in

28、thisscope 通过我们又一次对程序的检查,发现是在声明的时候少定义了一个变量,int后缺少了底下所要的变量, 我们根据下方的程序, 添加了相应的变量,程序可以运行出来了。4.2 错误修改1、在程序运行后,我们发现在主循环的程序中主界面里出现了很多的问号,我们又一次打开程序的源代码, 发现程序中的 printf中不小心误打了很多的问号,此时显示出了很多的问号。我们删除了这些问号,程序运行之后变为正常2、程序运行之后,我们在调试的过程中发现,显示出想要的结果之后,但是无法返回到主页面中。 我们认为是少定义了这样的一个功能,通过返回源代码查看之后,在 if的循环之后添加了return ,以及相

29、应的返回值,问题得以解决。4.3 运行程序进入主界面菜单,输入数字进行选择图 4. 主界面菜单23欢。迎下载精品文档4.4 闰年判断功能按 1,进入闰年判断的步骤,之后输入年份,进行闰年的判断,测试运行结果如下图 4.3 闰年判断的运行结果4.5星期计算功能星期计算功能如下图所示:24欢。迎下载精品文档图 4.4-1 进入星期计算的功能在这一步继续输入年月日,程序进行判断图 4.4-2星期判断的运行结果4.6 月历查询功能月历查询功能如图所示:25欢。迎下载精品文档图 4.5-1 进入月历查询的功能在进入月历查询的程序后,输入年月查询该月的详细日历图 4.5-2月历查询的详细运行结果26欢。迎

30、下载精品文档4.7 打印整年年历功能选择打印整年日历图 4.6-1 选择打印整年日历功能进入打印整年日历功能图 4.6-2整年年历运行结果27欢。迎下载精品文档5 源程序清单#include #include char*NameOfMonth12=January,February,March,April,May,June,July,August,September,October,November,December;char *WeekDay7=星期日 , 星期一 , 星期二 , 星期三 , 星期四 , 星期五, 星期六 ;int IsLeapYear (int year)if(year%4=

31、0&year%100!=0|year%400=0)return 1;/*闰年返回 1*/elsereturn 0;/*平年返回 0*/int DateCheck(int uYear,int uMonth,int uDay)/*合法返回 true ,非法或超出范围返回 false*/if (uYear9999|uMonth12|uDay31)return 0;if (uMonth=4|uMonth=6|uMonth=9|uMonth=11)if (uDay30)28欢。迎下载精品文档return 0;else if (uMonth=2)if (IsLeapYear(uYear)if (uDay2

32、9)return 0;elseif (uDay28)return 0;return 1;int GetDays (int year,int month,int day)int sum=0;if (DateCheck(year,month,day)=0)return -1;/*日期有误 */if(year=1901)29欢。迎下载精品文档int X=(int)(year/100);/*世纪数 */intY=X-(int)(X/4);/*如果按 4 年一闰来算, Y 指的是比实际上多算的天数,在下面需要减去 */if (month0)year-;/*把 1 月、 2 月视为上一年的 13 月、 1

33、4 月(纯粹为了计算需要)*/month+=12;sum=(int)(365.25*(year-1900)+(int)(30.6*(month+1)+day-Y-49;/*以 365.25(本来实际太阳年是365.2425 天)来计算是为了计算按4 年一闰的整数年总天数 ,加上月份天数再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加的)*/* 月份以 30.6 天的平均值计算。最后减去的49,是多加的一个月以及其余相差天数的和,可得到1900 年 1 月 1 日的积日为 0*/return sum;/*返回距离 1900 年 1 月 1 日的总天数(积日) */int GetDayOfMo

34、nth(int month,int year)int tmp_days=GetDays(year,month,1);/*本月积日 */int DayOfMonth=0;month+;/* 下个月 */if (month12)month=1;/* 遇到月份为 12 月的情况,月份为1,年份加 1*/year+;DayOfMonth=GetDays(year,month,1);/*下个月的积日 */30欢。迎下载精品文档DayOfMonth-=tmp_days;/* 下月 1 日的总天数(距离1900 年 1 月 1 日的积日)减去当前月 1 日的总天数 */return DayOfMonth;/*返回当前月总天数 */int (int year,int month,int day)int i,j,count;int jiri=0;/*积日 */int dayofweek=0;/*星期 */if (DateCheck(year,month,day)=0)printf(输入日期有误 !rn);/*日期不合法或超出范围,年历从1901 年开始 */return 0;printf(

温馨提示

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

评论

0/150

提交评论