计算机科学与技术程序设计语言课程设计万年历系统_第1页
计算机科学与技术程序设计语言课程设计万年历系统_第2页
计算机科学与技术程序设计语言课程设计万年历系统_第3页
计算机科学与技术程序设计语言课程设计万年历系统_第4页
计算机科学与技术程序设计语言课程设计万年历系统_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、数学与计算机学院 课程设计说明书 课 程 名 称: 计算机科学与技术程序设计语言-课程设计 课 程 代 码: 8404091 题 目: 万年历系统 年级/专业/班: 09 级软件工程 1 班 学 生 姓 名: 学 号: 开 始 时 间: 2010 年 12 月 24 日 完 成 时 间: 2011 年 01 月 06 日 课程设计成绩: 学习态度及平 时成绩(30) 技术水平与实际 能力(20) 创新(5)说明书撰写质量(45) 总 分 (100) 指导教师签名: 年 月 日 目 录 1 1 引引 言言 .1 1 1.1 问题的提出 .1 1.2 国内外研究的现状.1 1.3 任务与分析.1

2、2 2 程序的主要功能程序的主要功能 .3 3 2.1 显示功能.3 2.2 自动翻页功能 .3 2.3 查询功能.3 2.4 帮助功能.3 2.5 退出功能.3 3 3 程序运行平台程序运行平台 .4 4 4 4 总体设计总体设计 图图 4.14.1 流程图流程图 .5 5 5 5 程序代码明细程序代码明细 .6 6 6 6 模块分析模块分析 .1111 6.1 系统日期模块 .11 6.2 打印模块 .11 6.3 闰年判断模块.12 6.4 查询模块 .12 6.5 菜单模块 void mainmenu(int year,int month,int day)/主菜单 .12 6.6 关键

3、代码 .13 7 7 系统测试系统测试 首先进入首先进入 vc+6.0vc+6.0,打开工程,打开工程 person.dswperson.dsw,然后进入源程序,接着选择,然后进入源程序,接着选择 buildbuild 下的下的 executeexecute person.exeperson.exe 即可即可, ,也可以不打开工程,直接双击也可以不打开工程,直接双击 personperson 文件夹下文件夹下 的的 debugdebug 或或 releaserelease 子文件夹下的子文件夹下的 person.exeperson.exe 文件即可运行程序。文件即可运行程序。 7.17.1 进

4、入程序进入程序 . .1414 8 8 结论结论 .1717 1 1 引引 言言 1.1 问题的提出问题的提出 万年历是我国古代传说中最古老的一部太阳历。为纪念历法编撰者万年功绩,便将 这部历法命名为“万年历” 。而现在所使用的万年历,实际上就是记录一定时间范围内 (比如 100 年或更多)的具体的日期的年历,方便有需要的人查询使用。怎样在电脑 上显示万年历以便查询,是一个很普遍的需求。 附: 万年历算星期几 :只要随便说出公元几几年几月几日就可以马上算出是星 期几。 只要计算出日的代码,月份代码,年份代码。三个加起来除以七的余数就是星期几, (如余数是三,则就是星期三)。 日的代码计算:日的

5、代码最简单,就是它本身,是几号就是几。 月份代码计算:月份代码也很简单,下面有十二个数:144725736146,分 别代表一至十二月份每个月的代码。比如,九月份的代码为6。 (据来宾介绍,他 是用逆推的方法,计算出这 12 个月份代码的,即知道 某年某月某日 是星期几,反 过来推算月份代码。 年份代码计算:年份代码相对比较复杂,先记住2000 年对应的年份代码 是 4,这是基础代码,牢记即可。假如大于2000 年,比如 2010 年,则对应的年 份代码是( 20102000)4=22,再用基数代码 4 减去 2 倍的商加上余数再 加 1。即 422+2+1=3,则 2010 年对应的年份代码

6、为 3。如果没有余数,即润年, 则余数后面的 1 也不用加。比如 2008 年,对应的年份代码为 0。 1.2 国内外研究的现状国内外研究的现状 万年历已经在我们生活中随处可见,基本功能的万年历很早就出现了,现在已经进 入到多元化的设计时代了。现在的万年历不单单可以查询日历还带有许多的拓展功能, 如黄历,星座,节日等等。 1.3 任务与分析任务与分析 要求:模仿现实生活中的挂历。 当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)。 当系统日期变到下一月时,系统自动翻页到下一月 分析: 1 1:难点在于判断星期,但根据蔡勒公式,可以很容易地有年月日推断出星期: nday

7、=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nday%7; 其中 year:要查询的年份 nday:从该年的一月一日起到该天的天数 w:得出的星期数,w=0 表示星期天。 在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过定长度 输出日期,在遇到某天时星期六时,就换行输出,因此可以按照月历的格式输出。 对于初始输入当前月历,可以通过中的 time 和 localtime 函数取出系统 时间进行初始化。 time_t timer; struct tm* gmt; time( gmt=localtime( gmt 就是一

8、个时间结构体,可以从中取出年月日。 2 2:闰年的判断,能被 4 整除但不能被 100 整除,或者能被 400 整除的年份为闰年, 否则为平年。日期的查询,就是直接打印改天所在月份的月历。 3 3:判断日期是否合法,可以先判断年月日是否有小于 0 的值,月和日是否有超出 最大值 12 和 31 ,如果通过此判断合法,再判断是否时闰年,如果时闰年,则判 断二月份是否满足要求,闰年二月份不能超过 29 天,平年二月份不能超过 28 天。 在查询过程中,如果发现输入不合法或者不满足输入要求,则要求重新输入。 2 2 程序的主要功能程序的主要功能 查询万年历 2.1 显示功能显示功能 能够显示以系统当

9、前时间为准的日历。 2.2 自动翻页功能自动翻页功能 能够随系统时间改变而自动翻页到下一页。 2.3 查询功能查询功能 能够查询任意年份和月份的万年历。 2.4 帮助功能帮助功能 提供程序使用的说明。 2.5 退出功能退出功能 随时退出程序。 3 3 程序运行平台程序运行平台 vc+6.0。 具体操作如下:新建行编辑器工程,然后按照要求编写代码,再编译,链接,执 行等。要是出现报错,就依次查找错误行,分析报错原因并修改。 4 4 总体设计总体设计 图 4.1 流程图 图 4.2 功能模块 1、日期显示 2、日期查询 3、帮助文件 4、退出程序 2、日期查询 1、日期显示 3、帮助文件 4、程序

10、结束 进入程序 显示日历 月历显示 日期查询日期判断日期打印闰年判断 5 5 程序代码明细程序代码明细 #include #include #include #include int year,month,day;/全局变量记录时间 int daysofmonth212=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31, 30,31; int runyear(int year)/判断是否是闰年 int flag=0; if(year%400=0|(year%4=0 return flag; struct tm*

11、getday()/从系统取得当前时间 time_t timer; struct tm* gmt; time( gmt=localtime( return gmt; int dayexame(int year,int month,int day)/检查日期是否正确 if(year0|month12|day31) return 0; switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day31)return 0;break; case 4: case 6: case 9: case 11: if(d

12、ay30)return 0;break; default: if(runyear(year) else if(runyear(year)=0 return 1; 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; void printcal

13、ender(int year,int month,int day)/打印月历 int i; int w; int n; int nowday=1; 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); w=getwday(year,month,nowday);/找到第一天的星期 n=daysofmonthrunyear(year)month-1; switch(w)/放置第一天

14、 case 0:printf(%5d,nowday);break; case 1:printf(%10d,nowday);break; case 2:printf(%15d,nowday);break; case 3:printf(%20d,nowday);break; case 4:printf(%25d,nowday);break; case 5:printf(%30d,nowday);break; default:printf(%35dn,nowday); nowday+; for(i=1;i2)f=1; while(f=1);pr switch(*menu) case 1: syste

15、m(cls);/清屏 printcalender(year,month,day); backmenu();/实现任意键返回主菜单 mainmenu(year,month,day); break; case 2: system(cls); checkcalender(); backmenu(); mainmenu(year,month,day); break; case 3: system(cls); printf(在主菜单中输入相应的数字就可以完成以下功能:nn); printf(* 1、显示今天所在月的月份nn); printf(* 2、输入日期,判断该年是否是闰年,并显示所在月份的月历nn

16、); printf(* 3、显示功能及操作方法nn); printf(* 4、退出程序nn); backmenu(); mainmenu(year,month,day); break; case 4:system(cls);printf(程序已退出!n);exit(0); default:printf(%c输入错误!n,7);flag=1; while(flag); void main() struct tm *gmt=getday(); year=gmt-tm_year+1900; month=gmt-tm_mon+1; day=gmt-tm_mday; printcalender(year

17、,month,day);/用系统时间进行初始化,打印当前月历 backmenu(); mainmenu(year,month,day); 6 6 模块分析模块分析 6.16.1 系统日期模块系统日期模块 struct tm* getday()/从系统取得当前时间 time_t timer; struct tm* gmt; time( gmt=localtime( return gmt; 6.26.2 打印模块打印模块 void printcalender(int year,int month,int day)/打印月历 int i; int w; int n; int nowday=1; ch

18、ar 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); w=getwday(year,month,nowday);/找到第一天的星期 n=daysofmonthrunyear(year)month-1; switch(w)/放置第一天 case 0:printf(%5d,nowday);break; case 1:printf(%10d,nowday);break; case 2:p

19、rintf(%15d,nowday);break; case 3:printf(%20d,nowday);break; case 4:printf(%25d,nowday);break; case 5:printf(%30d,nowday);break; default:printf(%35dn,nowday); nowday+; for(i=1;in;i+) w=getwday(year,month,nowday); printf(%5d,nowday); if(w=6)/如果是星期六则换行打印 puts(n); nowday+; printf(n*nn); 6.36.3 闰年判断模块闰年判

20、断模块 闰年的判断,能被 4 整除但不能被 100 整除,或者能被 400 整除的年份为闰年, 否则为平年。日期的查询,就是直接打印改天所在月份的月历。 int runyear(int year)/判断是否是闰年 int flag=0; if(year%400=0|(year%4=0 return flag; 6.46.4 查询模块查询模块 void checkcalender()/查询日历 int year,month,day; system(cls); printf(请输入你要查询的日期(格式为年月日,如 2010 12 12):); scanf(%d%d%d, while(!dayexa

21、me(year,month,day) /如果日期输入不正确,则重新输入 printf(%c 你输入的日期错误,请重新输入:,7); scanf(%d%d%d, 6.56.5 菜单模块菜单模块 void mainmenu(int year,int month,int day)/主菜单 char menu100; int flag=0; printf(*主菜单*n); printf(*1、日历显示 *n); printf(*2、日历查询 *n); printf(*3、帮助 *n); printf(*4、退出 *n); printf(*n) 6.66.6 关键代码关键代码 struct tm* ge

22、tday(); 该函数用以取得系统的时间。该函数没有参数,返回值类型为 struct tm*,是一个包含时间的结构体。 int dayexame(int year,int month,int day); 该函数用以判断输入的年份是否合法,参数为要判断的年月日,返回值为 1 表示该日期合法,为 0 表示不合法。 int getwday(int year,int month,int day); 该函数用以根据一个日期推断星期,参数为要判断的年月日。返回值为整型,123456 分别表示星 期一到星期六,0 表示星期天。 void checkcalender(); 该函数用以显示要查询的日期的月历,无

23、参数和返回值, 。 void inline backmenu(); 该函数为内联函数,用以实现完成某项功能后按任意字符键返回主菜单,无参数和返回值, void mainmenu(int year,int month,int day); 该函数参数为系统日期,无返回值,用户在该函数执行时可以选择功能。 7 7 系统测试系统测试 首先进入 vc+6.0,打开工程 person.dsw,然后进入源程序,接着选择 build 下的 execute person.exe 即可,也可以不打开工程,直接双击 person 文件夹下的 debug 或 release 子文件夹下的 person.exe 文件即

24、可运行程序。 7.1 进入程序 7.2 按任意字符返回主菜单 在键盘上输入任意字符,进入主菜单 7.3 1 号功能 显示系统时间 7.4 2 号功能 输入 2011 1 5 得到 2011 年 1 月 5 日的日历 输入 1 111 1(测试对错误日期的判断) 提示错误信息,要求重新输入 7.5 3 号功能 得到提示信息 7.6 4 号功能 成功退出 8 结论 此程序是自己所写的第一个功能比较完整的能实现一定的实际功能的程序,代 码比较短,不到 200 行,实现的功能有显示当前日历,进行某天的查询,闰年的判 断,日期的合法性判断,简单的提示信息。然后在程序编写过程中,遇到了一些细 节性的问题,

25、比如在乱输入的情况下,有时会出现程序崩溃,后来通过修改,修正 了漏洞。到写报告为止,漏洞基本被找出,并得到修正。通过写这个程序,我对程 序的健壮性有了更深的认识,也更加注意程序的细节问题。 完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运 行时可能不断出现麻烦。如编译程序检测出一大堆错误。有时程序本身不存在语 法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译 系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程 序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是 非常重要的。有时候一个消耗你几个小时时间的小小错误,

26、调试高手一眼就看出 错误所在。 通过这次为数不多的几天计算机实践学习,我了解了一些关于 c 语言的知识,理 解巩固了我 c 语言的理论知识,这对我将来到社会工作将会有莫大的帮助。同时 它让我知道,只要你努力,任何东西都不会太难。 最后小结:程序设计过程有如何解决实际问题,从解决实际问题的角度,我们 可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到 输出的要求是什么;其次,从问题的要害入手,从前到后的解决问题的每个方面, 即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需 的变量、数组、函数,然后确定处理过程算法。可得最后结论。 附附 录(可选)录(可选

27、) 附录 1 源程序清单 #include #include #include #include int year,month,day; int daysofmonth212=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,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=localti

28、me( return gmt; int dayexame(int year,int month,int day) if(year0|month12|day31) return 0; switch(month) case 1: case 3: case 5: case 7: 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 retu

29、rn 1; 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; void printcalender(int year,int month,int day) int i; int w; int n; int nowday=1; 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); w=getwday(year,month,nowday); n=days

温馨提示

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

评论

0/150

提交评论