万年历查询系统 Java课程设计 课程设计报告 源代码.doc_第1页
万年历查询系统 Java课程设计 课程设计报告 源代码.doc_第2页
万年历查询系统 Java课程设计 课程设计报告 源代码.doc_第3页
万年历查询系统 Java课程设计 课程设计报告 源代码.doc_第4页
万年历查询系统 Java课程设计 课程设计报告 源代码.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

湖南商学院面向对象程序设计课程设计报告题目 万年历查询系统 姓 名:龚丁禧学 号:070920093专 业:计算机科学与技术班 级:计科0703指导教师:刘耀职 称:讲师计算机与电子工程学院2009年6月课程设计评审表姓 名龚丁禧学 院计算机与电子工程学院学 号070920093专业班级计科0703题 目万年历查询系统评审意见评审成绩指导教师签名职称评审时间 年 月 日课程设计作品验收表题目万年历查询系统参与人员姓 名龚丁禧班 级计科0703学 号070920093设计任务与要求:作品完成情况:验收情况: 验收教师签名:_ 年 月 日注:1. 除”验收情况”栏外,其余各栏均由学生在作品验收前填写。2. “验收情况”栏由验收小组按实际验收的情况如实填写。目 录1 课程设计过程概述12 课程设计题目描述和基本设计要求13 系统需求分析13.1 功能需求分析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课程培训,我们按要求在实验楼二楼网络机房进行了学年度课程设计。这次课程设计的主要目的是结合面向对象程序设计课程,培养我们面向对象软件开发的思维,提高用Java编程的实际动手能力并增强大家对面向对象的了解。这次课程设计的主要内容是独立用Java语言开发一个小的应用程序、网络应用程序或者是管理系统,从而深刻体会面向对象软件开发的方法。2 课程设计题目描述和基本设计要求我设计的是一个万年历。万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用。在我设计的万年历中,按月份查询,实现了显示查询19012100年某月所有日期的阴阳历对照,并且添加了二十四节气与重大节日等信息,界面采用日常的星期与月份结合的格式,方便查看与使用。 基本设计要求如下:(1)能够实现显示19012100年的日期,包括公历、农历、星期、二十四节气;(2)能够按照月份格式显示,或按照星期格式显示;(3)能够显示系统日期;(4)尽量使用图形界面实现,要符合日常软件使用规范。3 系统需求分析3.1 功能需求分析为了实现一个万年历的功能,首先需要了解阳历日期是怎样分布的;其次,要实现星期与月份格式的显示,则需了解每个月有多少天,这个月的第一天是星期几称为初始星期;要实现阳历与农历信息的同步查询,则必需了解农历日期的分布规律;最后,节气与节日的显示则要找到万年历涉及的年份的节气表,重大节日的规律还是很简单的,反正每年的节日都是固定的,只用一个表就可以查询了。3.2 其他需求分析(1)性能描述界面友好、简洁,查询操作简单,查询完后应该随时都能回到今天的信息当中。(2)设计平台开发工具:jdk1.6 和 eclipse3.2;运行环境:Windows 2000以上;(3)界面要求以Windows窗口形式显示,右上角有最小化按钮、关闭按钮;设置两个下拉表用于查询年月,一个今天按钮用于返回当日信息。4 系统设计4.1 总体设计我设计的万年历查询系统主要功能就是查询与显示。交互界面只有查询与显示当日信息两项,所有信息都已经由数据表与算法结合的方式实现,显示信息由事件调用算法自动刷新。其处理过程图如下:图1 信息处理图4.2数据存储设计4.2.1 静态数据(1)星期在java.util.Calendar.getTime()中返回的是英文信息如”sun”,为了便于识别,将其转换成相应的中文”星期日”,以字符串数组的形式存储,两个数组一一对应,便于实现转换,源代码如下:private String stringWeekEn = new String “SUN”, “MON”, “TUE”, “WED”,“THU”, “FRI”, “SAT” ;private String stringWeekCn = new String “星期日”, “星期一”, “星期二”, “星期三”,”星期四”, “星期五”, “星期六” ;(2)月份月份的存储同星期,以英汉对照式的数组存储,同样便于存取转换。(3)农历农历的算法实现异常困难,这里采用数据表的形式将农历信息保存,使农历与阳历的转换变得易于实现,但这也限制了农历表的实现只能查询到表中的有限个。表中每个十六进制数存有一年的信息,第一位保存闰月信息,中间三位保存12个月的信息,最后一位说明今年闰月是几月。以0x04bd8为例,是保存了1900年的农历信息,最后一位说明今年八月是闰月;第一位要么为0,要么为1,为0说明闰月只有29,为1则闰月为30天;中间三位展开来看有多少位为1,为零的这个月有29天,为1的这个月有30天。final private static long lunarInfo = new long 0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,;(4)节气节气同农历的存储一样没有任何规律可言,只能利用数据表的方式将各年的节气信息保存。上面列出的数据是1900年的节气表,一年24个节气,每个月两个,利用多维数组对应存储,方便取出信息。表 1 节气表数据类型数据大小Int7*12*2String12*2private final static int solarTermDate= new int6,20,4,18,6,21,5,20,6,21,6,22,7,23,8,23,8,23,9,24,8,23,7,22private final static String solarTerm = new String “小寒”, “大寒”, “立春”,”雨水”, “惊蛰”, “春分”, “清明”, “谷雨”, “立夏”, “小满”, “芒种”, “夏至”, “小暑”, “大暑”, “立秋”, “处暑”, “白露”, “秋分”, “寒露”, “霜降”, “立冬”, “小雪”, “大雪”, “冬至” ;(5)节日表同节气表,不再赘述。4.2.2 计算数据(1)阳历月份天数计算46911几个小月返回29天, 2月经过判断是否为闰年,选择返回28或29天,其余月份为大月,返回31天。(2)查询月份的初始星期由java.util.Calendar.set(int year, int month,int date)设置日历类的信息,把date设置为1即为这个月第一天,再由java.util.Calendar.getTime()返回英文表示的星期信息,即这个月的初始星期。4.3 万年历查询系统界面设计(1)窗体的设计窗体整个框架使用javax.swing.JFrame类构造,JFrame使用add()添加组件,我在万年历中添加了了三个javax.swing.JPanel类来对JFrame格式化,实际上也就是将窗体分成了上中下三部分。JPanel中的setGridLayout(int rows,int cols,int hgap,int vgap)方法可以将JPanel按指定的行、列、水平间距、垂直间距进行分区,类似于表格形式,比如setGridLayout(1,3,10,0)表示将Jpanel分成1行3列,水平间距为10,垂直间距则可以是任意值,由系统自动调节。并且通过将javax.swing.JComboBox,javax.swing.JButoon,javax.swing.JLabel添加到相应JPanel上实现整个窗体的融合。我在万年历中用JPanel进行了以下分区:下拉表1下拉表2今天按钮 系统时间星期日星期一星期二星期三星期四星期五星期六图 2 窗体设计图JFrame在其右上角都有三个控制图标,分别代表将窗口最小化、窗口最大化和关闭的操作,其中最小化和最大化操作JFrame可自动完成,而关闭窗口操作实现需要书写有关的代码,在我的程序中我采用的是引发WindowsEvent类代表的窗口事件。相应源代码为:addWindowListener(new WindowAdapter() /窗口侦听器,以从此窗口接收窗口事件public void windowClosing(WindowEvent e) /处理窗口关闭事件 System.exit(0); );(2)下拉表的设计javax.swing.JcomboBox是实现下拉表的一个类,在我的万年历中使用了两个下拉表,一个用于查询年份,一个用于查询月份。它们的位置如图 2 所示。(3)按钮的设计在我的万年历中只有一个按钮,其目的是为了随时都能当日信息的显示中,位置如图 2 所示。(4)星期与日期的显示设计如图 2 所示,按星期与月份的格式排列,一个月至少要有12 行才能保证信息显示完全,其中阳历日期与农历日期隔行显示,使用了12*7=84个标签。4.4 各功能模块设计4.4.1 阳历日期显示设计在java中实现阳历的查询异常方便,因为java.util.GregorianCalendar这个类就是处理日历信息的,它几乎集成了所有日历属性,我们只要调用其中的某个方法就能很方便地得到我们想要的信息了。在我的万年历中需要查询某月或返回今日信息时,都是调用GregorianCalendar中的方法来实现的。GregorianCalendar.getTime()返回一个date类,将date通过date.toString().split(“ “)方法返回一个字符串数组存于sysNowTime中,调用sysNowTime即能得到当日的年月日初始星期等信息,这样就能将当前信息贴上标签显示出来了,添加阳历信息后的万年历效果如(图 3)。初始星期对应标签label0i,i取06,将label0i的内容设为1,代表这个月的1号,设这个月有month天,循环month次,依次将对应标签内容设为日期。因为日历不仅要显示阳历信息,还要显示农历信息,所以阳历日期的排列是隔行排列的,即由label06跳至label20,再由label26跳至label40,以此类推。为了实现这个功能,我用了一个switch语句,源代码如下:a1=i/7;/i即为当前表示的日期,a1表示数组的第一维下标switch(a1) case 0: a1=0;break;case 1: a1=2;break;case 2: a1=4;break;case 3: a1=6;break; case 4: a1=8;break;case 5: a1=10;break;图 3 添加阳历信息后的万年历效果图4.4.2 农历日期显示设计阴阳历法换算,尽管有不少专家学者一直苦苦寻找一个固定的程式,但至今仍没有结果。目前我们日常使用的万年历均是参照1993年出版的中美天文万年历一书制定,但书中精确的天文日月时间只从1900到2010年,所以我的万年历中也只用查表的方式实现了这些年份的显示。农历算法已经实现,再在阳历已经实现的基础上添上农历信息就不难了,所以这里简述一下农历是怎么算出来的。要算出某年某月某日的农历日期,只能采用逐日递推的方式,这里以1900年1月31的日期为依据,它的农历日期为一九零零年大年初一,调用日历类GregorianCalendar可以算出所求日期与1900年1月31日相差多少天,设这个差值为offset,则用offset与19002100的农历年天数逐个相减,当offset=0时,可以确定当前农历年份。再用相减后得到的offset与得到的年份的农历月天数逐个相减,同理,当offset=0时可以确定农历月份。最后,Offset加上当前月份的天数就可以得到农历日期了,至此,阳历与农历的转换算法得以实现。在排列阳历日期时,调用阳历与农历的转换算法得到相应农历日期,将对应阳历日期标签下的内容设为农历日期,核心源代码如下:for (int i = initWeek; i initWeek + monthDays; i+)labelDaya1a2.setText(String.valueOf(i - initWeek + 1);labelDaya1+1a2.setText(getChinaDate(int) (l2);最后效果图如 图 4。图 4 添加阳历与农历信息后效果图4.4.3 节气节日显示设计二十四节气的分布没有单一的规律可言,但是就一定时期来看,它的分布还是有据可循的,在我的万年历中用查表的方式实现了近200年的节气查询。每个月两个节气,只要确定了年份与月份,就可以到节气数表solarTermDate取出是哪两天,将对应标签的内容用节气覆盖农历日期,所以节气信息比农历节日信息优先显示。节日的分布是固定的,较之节气来说,更容易操作和实现,我假设每个月份三个节日,在排列中,只需取出每个月的三个节日的日期比较一下,相等就把日历信息修改一下,所以节日有较节气信息优先显示。部分源代码如下:/显示二十四节气if(i - initWeek + 1) = solarDay)labelDaya1+1a2.setText(solarTermmonth-1j+);if(j=1)solarDay=solarTermDatearrmonth-1j;/显示每个月的节日if(i-initWeek+1)=sFtvDay)if(sFtvmonth-1k!=null)labelDaya1+1a2.setText(sFtvmonth-1k+);labelDaya1+1a2.setFont(new Font(黑体, Font.BOLD, 8);if(k=2)sFtvDay=sFtvDatemonth-1k;最后,添加上节气与节日的万年历显示完成其效果如(图 5):图 5 添加节气节日信息后的万年历效果图4.4.4 下拉表与今天的查询功能设计在我的万年历中定义了一个响应选择下拉表事件的方法setChangeDate(),这个方法需要做以下两件事:算出所选择的年月信息;用得到的信息调用显示方法刷新显示内容。在一个下拉表中javax.swing.JComboBox.getSelectedIndex()可以返回当前选中的下拉表内容的序号,这个序号加上1900即为所查找年份。同理可得到查找的月份。得到的年月作为java.util.Calendar.set(int year, int month, int date)的参数,date设为1即这个月的第一天,得到这个月的初始信息,这样完全可以将这个月的信息显示出来了。查询功能实现。今天这个按钮的功能实现与下拉表大同小异,只是定义的响应方法不同,将上面Calendar.set(int year, int month, int date)的参数修改为当日信息即可。4.4.5 系统时钟时间显示设计javax.swing.Timer这个类可以方便地实现对时钟时间的操作,Timer类大多用于计划功能,这里用于刷新系统时间的显示,javax.swing.Timer.Timer(int delay, ActionListener listener)delay可以设置隔多长时间执行任务,listener即用于监听的事件,每隔一定时间执行一次,这里delay以毫秒为单位,设为1000,实际上就是一秒,这样闹钟就能每秒钟刷新一次,保证时间显示正确。它的部分源代码如下:class TimerListener implements ActionListener public void actionPerformed(ActionEvent e) GregorianCalendar g = new GregorianCalendar();String clock = new String(g.getTime().toString().split( )3);labelTime.setText(clock);添加时钟后效果图可以在图 5中看到。4.5 异常处理情况说明在我编写万年历的过程中主要遇到了以下几种异常情况,最后都得以成功处理。(1)NulPointerExcption(空指针异常)引起空指针异常的原因主要有两个:引用了没有初始化的变量或类;逻辑错误。最后我发现是自己的labelDay数组后面有一部分没有初始化,初始化得以解决。(2)ArrayIndexOutOfBoundsException(数组越界异常)要解决这个问题当然得保证使引用的数组不会越界,引起的原因也有两个:自己定义的数组够用,但是引用过程中计算出错,导致异常,这样检查起来也较困难;另一种情况是定义的数组长度小了,一般来说很容易发现。我遇到的异常是由于计算错误导致,阳历日期的排列是隔行的,label的第一维跳跃前进,即按0-2-4-6-8-10这种规律前进,我算成了1-3-5-7-9-11,导致数组越界。(3)逻辑异常我说的逻辑异常是指没有报错、没有异常警告的情况下,程序总是不能得到期望的结果。我在万年历的设计中遇到了这种异常,是由于自己对数组的使用不够熟练所致。调用GregorianCalendar类返回的月份信息是按日常生活得习惯从1-12排列的,而数组的下标是从0开始的,我在处理而者时没有进行转换,结果总是不能得到正常结果。5 系统实现与调试(1)系统实现在安装jdk1.5以上版本的计算机上可以用Dos运行,也可以借助Eclipse等编译工具实现。万年历的显示如(图 6),它的操作很简单,选中年份下拉表选择年份,选中月份下拉表选择月份,就可以查询到某年某月的每天的信息了。查询完毕后,点击”今天”将回到当前月的显示,其中篮框突出显示的为今天的日期,(图 6)显示的是2009年6月27,农历日期六月初五。图6 万年历显示界面(2)调试随意选择一个年份和月份,用查询结果与我下载的一个万年历软件进行比较,重复多次,测试结果没有一丝差错。在每次查询完后点击今天按钮,每次都能回到今天的界面。6 课程设计总结6.1 遇到的问题及解决办法在此次课程设计中,我遇到了一些问题,如:对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难;对于Java语言,只学习到了一些最基本的知识,这导致编写程序时经常出现一些语法错误,而且要在短时间内用Java语言来设计一个具体的系统是一个较大的挑战;还有对于正规开发一个系统的流程不熟悉,适应起来比较慢,编写各个模块相对应的操作时,自己感觉难以动手,这表明所学的知识不能灵活运用到实际中。 对于以上的问题,自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解,还有就是多跟精通此方面的老师和同学交流,取其精华。对于实际动手能力与系统开发的流程的适应,必须多进行实际的练习与操作,才能有大的进步。6.2 心得体会在这次的学年度课程设计中,我主要运用了Java语言的界面设计、异常处理、Awt控件、Swing控件、输入输出流等,综合运用了Java语言。我深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。通过这次为时十天的课程设计,我学到了很多的东西,下面就这在这次课程设计中的心得体会总结如下:在这次课程设计中,主要是运用Java语言来编写,并可运用其他的技术。在我的系统中,还采用了Swing控件、输入输出流等技术,而这些知识都是我们没有学过的,这就要求我们去查阅相关书籍。正因为这样,才锻炼了我的自学能力,为以后的学习打下了基础。此外,我还深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础通过十天的努力,这次课程设计圆满的结束了,在这个过程中,我学到了很多的知识,同时也非常感谢刘耀老师的帮助与指导。在以后的学习中,我会更加努力的学好专业知识,并将所学知识用于实践当中去,以便牢固掌握知识。参考文献1 朱福喜,傅建明JAVA项目设计与开发范例M 北京:电子工业出版社,20052 王强,贾素玲JAVA程序设计M 北京:清华大学出版社,20073 王文涛,袁海燕JAVA实用程序设计100例M 北京:人民邮电出版社,20054 雍俊海JAVA程序设计M 北京:清华大学出版社,20065 刘宝林JAVA程序设计与案例M 北京:高等教育出版社,2006附录源程序主要类和方法简列如下:/* * LunarCalendar.java * Star 制作 */主类public class LunarCalendar extends JFrame implements ActionListener,ItemListener /构造器,提供初始化等信息public LunarCalendar(String title)/将当前时间信息保存到sysNowTimepublic void getSysDate()/将万年历要显示的信息保存到sysRunTimepublic void getSysRunDate()/响应按钮事件及其方法public void actionPerformed(ActionEvent ae)/响应下拉表选择事件及其方法public void itemStateChanged(ItemEvent aa)/返回一个整数值,用于寻找stringMonthCn数组中对应的中文月份public int turnMonth(String month)/给gregorianCalendar设置信息,/主要为了返回初始星期,所以date为1public void setSysDate(int year, int month)/将显示日期的标签内容初始化为空public static void setDateNull()/返

温馨提示

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

评论

0/150

提交评论