JAVA《万年历系统》课程设计报告附源码要点.docx

上传人:苏美尔 文档编号:11726512 上传时间:2021-09-01 格式:DOCX 页数:40 大小:330.16KB
返回 下载 相关 举报
JAVA《万年历系统》课程设计报告附源码要点.docx_第1页
第1页 / 共40页
JAVA《万年历系统》课程设计报告附源码要点.docx_第2页
第2页 / 共40页
JAVA《万年历系统》课程设计报告附源码要点.docx_第3页
第3页 / 共40页
JAVA《万年历系统》课程设计报告附源码要点.docx_第4页
第4页 / 共40页
JAVA《万年历系统》课程设计报告附源码要点.docx_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《JAVA《万年历系统》课程设计报告附源码要点.docx》由会员分享,可在线阅读,更多相关《JAVA《万年历系统》课程设计报告附源码要点.docx(40页珍藏版)》请在三一文库上搜索。

1、学号2013-2014学年 第二学期面向对象程序设计课程设计报告题目: 万年历系统专业:计算机科学与技术班级:姓名:学号:指导教师:成绩:计算机与信息工程系2014年6月6日目录1 设计内容及要求 11.1 设计内容 11.2 设计任务及具体要求 12概要设计 22.1 程序设计思路 22.2 总体程序框图 33设计过程或程序代码 43.1 各个模块的程序流程图及运行界面 43.2 对关键代码加以分析说明 74设计结果与分析 134.1 程序调试的结果 134.2 程序设计分析 135 小结 14致谢 15参考文献 16源程序 17计算机与信息工程系 面向对象程序设计课程设计报告1设计内容及要

2、求1.1 设计内容万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历 或阴历的日期的年历,方便有需要的人查询使用。在我设计的万年历中主要有:(1)使用图形用户界面来查询用用户所需的日期信息,符合日常软件使用 规范。(2)按月份查询,实现了显示查询 19012100年某月所有日期的阴阳历对 照。(3)并且添加了重大节日与星座等信息,界面采用日常的星期与月份结合 的格式,方便查看与使用。(4)编写万年历的课程设计,是为了使同学们更加了解高级程序设计语言 的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求 解问题的能力,具备初步的高级语言程序设计能力。为后续各门

3、计算机课程的学 习和毕业设计打下坚实基础。1.2 设计任务及具体要求利用JAVA语言编写的万年历系统采用了多种 JAVA语句来实现多种功能。用 户可以通过本程序的applet运行界面来查找一整年某月的农历和阳历,可以查 找用户所想了解的某一天具体为星期几,并且可以看到一些重大节日的具体时 问。要求:满足设计万年历系统的目的,即当用户查询年份与月份时,系统就要 将这一年的某一月份的阴历与阳历全部显示出来,并且附带这一月份的重大节 日。当用户随意改动年份或月份时系统自动显示与星期对应的日期。用户点击日期时系统会显示具体星座信息。2概要设计2.1 程序设计思路(1) 总天数的算法:首先用if语句判断

4、定义年到输入年之间每一年是否为闰 年,是闰年,该年的总天数为 366,否则,为365。然后判断输入的年是否为定 义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总大 数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。(2)输出月份第一天为星期几的算法:使总天数除以 7取余加2得几既为星 期几,若是7,则为星期日。(3)算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后, 把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的

5、天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。(4) 如果年份小于1900年则程序不予判断。(5)公历与农历的换算。公历年对应的农历数据,每年三字节,格式第一字节 BIT7-4位 表示闰月月份,值为0为无闰月,算法:日期十年份+所过闰年数十月较 正数之和除7的余数就是星期但如果是在闰年又不到 3月份上述之和要减一天 再除7星期数为0。阴历月份计算:46911几个小月返回29天,2月经过判断是 否为闰年,选择返回28或29天,其余月份为大月,返回31天。(6) 系统时间的设置。直接从系统得到时间,设置字体,背景,显示框架等 等,绘图就好了。382.2总体程序框图开始份

6、或选择月获取当年系统 时间和年份程序初始化提交年月变更数据计算与绘制屏幕结束 *图1总体程序框图3设计过程或程序代码3.1各个模块的程序流程图及运行界面(1)公历转农历流程图与运行界面流程图运行界面星娟生卜跚二星期三星现四跚丑星照六01 前节02三月廿二03三月廿三04咻芾05三月廿五06 三月曲07 三月时08三月廿二09 三月附10四月初一11阴用二12四月初三13坦斜14四月帼15醺初六16 四月毗17四月初118四九19四月册20 四月21四月十二22瓯+三23四月十四24四月十五25瓯十六26四月+七27四月十八28四月十九29明廿十30四月廿一31四月廿二图3公农历运行图(2)时间

7、调整程序流程图流程图图4时间调整流程图运行界面图5万年历运行图3.2对关键代码加以分析说明(1)本次程序设计共用了 class MainCal extends JFrame implements,class CurrTimeLabel和class Lunar三个大类,用于绘制万年历,显示万年历的系统 时间和完成农历与公历的换算。这些类中又运用了许多函数,来完成月份的输出, 背景的设置,特定日期的标注等等。引用的类有:import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import ja

8、vax.swing.JPanel;import java.awt.*;import javax.swing.*;import java.awt.event.*;import javax.swing.border.*;import java.util.*;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.awt.Font;import java.awt.event.ActionEvent;impo

9、rt java.awt.event.ActionListener;import javax.swing.Timer;(2)农历的显示:要算出某年某月某日的农历日期,只能采用逐日递推的方式,这里以1900年1月31的日期为依据,它的农历日期为一九零零年大年初一, 调用日历类可以算出所求日期与1900年1月31日相差多少大,设这个差值为offset,则用offset与19002100的农历年天数逐个相减,当 offset=0时,可以 确定当前农历年份。再用相减后得到的offset与得到的年份的农历月天数逐个相 减,同理,当offset=0时可以确定农历月份。最后,Offset加上当前月份的大 数就

10、可以得到农历日期了,至此,阳历与农历的转换算法得以实现。在排列阳历 日期时,调用阳历与农历的转换算法得到相应农历日期,将对应阳历日期标签下的内容设为农历日期,主要源代码如下: public Lunar(Calendar cal) / cal.add(cal.get(Calendar.DAY_OF_MONTH),1);int monCyl;int leapMonth = 0;Date baseDate = null; try baseDate = chineseDateFormat.parse( 1900 1 月 31 日); catch (ParseException e) e.printSt

11、ackTrace(); / To change body of catch statement use/ Options | File Templates./求出和1900年1月31日相差的天数int offset = (int) (cal.getTime().getTime() - baseDate.getTime() / 86400000L);monCyl = 14;/用offset减去每农历年的天数/计算当天是农历第几天/ i最终结果是农历的年份/ offset是当年的第几天int iYear, daysOfYear = 0;for (iYear = 1900; iYear 0; iYe

12、ar+) daysOfYear = yearDays(iYear);offset -= daysOfYear;monCyl += 12;if (offset 0) offset += daysOfYear;iYear-;monCyl -= 12;/农历年份year = iYear;leapMonth = leapMonth(iYear);/ 闰哪个月,1-12leap = false;/用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月 的第几天int iMonth, daysOfMonth = 0;for (iMonth = 1; iMonth 0; iMonth+) /闰

13、月 if (leapMonth 0 & iMonth = (leapMonth + 1) & !leap) -iMonth;leap = true;daysOfMonth = leapDays(year); elsedaysOfMonth = monthDays(year, iMonth);offset -= daysOfMonth;/解除闰月if (leap & iMonth = (leapMonth + 1) leap = false;if (!leap) monCyl+;/ offset为0时,并且刚才计算的月份是闰月,要校正if (offset = 0 & leapMonth 0 &

14、iMonth = leapMonth + 1) if (leap) leap = false; else leap = true;-iMonth;-monCyl;/ offset小于0时,也要校正if (offset 0) offset += daysOfMonth;-iMonth;-monCyl;month = iMonth;day = offset + 1;(3)当前系统时间的显示:java.swing.Timer这个类可以方便地实现对时钟时间的操作,Timer类大多用于计划功能,这里用于刷新系统时间的显示,javax.swing.Timer.Timer(int delay , Actio

15、nListene门istener)delay 可以设置隔多长 时间执行任务,listener即用于监听的事件,每隔一定时间执行一次,这里 delay以毫秒为单位,设为1000,实际上就是一秒,这样闹钟就能每秒钟刷新一次, 保证时间显示正确。它的部分源代码如下:public class CurrTimeLabel extends JLabelprivate static final long serialVersionUID = 1L;/* * Define a second */private final static int ONE_SECOND=1000;/* * Timer Object

16、,use to refresh labels text */Timer timer=new Timer(ONE_SECOND,new ActionListener()public void actionPerformed(ActionEvent evt)setCurrTimeToText(););/* * Constructor * param strText */public CurrTimeLabel(String strText)super(strText);timer.start();/* Set current time to labels text* /private void s

17、etCurrTimeToText()this.setText(getCurrTime();this.setFont(new Font(宋体,Font.BOLD, 18);/* Get current time,format is yyyy/MM/dd HH:mm:ss* return current time String* /private String getCurrTime()Calendar cal= Calendar.getInstance();SimpleDateFormatfromatter=newSimpleDateFormat(yyyy/MM/dd HH:mm:ss);Str

18、ing strCurrTime=fromatter.format(cal.getTime();return strCurrTime;(4)节日的显示:节日的分布是固定的,较之节气来说,更容易操作和实现, 我假设每个月份三个节日,在排列中,只需取出每个月的三个节日的日期比较一 下,相等就把日历信息修改一下。部分源代码如下:if(i-initWeek+1)=sFtvDay)if(sFtvmonth-1k!=null)labelDaya1+1a2.setText(sFtvmonth-1k+);labelDaya1+1a2.setFont(new Font(黑体,Font.BOLD, 8);if(k=

19、2)sFtvDay=sFtvDatemonth-1k;4设计结果与分析4.1 程序调试的结果本程序经过设计并成功的调试了万年历系统的程序并且满足了万年历系统应该有的功能,例如:通过本程序的applet运行界面来查找一整年某月的农历和阳历,某一年某一月的日历,并且还是实现了重大节日的查询功能。这样一来能更快的查询我们所需要的信息,程序调试结果如下图所示。图6万年历调试结果4.2 程序设计分析在设计此程序时,即使会满足我们设计的要求但同时也存在小缺陷:(1)此万年历的功能不够强大,调试后只能显示一些重大的节日而不能所有 的节日都显示出来。(2)设计这个万年历系统还有一个很大的遗憾就是没能添加二十四

20、节气,这 是美中不足的地方。(3)万年历本应能查询一万年的日历,但在此程序中只是能查询一百多年的日历5小结在这次课程设计中,主要是运用 Java语言来编写,并可运用其他的技术。在我的系统中,还采用了 Swing控件、输入输出流等技术,而这些知识都是我们 没有学过的,这就要求我们去查阅相关书籍。正因为这样,才锻炼了我的自学能 力,为以后的学习打下了基础。此外,我还深刻感受到了面向对象语言中类库的 强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用 类的方法,为以后的面向对象语言的自学奠定了基础。万年历系统程序的设计成功会让快节奏的社会上的感到方便, 因为现在的社 会离不开时

21、间。他们只需要呆在家里就可以清楚的知道某一天的日期。 并且对人 们的工作也有所帮助,方便他们查询某年某月的资料以及制作报表。 因此,我认 为万年历在今后的发展空间很大,如果包装成简易软件会有很高的利用价值, 我 们可以随时随地查阅。致谢在这次JAVA高级语言课程设计中,我的老师和同学给了我及大的帮助。特 别是我的指导老师兼授课教师陈磊老师,在此,我对他们表示感谢。感谢他们在 我面对困难时给了我帮助和支持,也感谢那些给我帮助的所有同学。参考文献1牛晓太.Java程序设计教程M,北京:清华大学出版社,2013.2朱福喜,傅建明.JAVA项目设计与开发范例M,北京:电子工业出版社, 2005.3刘宝

22、林.JAVA1序设计与案例M.北京:高等教育出版社,2006.4刘亚峰,纪超.JavaSE6.编程指南M.北京:人民邮电出版社,2007.115 Walter Savitch. Java完美编程M.清华大学出版社.第三版6 Philip Heller. 零起点Java应用编程M.电子工业出版社7 Deitlel. Java 大学英语教程M.电子工业出版社8 Cay S.Horstmann. Java 核心技术M.电子工业出版社9汪晓平.精通Java网络编程M.清华大学出版社.200510孙一平,陈立.Java网络编程实例M.清华大学出版社.200411袁海燕,王文涛.Java实用程序设计M.人

23、民邮电出版社.200512郑阿奇.Java实用教程M.电子工业出版社.200613罗依.Java SwingM.清华大学出版社.200614王涛,刘继光.Java2 API大全M.电子工业出版社15 Joseph L.Weber. Using Java2m.电子工业出版社附录1:源程序(1) MainCal.javaimport java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Toolkit;import java.awt.Window;import javax.swin

24、g.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import java.awt.*;import javax.swing.*;import java.awt.event.*;import javax.swing.border.*;import java.util.*;public class MainCal extends JFrame implements ActionListener private static final long serialVersio

25、nUID = -1414990677727455448L;private JLabel datas口 = new 儿abel67; 显示一月的日期private JLabel label = null;private JPanel panel_Header, panel_Week, panel_Calendar;private Calendar calendar = null;private JComboBox year_box = null;private JComboBox month_box = null;private int today;public MainCal() try UI

26、Manager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(); catch (Exception e) e.printStackTrace();setTitle(万年历(邱丽丽JAVA课程设计2014-06-10);boundsWindowOnScreen(this,0.7,0.8);setVisible(true);calendar = Calendar.getInstance();today = calendar.get(Calendar.DAY_OF_MONTH);panel_Header = initializtion

27、_Header();panel_Week = initializtion_Week();panel_Calendar = initializtion_Calendar();setLayout(new BorderLayout();add(panel_Header,BorderLayout.NORTH);JPanel pan=new JPanel();add(pan,BorderLayout.CENTER);pan.setLayout(new BorderLayout();pan.add(panel_Week,BorderLayout.NORTH);pan.add(panel_Calendar,

28、BorderLayout.CENTER);initializtion_Data(calendar);private JPanel initializtion_Header() / 显示表头的 panelJPanel panel = new JPanel();panel.setPreferredSize(new Dimension(0, 43);year_box = new JComboBox();month_box = new JComboBox();JPanel panel_l = new JPanel();JPanel panel_r = new JPanel();儿abel label=

29、new JLabel(当前时间:);CurrTimeLabel ct =new CurrTimeLabel(current time);panel_r.add(label);panel_r.add(ct);panel.setBorder(new EtchedBorder(5, Color.red, Color.BLUE);儿abel year_l = new 儿abel(情您选择年份:, JLabel.RIGHT);儿abel month=new JLabel(月份:, JLabel.RIGHT);panel.setSize(525, 45);for (int i = 1900; i 2050

30、; i+)year_box.addItem(i);for (int j = 1; j = 12; j+)month_box.addItem(+j);year_box.setSelectedIndex(calendar.get(Calendar.YEAR) - 1900);month_box.setSelectedIndex(calendar.get(Calendar.MONTH);panel_l.add(year_l);panel_l.add(year_box);panel_l.add(month_l);panel_l.add(month_box);panel.add(panel_l,Bord

31、erLayout.WEST);panel.add(panel_r,BorderLayout.EAST);year_box.addActionListener(this);month_box.addActionListener(this);return panel;private JPanel initializtion_Week() / 显示星期的 panelJPanel panel = new JPanel();panel.setPreferredSize(new Dimension(0, 33);panel.setLayout(new GridLayout(1,7);String colu

32、mnNames口 = 星期日,星期一,星期二,星期三,星期四,星期五,星期六;JLabel label = null;for (int i = 0; i 7; i+) label = new JLabel(columnNamesi,儿abel.CENTER);if (i = 0 | i = 6)label.setForeground(Color.RED);label.setBorder(new LineBorder(new Color(70, 130, 180);panel.add(label);return panel;private JPanel initializtion_Calenda

33、r() / 显示日期的 panelJPanel panel = new JPanel();panel.setLayout(new GridLayout(6, 7);for (int i = 0; i 6; i+) for (int j = 0; j 7; j+) label = new JLabel(, JLabel.CENTER);datas皿=label;label.setBorder(new LineBorder(new Color(70, 130, 180);if (j = 0 | j = 6)label.setForeground(Color.RED);datasij.addMous

34、eListener(new List_MouseListener(); panel.add(label);return panel;public void clear_Data() / 清空内容的for (int i = 0; i 6; i+)for (int j = 0; j 7; j+) datasij.setText();if (j = 0 | j = 6) datasij.setForeground(Color.RED);else datasij.setForeground(null); public void initializtion_Data(Calendar calendar)

35、 / 初始化函数/*节日和纪念日 格式:起始年(yyyy)十月(mm)十日(dd)* 0000表示起始年不明7HashMapString, StringsFestival = new HashMap();/ String 口sFestival_=sFestival.put(0101, 元旦)sFestival.put(0214,情人节);sFestival.put(0308,妇女节);sFestival.put(0312,植树节);sFestival.put(0401,愚人节);sFestival.put(0501,劳动节);sFestival.put(0504,青年节);sFestival.

36、put(0601,儿童节);sFestival.put(0701,建党节);sFestival.put(0801,建军节);sFestival.put(0910,教师节);sFestival.put(1001,国庆节);sFestival.put(1031,万圣节);sFestival.put(1112,”孙中山诞辰);sFestival.put(1225,圣诞节);sFestival.put(1226,毛泽东诞辰);/ ;/某月第几个星期几/起始年(4位)十月(2位)+第几个(1位)+星期几(1位)HashMapString, StringwFestival = new HashMap();

37、/ String 口wFestival=wFestival.put(0520,母亲节);wFestival.put(0620,父亲节);wFestival.put(1144,感恩节);/ ;/农历99表示月最后一天HashMapvString, StringFestival = new HashMapvString, String();/ String lFestival=lFestival.put(0101,春 节)lFestival.put(0102,大年初二);lFestival.put(0103,大年初三);lFestival.put(0115,元宵节);lFestival.put(0

38、505,端午节);lFestival.put(0707,七夕)lFestival.put(0815,中秋节);lFestival.put(0909,重阳节);lFestival.put(1208,腊八节);lFestival.put(1299,除 夕)/ ;/ /this.calendar = calendar;today = calendar.get(Calendar.DAY_OF_MONTH);int month = calendar.get(Calendar.MONTH);int weekindexDay;int weekindexMonth;calendar.set(Calendar.

39、DATE, 1);while (calendar.get(Calendar.MONTH) = month) weekindexMonth = calendar.get(Calendar.WEEK_OF_MONTH) - 1;weekindexDay = calendar.get(Calendar.DAY_OF_WEEK) - 1;int day = calendar.get(Calendar.DAY_OF_MONTH);/ /String today_, month_;today_ = day 10 ? 0 + day : + day;month_ = month 10 ? 0 + (mont

40、h + 1) : + (month + 1);Lunar lunar = new Lunar(calendar);String lunar_ = lunar.toString();/ /if (null != sFestival.get(month_ + today_)lunar_ = + sFestival.get(month_ + today_);/ /String wFestival_ = month_ + (weekindexMonth) + (weekindexDay);if (null != wFestival.get(wFestival_) lunar_ = + wFestiva

41、l.get(wFestival_);/System.out.println(wFestival_);if (null != lFestival.get(lunar.numeric_md()lunar_ = + lFestival.get(lunar.numeric_md();/计算除夕Calendar temp_calendar = Calendar.getInstance();temp_calendar.set(calendar.get(Calendar.YEAR), month, day + 1); temp_calendar.add(Calendar.DAY_OF_MONTH,1);Lunar temp_lunar = new Lunar(temp_calendar);String temp_str = temp_lunar.numeric_md();if (temp_str.equals(0101)lunar_ = + lFestival.get(1299);/计算除夕结束/String day_str;if (day 10)day_str = + today_;elseday_str =

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1