JAVA《万年历系统》课程设计报告附源码要点.docx
- 文档编号:23207853
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:39
- 大小:336.94KB
JAVA《万年历系统》课程设计报告附源码要点.docx
《JAVA《万年历系统》课程设计报告附源码要点.docx》由会员分享,可在线阅读,更多相关《JAVA《万年历系统》课程设计报告附源码要点.docx(39页珍藏版)》请在冰豆网上搜索。
JAVA《万年历系统》课程设计报告附源码要点
学号
2013-2014学年第二学期
《面向对象程序设计》
课程设计报告
题目:
万年历系统
专业:
计算机科学与技术
班级:
姓名:
学号:
指导教师:
成绩:
计算机与信息工程系
2014年6月6日
1设计内容及要求
1.1设计内容
万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用。
在我设计的万年历中主要有:
(1)使用图形用户界面来查询用用户所需的日期信息,符合日常软件使用规范。
(2)按月份查询,实现了显示查询1901~2100年某月所有日期的阴阳历对照。
(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。
阴历月份计算:
4\6\9\11几个小月返回29天,2月经过判断是否为闰年,选择返回28或29天,其余月份为大月,返回31天。
(6)系统时间的设置。
直接从系统得到时间,设置字体,背景,显示框架等等,绘图就好了。
2.2总体程序框图
图1总体程序框图
3设计过程或程序代码
3.1各个模块的程序流程图及运行界面
(1)公历转农历流程图与运行界面
①流程图
图2公历转农历流程图
②运行界面
图3公农历运行图
(2)时间调整程序流程图
①流程图
图4时间调整流程图
②运行界面
图5万年历运行图
3.2对关键代码加以分析说明
(1)本次程序设计共用了classMainCalextendsJFrameimplements,classCurrTimeLabel和classLunar三个大类,用于绘制万年历,显示万年历的系统时间和完成农历与公历的换算。
这些类中又运用了许多函数,来完成月份的输出,背景的设置,特定日期的标注等等。
引用的类有:
importjavax.swing.JComboBox;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
importjavax.swing.border.*;
importjava.util.*;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
importjava.awt.Font;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.Timer;
(2)农历的显示:
要算出某年某月某日的农历日期,只能采用逐日递推的方式,这里以1900年1月31的日期为依据,它的农历日期为一九零零年大年初一,调用日历类可以算出所求日期与1900年1月31日相差多少天,设这个差值为offset,则用offset与1900~2100的农历年天数逐个相减,当offset<=0时,可以确定当前农历年份。
再用相减后得到的offset与得到的年份的农历月天数逐个相减,同理,当offset<=0时可以确定农历月份。
最后,Offset加上当前月份的天数就可以得到农历日期了,至此,阳历与农历的转换算法得以实现。
在排列阳历日期时,调用阳历与农历的转换算法得到相应农历日期,将对应阳历日期标签下的内容设为农历日期,主要源代码如下:
publicLunar(Calendarcal){
//cal.add(cal.get(Calendar.DAY_OF_MONTH),1);
intmonCyl;
intleapMonth=0;
DatebaseDate=null;
try{
baseDate=chineseDateFormat.parse("1900年1月31日");
}catch(ParseExceptione){
e.printStackTrace();//Tochangebodyofcatchstatementuse
//Options|FileTemplates.
}
//求出和1900年1月31日相差的天数
intoffset=(int)((cal.getTime().getTime()-baseDate.getTime())/86400000L);
monCyl=14;
//用offset减去每农历年的天数
//计算当天是农历第几天
//i最终结果是农历的年份
//offset是当年的第几天
intiYear,daysOfYear=0;
for(iYear=1900;iYear<2050&&offset>0;iYear++){
daysOfYear=yearDays(iYear);
offset-=daysOfYear;
monCyl+=12;
}
if(offset<0){
offset+=daysOfYear;
iYear--;
monCyl-=12;
}
//农历年份
year=iYear;
leapMonth=leapMonth(iYear);//闰哪个月,1-12
leap=false;
//用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
intiMonth,daysOfMonth=0;
for(iMonth=1;iMonth<13&&offset>0;iMonth++){
//闰月
if(leapMonth>0&&iMonth==(leapMonth+1)&&!
leap){
--iMonth;
leap=true;
daysOfMonth=leapDays(year);
}else
daysOfMonth=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(intdelay,ActionListenerlistener)delay可以设置隔多长时间执行任务,listener即用于监听的事件,每隔一定时间执行一次,这里delay以毫秒为单位,设为1000,实际上就是一秒,这样闹钟就能每秒钟刷新一次,保证时间显示正确。
它的部分源代码如下:
publicclassCurrTimeLabelextendsJLabel{
privatestaticfinallongserialVersionUID=1L;
/**
*Defineasecond
*/
privatefinalstaticintONE_SECOND=1000;
/**
*TimerObject,usetorefreshlabel'stext
*/
Timertimer=newTimer(ONE_SECOND,newActionListener(){
publicvoidactionPerformed(ActionEventevt){
setCurrTimeToText();
}
});
/**
*Constructor
*@paramstrText
*/
publicCurrTimeLabel(StringstrText){
super(strText);
timer.start();
}
/**
*Setcurrenttimetolabel'stext
*
*/
privatevoidsetCurrTimeToText(){
this.setText(getCurrTime());
this.setFont(newFont("宋体",Font.BOLD,18));
}
/**
*Getcurrenttime,formatisyyyy/MM/ddHH:
mm:
ss
*@returncurrenttimeString
*/
privateStringgetCurrTime(){
Calendarcal=Calendar.getInstance();
SimpleDateFormatfromatter=newSimpleDateFormat("yyyy/MM/ddHH:
mm:
ss");
StringstrCurrTime=fromatter.format(cal.getTime());
returnstrCurrTime;
}
}
(4)节日的显示:
节日的分布是固定的,较之节气来说,更容易操作和实现,我假设每个月份三个节日,在排列中,只需取出每个月的三个节日的日期比较一下,相等就把日历信息修改一下。
部分源代码如下:
if((i-initWeek+1)==sFtvDay){
if(sFtv[month-1][k]!
=null){
labelDay[a1+1][a2].setText(sFtv[month-1][k++]);
labelDay[a1+1][a2].setFont(newFont("黑体",Font.BOLD,8));
}
if(k<=2)sFtvDay=sFtvDate[month-1][k];
}
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.11
[5]WalterSavitch.Java完美编程[M].清华大学出版社.第三版
[6]PhilipHeller.零起点Java应用编程[M].电子工业出版社
[7]Deitlel.Java大学英语教程[M].电子工业出版社
[8]CayS.Horstmann.Java核心技术[M].电子工业出版社
[9]汪晓平.精通Java网络编程[M].清华大学出版社.2005
[10]孙一平,陈立.Java网络编程实例[M].清华大学出版社.2004
[11]袁海燕,王文涛.Java实用程序设计[M].人民邮电出版社.2005
[12]郑阿奇.Java实用教程[M].电子工业出版社.2006
[13]罗依.JavaSwing[M].清华大学出版社.2006
[14]王涛,刘继光.Java2API大全[M].电子工业出版社
[15]JosephL.Weber.UsingJava2[m].电子工业出版社
附录1:
源程序
(1)MainCal.java
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.Toolkit;
importjava.awt.Window;
importjavax.swing.JComboBox;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
importjavax.swing.border.*;
importjava.util.*;
publicclassMainCalextendsJFrameimplementsActionListener{
privatestaticfinallongserialVersionUID=-1414990677727455448L;
privateJLabeldatas[][]=newJLabel[6][7];//显示一月的日期
privateJLabellabel=null;
privateJPanelpanel_Header,panel_Week,panel_Calendar;
privateCalendarcalendar=null;
privateJComboBoxyear_box=null;
privateJComboBoxmonth_box=null;
privateinttoday;
publicMainCal(){
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(Exceptione){
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(newBorderLayout());
add(panel_Header,BorderLayout.NORTH);
JPanelpan=newJPanel();
add(pan,BorderLayout.CENTER);
pan.setLayout(newBorderLayout());
pan.add(panel_Week,BorderLayout.NORTH);
pan.add(panel_Calendar,BorderLayout.CENTER);
initializtion_Data(calendar);
}
privateJPanelinitializtion_Header(){//显示表头的panel
JPanelpanel=newJPanel();
panel.setPreferredSize(newDimension(0,43));
year_box=newJComboBox();
month_box=newJComboBox();
JPanelpanel_l=newJPanel();
JPanelpanel_r=newJPanel();
JLabellabel=newJLabel("当前时间:
");
CurrTimeLabelct=newCurrTimeLabel("currenttime");
panel_r.add(label);
panel_r.add(ct);
//panel.setBorder(newEtchedBorder(5,Color.red,Color.BLUE));
JLabelyear_l=newJLabel("请您选择年份:
",JLabel.RIGHT);
JLabelmonth_l=newJLabel("月份:
",JLabel.RIGHT);
panel.setSize(525,45);
for(inti=1900;i<2050;i++)
year_box.addItem(i);
for(intj=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(pa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历系统 JAVA 万年历 系统 课程设计 报告 源码 要点