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

上传人:jian****018 文档编号:8595843 上传时间:2020-03-30 格式:DOC 页数:40 大小:501KB
返回 下载 相关 举报
JAVA《万年历系统》课程设计报告附源码.doc_第1页
第1页 / 共40页
JAVA《万年历系统》课程设计报告附源码.doc_第2页
第2页 / 共40页
JAVA《万年历系统》课程设计报告附源码.doc_第3页
第3页 / 共40页
点击查看更多>>
资源描述
学号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源程序171 设计内容及要求1.1设计内容万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用。在我设计的万年历中主要有:(1)使用图形用户界面来查询用用户所需的日期信息,符合日常软件使用规范。 (2)按月份查询,实现了显示查询19012100年某月所有日期的阴阳历对照。 (3)并且添加了重大节日与星座等信息,界面采用日常的星期与月份结合的格式,方便查看与使用。 (4)编写万年历的课程设计,是为了使同学们更加了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。1.2设计任务及具体要求利用JAVA语言编写的万年历系统采用了多种JAVA语句来实现多种功能。用户可以通过本程序的applet运行界面来查找一整年某月的农历和阳历,可以查找用户所想了解的某一天具体为星期几,并且可以看到一些重大节日的具体时间。 要求:满足设计万年历系统的目的,即当用户查询年份与月份时,系统就要将这一年的某一月份的阴历与阳历全部显示出来,并且附带这一月份的重大节日。当用户随意改动年份或月份时系统自动显示与星期对应的日期。用户点击日期时系统会显示具体星座信息。 2 概要设计2.1程序设计思路 (1)总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。 (2)输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。 (3)算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。 (4)如果年份小于1900年则程序不予判断。(5)公历与农历的换算。公历年对应的农历数据,每年三字节,格式第一字节BIT7-4 位 表示闰月月份,值为0 为无闰月,算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在闰年又不到3 月份上述之和要减一天再除7星期数为0。阴历月份计算:46911几个小月返回29天, 2月经过判断是否为闰年,选择返回28或29天,其余月份为大月,返回31天。 (6)系统时间的设置。直接从系统得到时间,设置字体,背景,显示框架等等,绘图就好了。2.2 总体程序框图开始程序初始化获取当年系统时间和年份计算与绘制屏幕是否输入年份或选择月份 提交年月变更数据据结束 图1 总体程序框图 3 设计过程或程序代码3.1各个模块的程序流程图及运行界面(1) 公历转农历流程图与运行界面 流程图 图2 公历转农历流程图 运行界面 图3 公农历运行图(2) 时间调整程序流程图 流程图 图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 javax.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; import java.awt.event.ActionListener; import javax.swing.Timer; (2)农历的显示:要算出某年某月某日的农历日期,只能采用逐日递推的方式,这里以1900年1月31的日期为依据,它的农历日期为一九零零年大年初一,调用日历类可以算出所求日期与1900年1月31日相差多少天,设这个差值为offset,则用offset与19002100的农历年天数逐个相减,当offset=0时,可以确定当前农历年份。再用相减后得到的offset与得到的年份的农历月天数逐个相减,同理,当offset=0时可以确定农历月份。最后,Offset加上当前月份的天数就可以得到农历日期了,至此,阳历与农历的转换算法得以实现。在排列阳历日期时,调用阳历与农历的转换算法得到相应农历日期,将对应阳历日期标签下的内容设为农历日期,主要源代码如下: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.printStackTrace(); / 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; iYear+) 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+) / 闰月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 & 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, ActionListener listener)delay可以设置隔多长时间执行任务,listener即用于监听的事件,每隔一定时间执行一次,这里delay以毫秒为单位,设为1000,实际上就是一秒,这样闹钟就能每秒钟刷新一次,保证时间显示正确。它的部分源代码如下:public class CurrTimeLabel extends JLabel private static final long serialVersionUID = 1L; /* * Define a second */ private final static int ONE_SECOND=1000; /* * Timer Object,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 setCurrTimeToText() 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(); SimpleDateFormat fromatter=new SimpleDateFormat(yyyy/MM/dd HH:mm:ss); String 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=2)sFtvDay=sFtvDatemonth-1k;4 设计结果与分析4.1程序调试的结果本程序经过设计并成功的调试了万年历系统的程序并且满足了万年历系统应该有的功能,例如:通过本程序的applet运行界面来查找一整年某月的农历和阳历,某一年某一月的日历,并且还是实现了重大节日的查询功能。这样一来能更快的查询我们所需要的信息,程序调试结果如下图所示。图6 万年历调试结果4.2程序设计分析在设计此程序时,即使会满足我们设计的要求但同时也存在小缺陷:(1) 此万年历的功能不够强大,调试后只能显示一些重大的节日而不能所有的节日都显示出来。(2) 设计这个万年历系统还有一个很大的遗憾就是没能添加二十四节气,这是美中不足的地方。(3) 万年历本应能查询一万年的日历,但在此程序中只是能查询一百多年的日历。5 小 结在这次课程设计中,主要是运用Java语言来编写,并可运用其他的技术。在我的系统中,还采用了Swing控件、输入输出流等技术,而这些知识都是我们没有学过的,这就要求我们去查阅相关书籍。正因为这样,才锻炼了我的自学能力,为以后的学习打下了基础。此外,我还深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。万年历系统程序的设计成功会让快节奏的社会上的感到方便,因为现在的社会离不开时间。他们只需要呆在家里就可以清楚的知道某一天的日期。并且对人们的工作也有所帮助,方便他们查询某年某月的资料以及制作报表。因此,我认为万年历在今后的发展空间很大,如果包装成简易软件会有很高的利用价值,我们可以随时随地查阅。致谢在这次JAVA高级语言课程设计中,我的老师和同学给了我及大的帮助。特别是我的指导老师兼授课教师陈磊老师,在此,我对他们表示感谢。感谢他们在我面对困难时给了我帮助和支持,也感谢那些给我帮助的所有同学。参考文献1 牛晓太.Java程序设计教程M,北京:清华大学出版社,2013.2 朱福喜,傅建明JAVA项目设计与开发范例M,北京:电子工业出版社,2005.3 刘宝林JAVA程序设计与案例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. 人民邮电出版社. 2005 12 郑阿奇. 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.swing.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 serialVersionUID = -1414990677727455448L;private JLabel datas = new JLabel67;/ 显示一月的日期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 UIManager.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_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,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();JLabel label=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);JLabel year_l = new JLabel(请您选择年份: , JLabel.RIGHT);JLabel month_l = new JLabel(月份: , JLabel.RIGHT);panel.setSize(525, 45);for (int i = 1900; i 2050; 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,BorderLayout.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 columnNames = 星期日, 星期一, 星期二, 星期三, 星期四, 星期五,星期六 ;JLabel label = null;for (int i = 0; i 7; i+) label = new JLabel(columnNamesi, JLabel.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_Calendar() / 显示日期的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);datasij = label;label.setBorder(new LineBorder(new Color(70, 130, 180);if (j = 0 | j = 6)label.setForeground(Color.RED);datasij.addMouseListener(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);elsedatasij.setForeground(null);public void initializtion_Data(Calendar calendar) / 初始化函数/ / /* * 节日和纪念日 格式:起始年(yyyy)+月(mm)+日(dd) * * * * 0000表示起始年不明 */HashMap sFestival = 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.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位)HashMap wFestival = new HashMap();/ String wFestival=wFestival.put(0520, 母亲节);wFestival.put(0620, 父亲节);wFestival.put(1144, 感恩节);/ ;/ 农历 99表示月最后一天HashMap lFestival = new HashMap();/ String lFestival=lFestival.put(0101, 春 节);lFestival.put(0102, 大年初二);lFestival.put(0103, 大年初三);lFestival.put(0115, 元宵节);lFestival.put(0505, 端午节);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.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 + (month + 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_ = + wFestival.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 = + today_; day_str += + lunar_;if (day = today)datasweekindexMonthweekindexDay.setForeground(Color.GREEN);datasweekindexMonthweekindexDay.setText(day_str);calendar.add(Calendar.DATE, 1);/ /public void actionPerformed(ActionEvent e) / 日期和年份的选择更新int year = Integer.parseInt(year_box.getSelectedItem().toString();int month = Integer.parseInt(month_box.getSelectedItem().toString() - 1; calendar.set(year, month, today); clear_Data(); Initializtion_Data(calendar);class List_MouseListener implements MouseListener / 鼠标移入时显示的信息JLabel labe = null;String weeks = 星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六 ;public String constellation(Calendar cal) String con = 水瓶座, 0122, 0221 , 双鱼座, 0222, 0321 , 白羊座, 0322, 0420 , 金牛座, 0421, 0521 , 双子座, 0522, 0621 , 巨蟹座, 0621, 0721 , 狮子座, 0722, 0821 , 处女座, 0822, 0921 , 天秤座, 0922, 1021 , 天蝎座, 1022, 1121 , 射手座, 1122, 1221 , 摩羯座, 1222, 0121 ;int month = cal.get(Calendar.MONTH) + 1;int today = cal.get(Calendar.DAY_OF_MONTH);String month_str = month 10 ? 0 + month : + month;String today_str = today 10 ? 0 + today : + today;String str = month_str + today_str;for (int i = 0; i = Integer.parseInt(coni1)& Integer.parseInt(str) = Integer.parseInt(con111) & Integer.parseInt(str) 1232)| Integer.parseInt(str) ) + 7, lab .indexOf(); / String lun=lab.substring(lab.indexOf()+4);String message = 公元 + year_box.getSelectedItem() + 年+ month_box.getSelectedItem() + 月+ Integer.parseInt(day) + 日;calendar.set(Integer.parseInt(year_box.getSelectedItem().toString(), Integer.parseInt(month_box.getSelectedItem().toString() - 1, Integer.parseInt(day);Lunar lunar = new Lunar(calendar);message += + weeks(calendar.get(Calendar.DAY_OF_WEEK) - 1);message +=      + constellation(calendar) + 农历 ;message += lunar.get_month() + 月 + lunar.get_Big_Or_Small() +      + lunar.get_date() + 日;/ message+=lunar.get_JQ();labe.setToolTipText(message);labe.setBackground(new Color(112, 128, 144);labe.setOpaque(true);/ System.out.println(day+:+lun);public void mouseExited(MouseEvent e) / 鼠标离开组件时调用。labe.setBackground(null);labe.setOpaque(true);public void mousePressed(MouseEvent e) / 鼠标按键在组件上按下时调用。public void mouseReleased(MouseEvent e) / 鼠标按钮在组件上释放时调用。static public void boundsWindowOnScreen(Window window, double ratioX,double ratioY) Toolkit tk = window.getToolkit();Dimension scrn = tk.getScreenSize();int left=(int)(scrn.width/2-scrn.width*ratioX/2);int up=(int)(scrn.height-scrn.height*ratioY)/3);window.setBounds(left,up, (int) (scrn.width * ratioX),(int) (scrn.height * ratioY);/* * param args */public static void main(String args) / TODO Auto-generated method stubnew MainCal();/SwingConsole.run(mc, 0.7, 0.8);/boundsWindowOnScreen(new MainCal(),0.7,0.8);(2) Lunar.javaimport java.te
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!