《Java语言程序设计》万年历.docx
- 文档编号:4347562
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:13
- 大小:91.11KB
《Java语言程序设计》万年历.docx
《《Java语言程序设计》万年历.docx》由会员分享,可在线阅读,更多相关《《Java语言程序设计》万年历.docx(13页珍藏版)》请在冰豆网上搜索。
《Java语言程序设计》万年历
黑龙江科技学院
计算机与信息工程学院
《Java语言程序设计》
课程设计报告
姓名:
班级:
指导教师:
年月日
课程设计综合成绩评定
设计题目2:
万年历
考核项目
分值
A
C
得分
设计情况(共70分)
设计工作量与难度
20
设计工作量大与设计有一定难度
设计工作量与难度一般,基本达到了要求
设计
方案
15
设计方案正确、合理
设计方案较正确、基本合理,但不是最优
设计完成情况
35
完成了选题的设计内容,设计功能完整,相关算法设计正确,程序结果正确、直观性好
基本完成了选题的设计内容及主要选题功能,相关算法设计基本正确,程序结果正确
设计报告(共15分)
报告组织结构及内容
10
内容组织及结构合理、内容充实、层次清晰、图表得当
内容组织及结构较合理、内容较充实、层次较清晰、图表应用基本得当
报告排版格式
5
格式规范,完全符合要求
格式基本规范,基本符合要求
设计态度
(共15分)
15
设计态度认真、积极
设计态度比较认真
综合得分
课程设计综合成绩(折合为优、良、中、及格与不及格计)
其它说明:
二.万年历
目录
一、设计内容2
二、设计过程2
2.1需求分析2
2.2概要设计2
2.3详细设计3
2.4代码实现5
2.5程序运行与发布10
三、总结12
四、参考文献12
一、设计内容
万年历是一个强大的日历系统,通过它可以实现对过去,现在以及将来日期的查找,通过在年份对话框中输入要查询的年份,再相应的在月份对应的下拉菜单选择要查询的月份,则可得到相应的日历。
本实验是对图形用户界面,布局管理器的综合运用,理解JAVA的时间处理机制,编写独立运行的窗口。
二、设计过程
2.1需求分析
本程序的要求为:
1.使用图形用户界面;2.本程序能够实现日期与星期的查询。
3.随着科学技术的不断发展,计算机已经成为我们工作学习和生活中不可缺少的工具。
文本编辑器是个人计算机最司空见惯的应用程序了,在学习了Java语言之后,我决定使用Java语言编写一个简单的万年历,可以实现查询日期和显示时间的功能,满足日常基本的工作学习和娱乐需要。
2.2概要设计
1.总天数的算法:
首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
2.输出月份第一天为星期几的算法:
使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
3.算出输出月份第一天为星期几的算法:
算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
4.如果年份小于1582年则程序不予判断。
2.3详细设计
1.流程图
2.初始化组件:
importjava.applet.Applet;
importjava.awt.*;
importjava.util.*;
3.初始化数据:
publicclassCalendarAppletextendsApplet{
staticfinalintTOP=70;//顶端距离
staticfinalintCELLWIDTH=50,CELLHEIGHT=30;//单元格尺寸
staticfinalintMARGIN=3;//边界距离
staticfinalintFEBRUARY=1;
TextFieldtfYear=newTextField("2004",5);//显示年份的文本域
ChoicemonthChoice=newChoice();//月份选择下拉框
ButtonbtUpdate=newButton("更新");//更新按钮
GregorianCalendarcalendar=newGregorianCalendar();//日历对象
FontsmallFont=newFont("TimesRoman",Font.PLAIN,15);//显示小字体
FontbigFont=newFont("TimesRoman",Font.BOLD,50);//显示大字体
Stringdays[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
Stringmonths[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
intdaysInMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};//每个月的天数
intsearchMonth,searchYear;//查询的年份及月份
4.绘制程序界面:
publicvoidinit(){
setBackground(Color.white);//设置背景颜色
searchMonth=calendar.get(Calendar.MONTH);//得到系统年份
searchYear=calendar.get(Calendar.YEAR);//得到系统月份
add(newLabel("年:
"));//增加组件到Applet
tfYear.setText(String.valueOf(searchYear));//设置文本域文字
add(tfYear);
add(newLabel("月:
"));
monthChoice.setFont(smallFont);//设置月份选择下拉框的显示字体
for(inti=0;i<12;i++){
monthChoice.addItem(months[i]);//增加下拉框选项
}
monthChoice.select(searchMonth);//设置下拉框当前选择项
add(monthChoice);
add(btUpdate);
intcomponentCount=this.getComponentCount();//得到Applet中的组件数量
for(inti=0;i getComponent(i).setFont(smallFont);//设置所有组件的显示字体 } } 2.4代码实现 importjava.applet.Applet; importjava.awt.*; importjava.util.*; publicclassCalendarAppletextendsApplet{ staticfinalintTOP=70;//顶端距离 staticfinalintCELLWIDTH=50,CELLHEIGHT=30;//单元格尺寸 staticfinalintMARGIN=5;//边界距离 staticfinalintFEBRUARY=1; TextFieldtfYear=newTextField("2004",5);//显示年份的文本域 ChoicemonthChoice=newChoice();//月份选择下拉框 ButtonbtUpdate=newButton("查看");//更新按钮 GregorianCalendarcalendar=newGregorianCalendar();//日历对象 FontsmallFont=newFont("TimesRoman",Font.PLAIN,15);//显示小字体 FontbigFont=newFont("TimesRoman",Font.BOLD,50);//显示大字体 Stringdays[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; Stringmonths[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"}; intdaysInMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};//每个月的天数 intsearchMonth,searchYear;//查询的年份及月份 publicvoidinit(){ setBackground(Color.yellow);//设置背景颜色 searchMonth=calendar.get(Calendar.MONTH);//得到系统年份 searchYear=calendar.get(Calendar.YEAR);//得到系统月份 add(newLabel("年: "));//增加组件到Applet tfYear.setText(String.valueOf(searchYear));//设置文本域文字 add(tfYear); add(newLabel("月: ")); monthChoice.setFont(smallFont);//设置月份选择下拉框的显示字体 for(inti=0;i<12;i++){ monthChoice.addItem(months[i]);//增加下拉框选项 } monthChoice.select(searchMonth);//设置下拉框当前选择项 add(monthChoice); add(btUpdate); intcomponentCount=this.getComponentCount();//得到Applet中的组件数量 for(inti=0;i getComponent(i).setFont(smallFont);//设置所有组件的显示字体 } } publicvoidpaint(Graphicsg){ FontMetricsfontMetric;//显示字体的FontMetrics对象 intfontAscent; intdayPos; inttotalWidth,totalHeight;//总的宽度,高度 intnumRows;//行数 intxNum,yNum;//水平和垂直方向单元格数量 intnumDays; StringdayStr;//显示天数字符串 intmargin; g.setColor(Color.lightGray);//设置当前颜色 g.setFont(bigFont);//设置当前使用字体 g.drawString(searchYear+"年",60,TOP+70);//绘制字符串 g.drawString((searchMonth+1)+"月",200,TOP+130); g.setColor(Color.black); g.setFont(smallFont); fontMetric=g.getFontMetrics();//获取变量初值 fontAscent=fontMetric.getAscent(); dayPos=TOP+fontAscent/2; totalWidth=7*CELLWIDTH;//得到总的表格宽度 for(inti=0;i<7;i++){ g.drawString(days[i],(CELLWIDTH-fontMetric.stringWidth(days[i]))/2+i*CELLWIDTH,dayPos-20);//绘制表格标题栏 } numRows=getNumberRows(searchYear,searchMonth);//计算需要的行的数量 totalHeight=numRows*CELLHEIGHT;//得到总的表格高度 for(inti=0;i<=totalWidth;i+=CELLWIDTH){ g.drawLine(i,TOP,i,TOP+totalHeight);//绘制表格线 } for(inti=0,j=TOP;i<=numRows;i++,j+=CELLHEIGHT){ g.drawLine(0,j,totalWidth,j);//绘制表格线 } xNum=(getFirstDayOfMonth(searchYear,searchMonth)+1)*CELLWIDTH-MARGIN; yNum=TOP+MARGIN+fontAscent; numDays=daysInMonth[searchMonth]+((calendar.isLeapYear(searchYear)&&(searchMonth==FEBRUARY))? 1: 0); for(intday=1;day<=numDays;day++){ dayStr=Integer.toString(day); g.drawString(dayStr,xNum-fontMetric.stringWidth(dayStr),yNum);//绘制字符串 xNum+=CELLWIDTH; if(xNum>totalWidth){ xNum=CELLWIDTH-MARGIN; yNum+=CELLHEIGHT; } } } publicbooleanaction(Evente,Objecto){ intsearchYearInt; if(e.target==btUpdate){ searchMonth=monthChoice.getSelectedIndex();//得到查询月份 searchYearInt=Integer.parseInt(tfYear.getText(),10);//得到查询年份 if(searchYearInt>1581){ searchYear=searchYearInt; } repaint();//重绘屏幕 returntrue; } returnfalse; } privateintgetNumberRows(intyear,intmonth){//得到行数量 intfirstDay; intnumCells; if(year<1582){//年份小于1582年,则返回-1 return(-1); } if((month<0)||(month>11)){ return(-1); } firstDay=getFirstDayOfMonth(year,month);//计算月份的第一天 if((month==FEBRUARY)&&(firstDay==0)&&! calendar.isLeapYear(year)){ return4; } numCells=firstDay+daysInMonth[month]; if((month==FEBRUARY)&&(calendar.isLeapYear(year))){ numCells++; } return((numCells<=35)? 5: 6);//返回行数 } privateintgetFirstDayOfMonth(intyear,intmonth){//得到每月的第一天 intfirstDay; inti; if(year<1582){//年份小于1582年,返回-1 return(-1); } if((month<0)||(month>11)){//月份数错误,返回-1 return(-1); } firstDay=getFirstDayOfYear(year);//得到每年的第一天 for(i=0;i firstDay+=daysInMonth[i];//计算每月的第一天 } if((month>FEBRUARY)&&calendar.isLeapYear(year)){ firstDay++; } return(firstDay%7); } privateintgetFirstDayOfYear(intyear){//计算每年的第一天 intleapYears; inthundreds; intfourHundreds; intfirst; if(year<1582){//如果年份小于1582年 return(-1);//返回-1 } leapYears=(year-1581)/4; hundreds=(year-1501)/100; leapYears-=hundreds; fourHundreds=(year-1201)/400; leapYears+=fourHundreds; first=5+(year-1582)+leapYears%7;//得到每年第一天 returnfirst; } } 2.5程序运行与发布 在年份输入框内输入2012后点击查看后的情况: 月份下拉列表框: 选择月份后的情况: 点击查看按钮后显示的结果: 三、总结 (1)选题目的: 本次课程设计为课本后设计题目任选一题进行设计。 思考一段时间后,我决定做一个万年历的设计。 主要考虑到本学期时间少课程内容多,JAVA课程基础内容掌握并不是很抓实,而对于设计一个万年历程序,由于其功能简单设计也相对较易,对于我个人的学习情况比较合适,并且通过设计这样的一个日历小组件,也能使自己对JAVA的一些基础知识掌握的更加牢固。 (2)对于本程序的设计,首先考虑其功能有哪些,需要显示什么,如何进行窗体构建布局,需要用哪些知识点,如相关的类和对象等。 最后,就是根据初步设计的功能和布局构架,考虑用源代码进行实现了。 经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于完成了整个课程设计。 在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。 自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。 通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。 还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。 还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。 所以网络这个强大的工具,确实是我们学习之中可以借助的一个很好的帮手。 网络是我们学习的最好的老师之一。 有问题,问网络,是一个很好的习惯。 四、参考文献 [1].曾令明索望宋波,《Java程序设计教程》,西安电子科技大学出版社,2007.8 [2].孙全党王吴迪赵枫朝,《Java程序设计应用教程》,电子工业出版社,2006.2 [3].赵玉阳,《Java从入门到精通》,清华大学出版社,2006.8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java语言程序设计 Java 语言程序设计 万年历