1、C语言程序设计实训任务书题目:万年历学生姓名: 学号: 班级: _物联网工程_题目类型:软件工程(R) 指导老师: 一、设计目标1.深入掌握和利用C语言进行程序设计能力;2.深入了解和利用结构化程序设计思想和方法;3.初步掌握开发一个小型实用系统基础方法;4.学会调试一个较长程序基础方法;5.学会利用步骤图或N-S图表示算法;6.掌握书写实训开发文档能力(书写实训汇报)。二、设计任务及内容用C语言编写万年历1.功效选择能够用菜单实现。比如能够选择 1按年查询 2按月查询 3按日查询 0退出 用户经过不一样数字进入不一样菜单2.万年历显示公元后任何年份日历,类似于通常挂历上格式3.输入年份,判定
2、是否为闰年 4.输入年月日,判定改日为星期几 5.输入年份,打出12个月历,输入月份,打出该月日历 6.要求用多个函数实现 三、设计要求1.用C语言实现系统;2.利用结构体、数组等实现数据结构设计;3.系统各个功效模块要求用函数形式实现;4.文档:实训说明书每个学生一份,并装在统一资料盒中。 5.光盘:每个学生文档和程序资料分别建在一个以自己学号和姓名命名文件夹下,并要求每班责任人汇总每个学生文件放在以班级姓名命名文件夹下,刻录成一张光盘,放在一个专门资料袋中。四、提交结果1. 设计任务书一份(学校统一格式)2. 设计说明书一份,内容包含:1) 汉字摘要100字,关键词3-5个。2) C语言课
3、程实训题目、内容、要求。3)总体设计(包含几大功效模块)。4)具体设计(各功效模块具体实现算法步骤图)5)数据结构设计描述,各模块(函数)功效介绍,参数说明等。6)调试分析(包含各模块测试用例,及测试结果。)7)总结(实训完成了哪些功效,还有哪些地方需要改善,及经过实训有何收获,调试程序体会等)8) 参考文件、致谢等。五、关键参考资料1. 王连相.C/C+程序设计 武汉大学出版社2. 谭浩强C语言程序设计(第2版)学习指导清华大学出版社 3. 杨莉,龚义建C语言程序设计实训指导教程华中科技大学出版社 4. 张小东,郑宏珍C语言程序设计和应用人民邮电出版社5. 郭翠英C语言C语言课程实训案例精编
4、中国水利水电出版社6郭有强C语言程序设计清华大学出版社7李丹程,刘莹,那俊C语言程序设计案例实践清华大学出版社 8李丽娟C语言程序设计教程人民邮电出版社9武雅丽,王永玲,解亚利C语言程序设计清华大学出版社六、各阶段时间安排(共1周)日期内容地点星期一老师讲解设计要求,准备参考资料1B203星期二分析系统,方案设计1B203星期三方案设计,编程1B203星期四调试程序,书写实训说明书1B203星期五完成实训说明书,答辩1B203摘要C语言在多年来中国外得到了很广泛推广,而电子万年历也是大家在日常生活需求中必不缺乏一部分。我们经过这学期对C语言学习,做出了一个万年历程序。该程序实现了简易万年历功效
5、,实现了万年历四个基础功效。 当进入此程序,经过界面提醒能够很轻易进入万年历功效选择所实现功效。此万年历有以下四个常能用功效:按年查询、按月查询、按日查询、打印整年日历。这四个常见功效基础满足了大家在生活中对万年需求,本万年历跨度较其它万年历稍大部分,能够查询到更广年历。关键词: C语言;电子万年历;数组 目录1绪论11.1设计目标11.2设计背景11.3需求背景11.4小组分工72总体设计32.1总模块设计32.2使用头文件说明32.3使用变量申明42.4利用到C语言函数42.5函数调用关系53具体设计63.1函数运行步骤图63.2闰年判定模块73.3年历打印模块83.4星期计算模块93.5
6、打印月历模块113.6日期正当性检验模块134 调试分析144.1错误分析144.2错误修改144.3运行程序154.4闰年判定154.5 星期计算功效164.6月历查询功效174.7打印整年年历功效185 源程序清单19总结26致谢27参考文件281绪论本课题关键是针对简易电子万年历功效,和子模块设计展开探究。课题关键包含了使用C语言来调用各个模块函数,使这些函数相互之间联络起来,处理用户需要简易问题,同时考察组员对C语言中函数、次序、循环、if语句嵌套、for语句嵌套操作能力。而且在探究过程中培养组员分析问题和处理问题能力,提升组员之间团结合作能力。1.1设计目标1.经过实训能够综合利用所
7、学相关对应知识能力,能愈加好巩固C语言程序设计课程学习内容,掌握工程软件设计基础方法,强化上机动手编程能力,闯过理论和实践相结合难关。愈加了解了C语言好处和其可用性。同时增加了同学之间团体合作精神,愈加也体会到以后在工作中团体合作关键性和必需性。2.经过实训,使学生了解高级程序设计语言结构,掌握基础程序设计过程和技巧,掌握基础分析问题和利用计算机求解问题能力,含有初步高级语言程设计能力。为后续各门计算机课程学习和毕业设计打下坚实基础。1.2设计背景C语言是多年在中国外得到快速推广应用一个机器语言。C语言功效丰富,表示能力强,应用灵活方便,应用范围广,目标成序效率高,可移植,极有高级语言优点,又
8、含有低级语言很多特点。所以,C语言尤其适合于编写多种软件。在这次实训中我将把日常生活中最常常接触日历查询,利用C语言程序编成一个简单万年历查询系统。经过这个小小系统能够实现部分功效。在程序中你能看到很多熟悉C语言关键字,同时也加入了很多自己课外了解到部分关键字。1.3需求背景现在比较流行电子万年历程序,比较经典是windows中各版本日历程序。不过这些程序总是有一定限制,需要一个跨度很大日一向方便大家生活,而C语言程序和设计充足发挥了这个优点,用很短文本填补了这一个空白。同时也用强有力证据告诉大家C语言这个新生事物应用范围是极其宽广。1.4小组分工组内组员是一个整体,小组是一个团体,强调集体行
9、动,不搞个人主义,组内对于多种任务要有明确分工,而且要明确落实到人。组长:白博康在以身作则基础上,对组员学习、行为、思想等进行监督、督促和指导。包含随时和指导老师联络,分配组员任务。同时负责实训内容收尾、排版、制图、检验错误、部分程序调试等工作。组员:蔡家豪在汇报书中做了很大贡献,在我们汇报书中担任了步骤图制作,资料搜集工作,为我们工作顺利进行起到了很大作用。同时为组内同学做好了后勤保障工作。组员:程虞华在我们组中寻求源代码和对源代码进行改善,为我们提供了程序设计基础,并和其它组员一起查询错误。在汇报书中为我们编辑了具体程序这一部分。同时帮助其它组员进行实训中表格制作,步骤图制作。2总体设计2
10、.1总模块设计用户经过不一样数字进入不一样菜单,万年历显示公元后任何年份日历,类似于通常挂历上格式,输入年份,判定是否为闰年;输入年月日,判定为星期几;输入年份,打印出查询月历;输入年份,打出该月日历。万年历闰年判定星期查询月历查询打印整年日历图2.1 功效模块图2.2使用头文件说明本程序应用到头文件:#includestdio.h在使用标准函数库中输入输出函数时,编译系统要求程序提供相关信息(比如对这些输入输出函数申明),#include作用就是用来提供这些信息,stdio.h是C编译系统提供一个文件名,stdio是“standard input & output”缩写,即相关标准输入输出信
11、息。在程序中用到系统提供标准函数库中输入输出函数时,应在程序开头写上一行:#includestdio.h或是#include,这么才能调用库函数。二者关键在于查找效率上有差异,#include通常见包含系统文件,它是查找先从系统目录查找开始查找;#include stdio.h通常见包含项目文件,它是查找先从项目目录查找开始查找。在编写C语言中,常见到printf()和scanf()函数,她们就是stdio.h中两个标准输入输出函数,所以编程语句中假如要用到此两个函数就一定要在头文件中加入#include。#includewindows.h头文件封装了库函数和部分类,将部分复杂工作由库函数处理
12、,而用户无须把精力放在这些地方。比如说cout,为标准输出流,其实说到底还是函数调用,不过这个函数有些特殊,用是运算符重载,确切地说是重载了“表示菜单选择变量x表示月份变量y表示30天中某一天变量sum判定某天是十二个月中第几天变量number判定某天离公元1年1月1日还有几天变量a表示每个月天数数组变量2.4利用到C语言函数 在程序中应用了大量自定义函数,全部为了使程序更简练明了。其中:intIsLeapYear ()/*判定是否为闰年*/char *NameOfMonth ()/*判定某天是十二个月中几月*/char *WeekDay ()/*对天数进行判定确定是星期几*/int jiri
13、()/*判定这一月总天数*/int X=(int)(year/100);/*世纪数*/int Y=X-(int)(X/4);/*假如按4年一闰来算,Y指是比实际上多算天数,在下面需要减去*/int GetDayOfMonth()/*输出某十二个月中月历*/int tmp_days=GetDays(year,month,1);/*本月积日*/int ShowCalendar()/*输出某十二个月某一月具体日历*/int DateCheck /*判定正当性*/jiri=GetDays(year,month,1);/*获取特定日期总天数*/ShowCalendar(year,month,1); /*
14、输出年历*/intcounterdays()/*判定今天距特定日期天数*/int dayofweek()/*判定是星期几*/int GetDays/*判定今天日期*/ 2.5函数调用关系上述函数调用关系以下图所表示:否是主函数main()IsLeapYearShowCalendarGetDaysGetDayOfMonthDateCheck(是否正当)结束图2.5 函数调用关系3具体设计3.1函数运行步骤图经过外部菜单功效和对应提醒进行输入即进入所要运行功效。定义了一个主函数int main()这个函数就是我们整个程序运行关键框架。经过while这个主循环让用户输入对应功效前代码来实现想要功效。
15、经过在Choise以后输入所需运行程序代码进行实施对应程序。调用闰年判定判定该年是否闰年输入年月3调用打印月历打印该月月历调用年历打印打印该年年历判定该日为星期几数字判定输入年份输入年月日1或4214调用星期判定开始输入选项图3.1函数运行步骤图3.2闰年判定模块用户经过输入1进入闰年判定程序,进入闰年判定后,经过对函数intIsLeapYear ()循环进行判定,最终输出结果,输出结果后返回主菜单。开始输入yearyear%4=0year%100!=0year%400=0是闰年非闰年返回否是是否是图3.2闰年判定模块进入菜单选择闰年判定功效,输入进行查询,查询后将显示查询年份是否为闰年。若是
16、,则显示此年为闰年,若不是闰年则显示此年不是闰年。首先第一步定义了IsLeap year这个函数,这个函数关键是为实现闰年判定这个功效。经过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,选择打印整年日历功效,输入正确即可实施,输入不正确返回主界面。打印该年月份返回年
17、份判定输入年份调用大小月判定函数调用闰年判定函数图3.3年历打印模块进入主界面后,用户经过选择打印整年日历功效。进入打印整年日历程序中后,用户只需输入想要打印当年年份,接下来就是对月份判定,此时年份判定已经经过了,这时先对大月小月进行判定,if中列出全部是小月,经过判定大小月和之前石否为闰年判定接下来深入对二月天数进行确定。当return 0以后,这些月份全部为小月,每全部有30天,之前判定闰年此时调用判定闰年函数,用是否闰年对二月天数进行判定,系统即可进行打印,该程序在循环中截止于break,打印部分程序以下:if (uMonth=4|uMonth=6|uMonth=9|uMonth=11)
18、 if (uDay30) return 0; else if (uMonth=2) if (IsLeapYear(uYear) if (uDay29)return 0; else if (uDay28) return 0; return 1; printf(请输入要判定年份:Year);scanf(%d,&year); 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(to
19、taldays+1)%7); break;3.5打印月历模块经过之前对年判定,现在可经过输入某十二个月某30天来打印该月日历。在打印月历时候,需要调用之前年历函数。开始输入一个年月调用年历函数打印出输入该年月份日历返回图3.5年历打印模块代码以下:if (month0 year-;/*把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年一闰整数年总天数,加上月份天数
20、再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加)*/ /*月份以30.6天平均值计算。最终减去49,是多加30天和其它相差天数和,可得到191月1日积日为0*/ return sum;/*返回距离191月1日总天数(积日)*/ int GetDayOfMonth(int month,int year) int tmp_days=GetDays(year,month,1);/*本月积日*/ int DayOfMonth=0; month+;/*下个月*/ if (month12) month=1;/*碰到月份为12月情况,月份为1,年份加1*/ year+; DayOfMonth=GetD
21、ays(year,month,1);/*下个月积日*/ DayOfMonth-=tmp_days;/*下月1日总天数(距离191月1日积日)减去目前月1日总天数*/ return DayOfMonth;/*返回目前月总天数*/ 进入主界面菜单以后,经过用户选择月历查询功效即可进入阅历查询功效。进入月历查询功效以后,用户需输入具体年月进行查询。输入格式为:“年 月 ”,输入后,系统将进入年和月循环结构中进行计算,计算完成以后,此循环中止于break。case 3: printf(请输入要显示月份(空格隔开):Year Month);scanf(%d %d,&year,&month); ShowC
22、alendar(year,month,1); break;3.6日期正当性检验模块在使用输入时,总会有输入错误情况,依据不一样情况下输入错误情况,程序也做出了对应判定。具体情况以下:在闰年判定过程中,经过之前判定,在最终进行正当性判定,判定输入年份是否正当。int IsLeapYear (int year) if(year%4=0&year%100!=0|year%400=0) return 1;/*闰年返回1*/ else return 0;/*平年返回0*/ int DateCheck(int uYear,int uMonth,int uDay)/*正当返回true,非法或超出范围返回fa
23、lse*/在年份判定中if(uYear9999|uMonth12|uDay31)是对年份正当性判定,年份判定成功以后即可实施if以后语句,进行下一步月份判定。 if (uYear9999|uMonth12|uDay31) return 0; 在之前天数判定后,此时就有对输入有误日期判定语句,经过这几句调用了之前int year和int day进行求和,以后若有错误,即返回输出日期有误。int GetDays (int year,int month,int day) int sum=0; if (DateCheck(year,month,day)=0) return -1;/*日期有误*/ 4
24、调试分析4.1错误分析在我们调试程序过程中,同时出现了很多问题。我们将程序输入C-Free中提醒了以下错误:1、系统提醒了:error: main must return int.经过我们对问题分析,我们发觉在C-Free编译器中main函数前缀不能够是void,必需是int才能够运行,这是编译器不一样造成错误2、系统提醒了:error: printrudose not name a type.经过我们分析和资料查询,我们发觉是头文件名字和自定义函数名字有了冲突,此时,经过我们对自定义函数名称改变,程序此处错误被处理3、系统提醒了:waring:no newline at end of fil
25、e.经过我们查询相关资料发觉,这句话英文意思是说文末没有换行符。在代码中我们添加了n,此时此处错误被处理 4、系统提醒了:error:expected unqualified-id before “int”error:expected )before“int”error:leapwas not declared in this scope经过我们又一次对程序检验,发觉是在申明时候少定义了一个变量,int后缺乏了底下所要变量,我们依据下方程序,添加了对应变量,程序能够运行出来了。4.2错误修改1、在程序运行后,我们发觉在主循环程序中主界面里出现了很多问号,我们又一次打开程序源代码,发觉程序中pr
26、intf中不小心误打了很多问号,此时显示出了很多问号。我们删除了这些问号,程序运行以后变为正常2、程序运行以后,我们在调试过程中发觉,显示出想要结果以后,不过无法返回到主页面中。我们认为是少定义了这么一个功效,经过返回源代码查看以后,在if循环以后添加了return,和对应返回值,问题得以处理。4.3运行程序进入主界面菜单,输入数字进行选择图4.主界面菜单4.4闰年判定功效按1,进入闰年判定步骤,以后输入年份,进行闰年判定,测试运行结果以下图4.3 闰年判定运行结果4.5 星期计算功效星期计算功效以下图所表示:图4.4-1进入星期计算功效在这一步继续输入年月日,程序进行判定图4.4-2 星期判
27、定运行结果4.6月历查询功效月历查询功效图所表示:图4.5-1 进入月历查询功效在进入月历查询程序后,输入年月查询该月具体日历图4.5-2 月历查询具体运行结果4.7打印整年年历功效选择打印整年日历图4.6-1 选择打印整年日历功效进入打印整年日历功效图4.6-2 整年年历运行结果5 源程序清单#include #include char *NameOfMonth12=January,February,March,April,May,June,July,August,September,October,November,December;char *WeekDay7=星期日,星期一,星期二,星
28、期三,星期四,星期五,星期六;int IsLeapYear (int year) if(year%4=0&year%100!=0|year%400=0) return 1;/*闰年返回1*/ else return 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) return 0; els
29、e if (uMonth=2) if (IsLeapYear(uYear) if (uDay29) return 0; else if (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) int X=(int)(year/100);/*世纪数*/ int Y=X-(int)(X/4);/*假如按4年一闰来算,Y指是比实际上多算天数,在下面需要减去*/ if
30、(month0) year-;/*把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年一闰整数年总天数,加上月份天数再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加)*/ /*月份以30.6天平均值计算。最终减去49,是多加30天和其它相差天数和,可得到191月1日积日为0*/ return sum;/*返回距离191月1日总天数(积日)*/ int GetDa
31、yOfMonth(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);/*下个月积日*/ DayOfMonth-=tmp_days;/*下月1日总天数(距离191月1日积日)减去目前月1日总天数*/ return DayOfMonth;/*返回目前月总天数*/ int (int yea
32、r,int month,int day) int i,j,count; int jiri=0;/*积日*/ int dayofweek=0;/*星期*/ if (DateCheck(year,month,day)=0) printf(输入日期有误!rn);/*日期不正当或超出范围,年历从19开始*/ return 0; printf(t %d %srn,year,NameOfMonthmonth-1); printf(-rn); printf( Sun Mon Tue Wed Thu Fri Satrn); printf(-rn); jiri=GetDays(year,month,1);/*获
33、取距离191月1日总天数*/ dayofweek=(1+jiri)%7;/月首星期,因为191月1日星期一 count=GetDayOfMonth(month,year); for(i=0;idayofweek;i+) printf( );/填充前面空格 for(i=1,j=dayofweek;i=count;i+,j+) if (i); scanf(%d,&nChoise); switch (nChoise) case 1: printf(请输入要判定年份:Year); scanf(%d,&year); if (year9999) printf(输入年份超出范围!); break; if (
34、IsLeapYear(year)=1) printf(%d年是闰年!rnrn,year); else printf(%d年不是闰年!rnrn,year); break; case 2: printf(请输入要判定日期(空格隔开):Year Month Day); 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; case 3: printf(请输入要显示月份(空格隔
35、开):Year Month); scanf(%d %d,&year,&month); ShowCalendar(year,month,1); break; case 4: printf(请输入要判定年份:Year);scanf(%d,&year); for (month=1;month=12;month+) ShowCalendar(year,month,1); break; default: printf(无效菜单项!rn); break; system(pause); system(cls);return 0;总结整个设计经过了软件和硬件上调试。我想这对于自己以后学习和工作全部会有很大帮助
36、。在这次设计中碰到了很多实际性问题,在实际设计中才发觉,书本上理论性东西和在实际利用中还是有一定出入,所以有些问题不仅要深入地了解,而且要不停地更正以前错误思维。一切问题必需要靠自己一点一滴处理,而在处理过程当中你会发觉自己在飞速提升。对于教材管理系统,其程序是比较简单,关键是处理程序设计中问题,而程序设计是一个很灵活东西,它反应了你处理问题逻辑思维和创新能力,它才是一个设计灵魂所在。所以在整个设计过程中大部分时间是用在程序上面。很多子程序是能够借鉴书本上,但怎样衔接各个子程序才是关键问题所在,这需要对系统结构很熟悉。所以能够说系统设计是软件和硬件结合,二者是密不可分。经过这次课程设计我也发觉
37、了本身存在不足之处,即使感觉理论上已经掌握,但在利用到实践过程中仍有意想不到迷惑,经过一番努力才得以处理。这也激发了我以后努力学习爱好,我想这将对我以后学习产生主动影响。其次,这次课程设计让我充足认识到团体合作关键性,只有分工协作才能确保整个项目标有条不絮。另外在课程设计过程中,当我们碰到不明白问题时,指导老师总是耐心讲解,给我们设计以极大帮助,使我们获益匪浅。所以很感谢老师教导。经过这次设计,我知道了学习关键性,了解到理论知识和实践相结合关键意义,学会了坚持、耐心和努力,这将为自己以后学习和工作做出了最好楷模。我认为作为一名软件工程专业学生,这次课程设计是很有意义。更关键是怎样把自己平时所学东西应用到实际中。即使自己对于这门课懂并不多,很多基础东西全部还没有很好掌握,认为极难,也没有很有效措施经过本身去了解,不过靠着这一个多礼拜“学习”,在小组同学帮助和讲解下,逐