万年历设计报告.docx
- 文档编号:4439740
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:29
- 大小:247.21KB
万年历设计报告.docx
《万年历设计报告.docx》由会员分享,可在线阅读,更多相关《万年历设计报告.docx(29页珍藏版)》请在冰豆网上搜索。
万年历设计报告
C语言程序设计实训任务书
题目:
万年历
学生姓名:
学号:
班级:
_物联网工程_
题目类型:
软件工程(R)指导教师:
一、设计目的
1.进一步掌握和利用C语言进行程序设计的能力;
2.进一步理解和运用结构化程序设计的思想和方法;
3.初步掌握开发一个小型实用系统的基本方法;
4.学会调试一个较长程序的基本方法;
5.学会利用流程图或N-S图表示算法;
6.掌握书写实训开发文档的能力(书写实训报告)。
二、设计任务及内容
用C语言编写万年历
1.功能选择可以用菜单实现。
例如可以选择1按年查询2按月查询3按日查询0退出
用户通过不同的数字进入不同的菜单
2.万年历显示公元后任何年份的日历,类似于一般挂历上的格式
3.输入年份,判断是否为闰年
4.输入年月日,判断改日为星期几
5.输入年份,打出12个月历,输入月份,打出该月的日历
6.要求用多个函数实现
三、设计要求
1.用C语言实现系统;
2.利用结构体、数组等实现数据结构设计;
3.系统的各个功能模块要求用函数的形式实现;
4.文档:
实训说明书每个学生一份,并装在统一的资料盒中。
5.光盘:
每个学生文档和程序资料分别建在一个以自己学号和姓名命名的文件夹下,并要求每班负责人汇总每个学生的文件放在以班级姓名命名的文件夹下,刻录成一张光盘,放在一个专门的资料袋中。
四、提交的成果
1.设计任务书一份(学校统一格式)
2.设计说明书一份,内容包括:
1)中文摘要100字,关键词3-5个。
2)C语言课程实训题目、内容、要求。
3)总体设计(包含几大功能模块)。
4)详细设计(各功能模块的具体实现算法——流程图)
5)数据结构设计描述,各模块(函数)的功能介绍,参数说明等。
6)调试分析(包含各模块的测试用例,及测试结果。
)
7)总结(实训完成了哪些功能,还有哪些地方需要改进,及通过实训有何收获,调试程序的体会等)
8)参考文献、致谢等。
五、主要参考资料
1.王连相.《C/C++程序设计》武汉大学出版社
2.谭浩强《C语言程序设计(第2版)学习指导》清华大学出版社
3.杨莉,龚义建《C语言程序设计实训指导教程》华中科技大学出版社
4.张小东,郑宏珍《C语言程序设计与应用》人民邮电出版社
5.郭翠英《C语言C语言课程实训案例精编》中国水利水电出版社
6.郭有强《C语言程序设计》清华大学出版社
7.李丹程,刘莹,那俊《C语言程序设计案例实践》清华大学出版社
8.李丽娟《C语言程序设计教程》人民邮电出版社
9.武雅丽,王永玲,解亚利《C语言程序设计》清华大学出版社
六、各阶段时间安排(共1周)
日期
内容
地点
星期一
教师讲解设计要求,准备参考资料
1B203
星期二
分析系统,方案设计
1B203
星期三
方案设计,编程
1B203
星期四
调试程序,书写实训说明书
1B203
星期五
完成实训说明书,答辩
1B203
摘要
C语言在近年来国内外得到了很广泛的推广,而电子万年历也是人们在日常的生活需求中必不缺少的一部分。
我们通过这学期对C语言的学习,做出了一个万年历程序。
该程序实现了简易的万年历的功能,实现了万年历的四个基本功能。
当进入此程序,通过界面的提示可以很容易的进入万年历功能选择所实现的功能。
此万年历有以下四个常能用的功能:
按年查询、按月查询、按日查询、打印整年日历。
这四个常用功能基本满足了人们在生活中的对万年的需求,本万年历跨度较其他万年历稍大一些,可以查询到更广的年历。
关键词:
C语言;电子万年历;数组
1绪论
本课题主要是针对简易电子万年历的功能,以及子模块的设计展开探究。
课题主要包括了使用C语言来调用各个模块的函数,使这些函数相互之间联系起来,解决用户需要的简易问题,同时考察组员对C语言中的函数、顺序、循环、if语句的嵌套、for语句的嵌套的操作能力。
并且在探究的过程中培养组员分析问题和解决问题的能力,提高组员之间团结合作的能力。
1.1设计目的
1.通过实训可以综合运用所学有关相应知识的能力,能更好的巩固《C语言程序设计》课程学习的内容,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关。
更加了解了C语言的好处和其可用性。
同时增加了同学之间的团队合作精神,更加也体会到以后在工作中团队合作的重要性和必要性。
2.通过实训,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程设计能力。
为后续各门计算机课程的学习和毕业设计打下坚实基础。
1.2设计背景
C语言是近年在国内外得到迅速推广应用的一种机器语言。
C语言功能丰富,表达能力强,应用灵活方便,应用范围广,目标成序效率高,可移植,极有高级语言的优点,又具有低级语言的许多特点。
因此,C语言特别适合于编写各种软件。
在这次的实训中我将把日常生活中最经常接触的——日历的查询,利用C语言的程序编成一个简单的万年历查询系统。
通过这个小小的系统可以实现部分功能。
在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。
1.3需求背景
目前比较流行电子万年历程序,比较典型的是windows中各版本的日历程序。
但是这些程序总是有一定的限制,需要一个跨度很大的日历来方便人们的生活,而C语言程序与设计充分发挥了这个优点,用很短的文本填补了这一个空白。
同时也用强有力的证据告诉人们C语言这个新生事物的应用范围是极其广阔的。
1.4小组分工
组内成员是一个整体,小组是一个团队,强调集体行动,不搞个
人主义,组内对于各种任务要有明确分工,并且要明确落实到人。
组长:
白博康在以身作则的基础上,对组员的学习、行为、思想等进行监督、督促和指导。
包括随时与指导老师联系,分派组员任务。
同时负责实训内容的收尾、排版、制图、检查错误、部分程序的调试等工作。
组员:
蔡家豪在报告书中做了很大的贡献,在我们的报告书中担任了流程图制作,资料搜集的工作,为我们的工作顺利进行起到了很大的作用。
同时为组内同学做好了后勤保障工作。
组员:
程虞华在我们组中寻找源代码以及对源代码进行改进,为我们提供了程序设计的基础,并和其他组员一起查询错误。
在报告书中为我们编辑了详细程序这一部分。
同时协助其他组员进行实训中表格的制作,流程图的制作。
2总体设计
2.1总模块设计
用户通过不同的数字进入不同的菜单,万年历显示公元后任何年份的日历,类似于一般挂历上的格式,输入年份,判断是否为闰年;输入年月日,判断为星期几;输入年份,打印出查询月历;输入年份,打出该月的日历。
图2.1功能模块图
2.2使用头文件说明
本程序应用到的头文件:
#include "stdio.h"
在使用标准函数库中的输入输出函数时,编译系统要求程序提供有关的信息(例如对这些输入输出函数的声明),#include
在程序中用到系统提供的标准函数库中的输入输出函数时,应在程序的开头写上一行:
#include"stdio.h"或者是#include
二者主要在于查找效率上有差别,#include
在编写C语言中,常用到printf()和scanf()函数,他们就是stdio.h中的两个标准输入输出函数,所以编程语句中如果要用到此两个函数就一定要在头文件中加入#include
#include "windows.h"
头文件封装了库函数以及一些类,将一些复杂的工作由库函数处理,而用户不必把精力放在这些地方。
比如说cout<<,为标准输出流,其实说到底还是函数调用,不过这个函数有些特殊,用的是运算符重载,确切地说是重载了“<<”运算符,作用是将键盘输入的在屏幕上打印出来,这个功能要是由我们去写,估计也得学个两三年才有可能。
所以就简化了操作。
而这一系列的函数都在头文件中包含(是一个函数库)。
在调用时包含后便可直接用。
2.3使用变量声明
表2.2变量的声明
变量
变量说明
表示月份的变量
表示年份的变量
NameOfMonth
表示月份的变量
WeekDay
表示日期的变量
Choise>
表示菜单选择的变量
x
表示月份的变量
y
表示一个月中的某一天的变量
sum
判断某天是一年中的第几天的变量
number
判断某天离公元1年1月1日还有几天的变量
a[]
表示每月天数的数组变量
2.4运用到C语言的函数
在程序中应用了大量的自定义函数,都为了使程序更简洁明了。
其中:
int IsLeapYear() /*判断是否为闰年*/
char*NameOfMonth() /*判断某天是一年中的几月*/
char*WeekDay() /*对天数进行判断确定是星期几*/
intjiri()/*判断这一月的总天数*/
intX=(int)(year/100);/*世纪数*/
intY=X-(int)(X/4);/*如果按4年一闰来算,Y指的是比实际上多算的天数,在下面需要减去*/
intGetDayOfMonth()/*输出某一年中的月历*/
inttmp_days=GetDays(year,month,1);/*本月积日*/
intShowCalendar()/*输出某一年的某一月的详细日历*/
intDateCheck/*判断合法性*/
jiri=GetDays(year,month,1);/*获取特定日期的总天数*/
ShowCalendar(year,month,1);}/*输出年历*/
int counterdays() /*判断今天距特定日期的天数*/
intdayofweek() /*判断是星期几*/
intGetDays /*判断今天的日期*/
2.5函数调用关系
上述函数调用关系如下图所示:
图2.5函数调用关系
3详细设计
3.1函数运行流程图
通过外部菜单的功能和相应的提示进行输入即进入所要运行的功能。
定义了一个主函数intmain()这个函数就是我们整个程序运行的主要框架。
通过while这个主循环让用户输入相应的功能前的代码来实现想要的功能。
通过在Choise>之后输入所需运行的程序的代码进行执行相应的程序。
图3.1函数运行流程图
3.2闰年判断模块
用户通过输入1进入闰年判断的程序,进入闰年判断后,通过对函数int IsLeapYear() 的循环进行判断,最后输出结果,输出结果后返回主菜单。
图3.2闰年判断模块
进入菜单选择闰年判断功能,输入进行查询,查询后将显示查询的年份是否为闰年。
若是,则显示此年为闰年,若不是闰年则显示此年不是闰年。
首先第一步定义了IsLeapyear这个函数,这个函数主要是为实现闰年判断这个功能的。
通过year%4==0&&year%100!
=0||year%400==0判断输入的该年是否为闰年,从而通过接下的步骤return返回相应的数据。
相关代码如下:
intIsLeapYear(intyear)
{
if(year%4==0&&year%100!
=0||year%400==0)
{
return1;/*闰年返回1*/
}else
{return0;/*平年返回0*/}}
3.3年历打印模块
通过输入4,选择打印整年日历功能,输入正确即可执行,输入不正确返回主界面。
图3.3年历打印模块
进入主界面后,用户通过选择打印整年日历的功能。
进入打印整年日历的程序中后,用户只需输入想要打印当年的年份,接下来就是对月份的判断,此时年份的判断已经通过了,这时先对大月小月进行判断,if中列出的都是小月,通过判断大小月和之前石否为闰年的判断接下来进一步对二月的天数进行确定。
当return0之后,这些月份都为小月,每都有30天,之前判断的闰年此时调用判断闰年的函数,用是否闰年对二月的天数进行判断,系统即可进行打印,该程序在循环中截止于break,打印部分的程序如下:
if(uMonth==4||uMonth==6||uMonth==9||uMonth==11)
{if(uDay>30)
{return0;
}
}elseif(uMonth==2)
{if(IsLeapYear(uYear))
{if(uDay>29)
{return0;
}
}else
{if(uDay>28)
{return0;
}
}
}
return1;
}
printf("请输入要判断的年份:
Year>");
scanf("%d",&year);
for(month=1;month<=12;month++)
{ShowCalendar(year,month,1);
}
break;
3.4星期计算模块
进入主界面菜单之后,通过用户选择星期计算即可查询某一天是星期几,需要用户输入按“年月日”的格式进行输入,输入后,系统将判断输入的该年该月的这一天为星期几并显示出来。
这个程序的运行要基于之前的日历的计算。
图3.4星期计算模块
开始星期的计算。
星期的计算需要调用两次函数,需要调用判断年历的函数,通过定位到所需函数的一年,接下来继续判断函数所在的月,通过调用按月历查询的函
数,将这一天的具体日期定位到那一月的月历中,在查询到的那一月对该日的星期数进行判断,最后输出该日的星期数。
相关代码如下:
case2:
printf("请输入要判断的日期(空格隔开):
YearMonthDay>");
scanf("%d%d%d",&year,&month,&day);
totaldays=GetDays(year,month,day);
printf("%d年%d月%d日是%s\r\n\r\n",year,month,day,WeekDay[(totaldays+1)%7]);
break;
3.5打印月历模块
通过之前对年的判断,现在可通过输入某一年的某一个月来打印该月的日历。
在打印月历的时候,需要调用之前的年历的函数。
图3.5年历打印模块
代码如下:
if(month<=2&&month>0
{
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,是多加的一个月以及其余相差天数的和,可得到1900年1月1日的积日为0*/
}
returnsum;/*返回距离1900年1月1日的总天数(积日)*/
}
intGetDayOfMonth(intmonth,intyear)
{
inttmp_days=GetDays(year,month,1);/*本月积日*/
intDayOfMonth=0;
month++;/*下个月*/
if(month>12)
{
month=1;/*遇到月份为12月的情况,月份为1,年份加1*/
year++;
}
DayOfMonth=GetDays(year,month,1);/*下个月的积日*/
DayOfMonth-=tmp_days;/*下月1日的总天数(距离1900年1月1日的积日)减去当前月1日的总天数*/
returnDayOfMonth;/*返回当前月总天数*/
}
进入主界面菜单之后,通过用户选择月历查询的功能即可进入阅历查询的功能。
进入月历查询的功能之后,用户需输入具体的年月进行查询。
输入的格式为:
“年月”,输入后,系统将进入年和月的循环结构中进行计算,计算完成之后,此循环中止于break。
case3:
printf("请输入要显示的月份(空格隔开):
YearMonth>");
scanf("%d%d",&year,&month);
ShowCalendar(year,month,1);
break;
3.6日期合法性检查模块
在使用输入时,总会有输入错误的情况,根据不同情况下输入错误的情况,程序也做出了相应的判断。
详细情况如下:
在闰年判断的过程中,通过之前的判断,在最后进行合法性的判断,判断输入的年份是否合法。
intIsLeapYear(intyear)
{
if(year%4==0&&year%100!
=0||year%400==0)
{
return1;/*闰年返回1*/
}else
{
return0;/*平年返回0*/
}
}
intDateCheck(intuYear,intuMonth,intuDay)/*合法返回true,非法或超出范围返回false*/
{
在年份的判断中if(uYear<1901||uYear>9999||uMonth<1||uMonth>12||uDay<1||uDay>31)是对年份合法性的判断,年份判断成功之后即可执行if之后的语句,进行下一步月份的判断。
if(uYear<1901||uYear>9999||uMonth<1||uMonth>12||uDay<1||uDay>31)
{
return0;
}
在之前的天数判断后,此时就有对输入有误日期判断的语句,通过这几句调用了之前的intyear和intday进行求和,之后若有错误,即返回输出日期有误。
intGetDays(intyear,intmonth,intday)
{
intsum=0;
if(DateCheck(year,month,day)==0)
{
return-1;/*日期有误*/
}
4调试分析
4.1错误分析
在我们调试程序的过程中,同时出现了很多的问题。
我们将程序输入C-Free中提示了以下的错误:
1、系统提示了:
error:
‘main’mustreturn‘int’.经过我们对问题的分析,我们发现在C-Free编译器中main函数的前缀不能够是void,必须是int才可以运行,这是编译器不同造成的错误
2、系统提示了:
error:
‘printru’dosenotnameatype.经过我们的分析和资料的查询,我们发现是头文件的名字和自定义函数的名字有了冲突,此时,通过我们对自定义函数名称的改变,程序此处错误被解决
3、系统提示了:
waring:
nonewlineatendoffile.经过我们查询相关资料发现,这句话的英文意思是说文末没有换行符。
在代码中我们添加了\n,此时此处的错误被解决
4、系统提示了:
error:
expectedunqualified-idbefore“int”error:
expected’)’before“int”error:
’leap’wasnotdeclaredinthisscope通过我们又一次对程序的检查,发现是在声明的时候少定义了一个变量,int后缺少了底下所要的变量,我们根据下方的程序,添加了相应的变量,程序可以运行出来了。
4.2错误修改
1、在程序运行后,我们发现在主循环的程序中主界面里出现了很多的问号,我们又一次打开程序的源代码,发现程序中的printf中不小心误打了很多的问号,此时显示出了很多的问号。
我们删除了这些问号,程序运行之后变为正常
2、程序运行之后,我们在调试的过程中发现,显示出想要的结果之后,但是无法返回到主页面中。
我们认为是少定义了这样的一个功能,通过返回源代码查看之后,在if的循环之后添加了return,以及相应的返回值,问题得以解决。
4.3运行程序
进入主界面菜单,输入数字进行选择
图4.主界面菜单
4.4闰年判断功能
按1,进入闰年判断的步骤,之后输入年份,进行闰年的判断,测试运行结果如下
图4.3闰年判断的运行结果
4.5星期计算功能
星期计算功能如下图所示:
图4.4-1进入星期计算的功能
在这一步继续输入年月日,程序进行判断
图4.4-2星期判断的运行结果
4.6月历查询功能
月历查询功能如图所示:
图4.5-1进入月历查询的功能
在进入月历查询的程序后,输入年月查询该月的详细日历
图4.5-2月历查询的详细运行结果
4.7打印整年年历功能
选择打印整年日历
图4.6-1选择打印整年日历功能
进入打印整年日历功能
图4.6-2整年年历运行结果
5源程序清单
#include
#include
char*NameOfMonth[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
char*WeekDay[7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
intIsLeapYear(intyear)
{
if(year%4==0&&year%100!
=0||year%400==0)
{
return1;/*闰年返回1*/
}else
{
return0;/*平年返回0*/
}
}
intDateCheck(intuYear,intuMonth,intuDay)/*合法返回true,非法或超出范围返回false*/
{
if(uYear<1901||uYear>9999||uMonth<1||uMonth>12||uDay<1||uDay>31)
{
return0;
}
if(uMonth==4||uMonth==6||uMonth==9||uMonth==11)
{
if(uDay>30)
{
return0;
}
}elseif(uMonth==2)
{
if(IsLeapYear(uYear))
{
if(uDay>29)
{
return0;
}
}else
{
if(uDay>28)
{
return0;
}
}
}
return1;
}
intGetDays(intyear,intmonth
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历 设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)