《万年历查询系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《万年历查询系统课程设计报告.docx(19页珍藏版)》请在第壹文秘上搜索。
1、领南甯老就面向对上程方世计课程设计报告题目万年历查询系统姓名:学号:专业:一计算机科学与技术一班级:计科指导教师:职称:讲师计算机与电子工程学院2009年6月课程设计评审表姓名学院计算机与电子工程学院学号专业班级计科题目万年历查询系统评审意见评审成绩指导教师签名职称评审时间年月日课程设计作品验收表题目万年历查询系统参与人员姓名班级计科学号设计任务与要求:作品完成情况:验收情况:验收教师签名:注:1.除“脸收情况”栏外,其余各栏均由学生在作品脸收前填写。2.“验收情况”栏由脸收小组按实际验收的情况如实填写。1课程设计过程概述12课程设计题目描述和基本设计要求13系统需求分析13.1 功能需求分析
2、13.2 其他需求分析24系统设计24.1 总体设计24.2 数据存储设计34.2.1 静态数据34.2.2 计算数据44.3 万年历查询系统界面设计44.4 各功能模块设计64.4.1 阳历日期显示设计64.4.2 农历日期显示设计74.4.3 节气节日显示设计84.4.4 下拉表与今天的查询功能设计94.4.5 系统时钟时间显示设计104.5 异常处理情况说明105系统实现与调试116课程设计总结126.1 遇到的问题及解决办法126.2 心得体会13参考文献13附录14万年历查询系统1课程设计过程概述在2009年6月,学院对我们进行了为期两周的JaVa课程培训,我们按要求在实验楼二楼网络
3、机房进行了学年度课程设计。这次课程设计的主要目的是结合面向对象程序设计课程,培养我们面向对象软件开发的思维,提高用JaVa编程的实际动手能力并增强大家对面向对象的了解。这次课程设计的主要内容是独立用Java语言开发一个小的应用程序、网络应用程序或者是管理系统,从而深刻体会面向对象软件开发的方法。2课程设计题目描述和基本设计要求我设计的是一个万年历。万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用。在我设计的万年历中,按月份查询,实现了显示查询19012100年某月所有日期的阴阳历对照,并且添加了二十四节气与重大节日等信息,界面采用日
4、常的星期与月份结合的格式,方便查看与使用。基本设计要求如下:(1)能够实现显示19012100年的日期,包括公历、农历、星期、二十四节气;(2)能够按照月份格式显示,或按照星期格式显示;(3)能够显示系统日期;(4)尽量使用图形界面实现,要符合日常软件使用规范。3系统需求分析3.1功能需求分析为了实现一个万年历的功能,首先需要了解阳历日期是怎样分布的;其次,要实现星期与月份格式的显示,则需了解每个月有多少天,这个月的第一天是星期几一一称为初始星期;要实现阳历与农历信息的同步查询,则必需了解农历日期的分布规律;最后,节气与节日的显示则要找到万年历涉及的年份的节气表,重大节日的规律还是很简单的,反
5、正每年的节日都是固定的,只用一个表就可以查询了。3.2其他需求分析(1)性能描述界面友好、简洁,查询操作简单,查询完后应该随时都能回到今天的信息当中。(2)设计平台开发工具:jdkl.6和eclipse3.2;运行环境:WindoWS2000以上;(3)界面要求以WindoWS窗口形式显示,右上角有最小化按钮、关闭按钮;设置两个下拉表用于查询年月,一个今天按钮用于返回当日信息。4系统设计4.1 总体设计我设计的万年历查询系统主要功能就是查询与显示。交互界面只有查询与显示当日信息两项,所有信息都已经由数据表与算法结合的方式实现,显示信息由事件调用算法自动刷新。其处理过程图如下:I-开始|一当日信
6、息查询|一|查询信息今日关闭图1信息处理图4.2 数据存储设计4.2.1 静态数据(1)星期在java.util.Calendar.getTime()中返回的是英文信息如“sun”,为了便于识别,将其转换成相应的中文“星期日,以字符串数组的形式存储,两个数组一一对应,便于实现转换,源代码如下:privateStringStringWeekEn=newStringSUN,“MON,叮UE“,“WED,“THU”,FR,“SAT”;privateStringStringWeekCn=newString“星期日”,“星期一”,“星期二”,“星期三星期四,星期五”,“星期六”;(2)月份月份的存储同星
7、期,以英汉对照式的数组存储,同样便于存取转换。(3)农历农历的算法实现异常困难,这里采用数据表的形式将农历信息保存,使农历与阳历的转换变得易于实现,但这也限制了农历表的实现只能查询到表中的有限个。表中每个十六进制数存有一年的信息,第一位保存闰月信息,中间三位保存12个月的信息,最后一位说明今年闰月是几月。以0x04bd8为例,是保存了1900年的农历信息,最后一位说明今年八月是闰月;第一位要么为0,要么为1,为0说明闰月只有29,为1则闰月为30天;中间三位展开来看有多少位为1,为零的这个月有29天,为1的这个月有30天。finalprivatestaticlongIunarInfo=newl
8、ong0x04bd8,0x04ae0,0x0a570,OxO54d5,0x0d260,0x0d950,0x16554,OxO56aO,0x09ad0,0x055d2,);(4)节气节气同农历的存储一样没有任何规律可言,只能利用数据表的方式将各年的节气信息保存。上面列出的数据是1900年的节气表,一年24个节气,每个月两个,利用多维数组对应存储,方便取出信息。表1节气表数据类型数据大小Tnt7*12*2String12*2privatefinalstaticintSolarTermDate=newint6,20,4,18,6,2i,5,20,6,21,6,22,7,23,8,23,8,23,9,
9、24,8,23,7,22privatefinalstaticStringSolarTerm=newString小寒,大寒,“立春,”雨水”,(惊蛰”,春分”,“清明”,谷雨叽“立夏”,“小满”,“芒种”,“夏至”,“小暑”,“大暑”,“立秋”,处暑叽“白露”,“秋分叽“寒露”,“霜降叽“立冬”,“小雪”,“大雪”,“冬至”;(5)节日表同节气表,不再赘述。4.2.2 计算数据(1)阳历月份天数计算46911几个小月返回29天,2月经过判断是否为闰年,选择返回28或29天,其余月份为大月,返回31天。(2)查询月份的初始星期java.util.Calendar.set(intyear,intmo
10、nth,intdate)设置日历类的信息,把date设置为1即为这个月第一天,再由java.util.Calendar.getTime()返回英文表示的星期信息,即这个月的初始星期。4.3 万年历查询系统界面设计(1)窗体的设计窗体整个框架使用javax.swing.JFrame类构造,JFrame使用add()添加组件,我在万年历中添加了了三个javax.swing.JPanel类来对JFrame格式化,实际上也就是将窗体分成了上中下三部分。JPanel中的SetGridLayoUt(introws,intcols,inthgap,intvgap)方法可以将JPanel按指定的行、歹(I、水
11、平间距、垂直间距进行分区,类似于表格形式,比如setGridLayout(1,310,0)表示将JPanel分成1行3列,水平间距为10,垂直间距则可以是任意值,由系统自动调节。并且通过将javax.swing.JComboBox,javax.swing.JButoon,javax.swing.JLabel添加到相应JPanel上实现整个窗体的融合。我在万年历中用JPanel进行了以下分区:下拉表1下拉表2I今天按钮系统时间星期日星期一星期二星期三星期四星期五星期六图2窗体设计图JFrame在其右上角都有三个控制图标,分别代表将窗口最小化、窗口最大化和关闭的操作,其中最小化和最大化操作JFra
12、me可自动完成,而关闭窗口操作实现需要书写有关的代码,在我的程序中我采用的是引发WindOWSEVent类代表的窗口事件。相应源代码为:addWindowListener(newWindOWAdaPter()窗口侦听器,以从此窗口接收窗口事件publicvoidwindowClosing(WindowEvente)处理窗口关闭事件System.exit(O););)(2)下拉表的设计javax.swing.JcomboBox是实现下拉表的一个类,在我的万年历中使用了两个下拉表,一个用于查询年份,一个用于查询月份。它们的位置如图2所示。(3)按钮的设计在我的万年历中只有一个按钮,其目的是为了随时
13、都能当日信息的显示中,位置如图2所示。(4)星期与日期的显示设计如图2所示,按星期与月份的格式排列,一个月至少要有12行才能保证信息显示完全,其中阳历日期与农历日期隔行显示,使用了12*7=84个标签。4.4 各功能模块设计4.4.1 阳历日期显示设计在java中实现阳历的查询异常方便,因为java.util.GregorianCalendar这个类就是处理日历信息的,它几乎集成了所有日历属性,我们只要调用其中的某个方法就能很方便地得到我们想要的信息了。在我的万年历中需要查询某月或返回今日信息时,都是调用GregorianCalendar中的方法来实现的。GregorianCaIendar.g
14、etTime()返回一个date类,将date通过date.toString().split(ii)方法返回一个字符串数组存于SySNoWTime中,调用SySNoWTime即能得到当日的年月日初始星期等信息,这样就能将当前信息贴上标签显示出来了,添加阳历信息后的万年历效果如(图3)o初始星期对应标签labelOi,i取06,将Iabel0i的内容设为1,代表这个月的1号,设这个月有month天,循环month次,依次将对应标签内容设为日期。因为日历不仅要显示阳历信息,还要显示农历信息,所以阳历日期的排列是隔行排列的,即由IabeI跳至Iabel,再由Iabel跳至Iabel,以此类推。为了实现这个功能,我用了一个SWitCh语句,源代码如下:al=i7;i即为当前表示的日期,al表示数组的第一维下标switch(al)case0:al=0;break;case1: