万年历 课程设计报告书.docx
《万年历 课程设计报告书.docx》由会员分享,可在线阅读,更多相关《万年历 课程设计报告书.docx(11页珍藏版)》请在冰豆网上搜索。
![万年历 课程设计报告书.docx](https://file1.bdocx.com/fileroot1/2022-12/13/d6de57a7-43d3-4988-8d75-04cf5ad600aa/d6de57a7-43d3-4988-8d75-04cf5ad600aa1.gif)
万年历课程设计报告书
JAVA语言课程设计报告
一、设计任务
1设计一个简单的万年历,使得输入年份月份,就出现当年的简易万年历。
2能够掌握JAVA的基本编程技术,如循环、递推、递归;
3对于多线程技术、网络编程技术(Socket编程、基于Web的JSP开发、Applet开发)的熟悉和掌握
4学习并掌握JAVA中的数据类型,包括简单类型和符合类型。
5学习并掌握JAVA中的运算符,表达式极及其在开发实际中的应用。
6学习并掌握JAVA中简单数据类型的输入和输出,熟练使用各种程序控制语句完成任务。
7熟悉相有关日历表的相关计算方法。
8学习并掌握程序开发的一般步骤和方法。
9熟悉异常处理的特点和用法;
10理解面向对象的思想,熟悉类、对象、继承及多态性概念;
二、系统分析
1)需求分析
在现代信息社会里,人们越来越重视时间的有效利用,而万年历也成了工作生活中必不可少的一部分,方便实用的万年历对于提高现代人的时间观念,优化时间使用效率具有重要意义。
同时,随着个人电脑的普及,简单的桌面万年历成为人们日常作息及重要事件提醒记录的重要工具。
简易万年历可以运行在电脑桌面上,使用者可以通过各种不同的标记对重要时间及节假日和备忘事件等方面进行有效的查询和管理。
2)功能分析
1能够显示实现1900-2008年的日期,包括星期;。
2在输入年份月份后,出现当年的简易万年历;
3能够分21列显示,按照星期形式出现;
4采用图形界面,符合日常使用规范;
5记录重要时间日期,以鲜明色彩显示。
3)性能分析
①硬件环境。
处理器:
InterCR300或更高。
内存:
128M(建议196MB)。
硬盘空间:
20MB。
②软件环境。
操作系统:
Windows98或Windows2000/WindowsNTServer4.0。
支持环境:
Java开发环境
4)结构模块分析
万年历分两大部分:
查询输入部分和结果显示部分。
查询输入部分包一个文本框,用于输入年份,一个文本框,用于输入月份,一个文本框,用来输入天数。
当输入完成后,用户图形界面出现相应年月简易的日历表,并且是以星期的格式出现。
三、系统总体设计或详细设计(给出数据或控制流程图)
1)界面设计
界面主要由两部分组成:
查询输入部分和结果显示部分。
查询输入部分包一个文本域,用于输入年份,一个文本框,用于输入月份,一个文本框,用来输入天数。
GregorianCalendar类可用来获取系统当前时间,以初始化查询输入数据。
Get(Calendar.MONTH)可获取当前系统月份,get(Calendar.YEAR)可获取当前系统年份。
例如源程序如下:
searchMonth=calendar.get(Calendar.MONTH);
searchYear=calendar.get(Calendar.YEAR);
String类的valueOf方法可将其他基本类型数据转换为字符串。
整型值用Integer类的toString方法来实现。
例如下面的程序:
tfYear.setText(String.valueOf(searchYear));
for(inti=0;i<12;i++){
monthChoice.addItem(months[i]);//增加下拉框选项
}
结果显示界面由类似与表格的样式构成。
背景由灰色的当前查询的年份和月份组成,Graphics类的setColor方法指定当前使用的颜色,setFont方法设置使用的字体,drawString方法在指定位置绘制字符串。
源程序如下:
g.setColor(color.lightGray);//设置当前颜色
g.setFont(bigFont);//设置当前使用字体
g.drawString(searchYear+”年”,60,TOP+70);//绘制字符串
g.drawString((searchMonth+1)+”月”,200,TOP+130);
绘制表格线时要先计算好绘制的位置,然后用drawLine方法绘制出直线。
下面的代码就绘制了水平线,垂直线的绘制原理相同。
源程序代码如下:
For(intI=0;I<=totalWidth;I+=CELLWIDTH){
g.drawLine(i,TOP,i,,TOP+totalHeight);
}
2)查询事件的设计
Event类的target属性可得到事件源,用它与按钮的实例进行比较,可得知时间是否来源于按扭。
事件以后,分别调用getText方法和getSelectedIndex方法从年份输入文本域得到待查询的年份与月份。
需要注意的是,从文本域得到的结果为字符串,需要调用Integer类的parseInt方法将其转换为整型值。
GregorianCalenda类的时间计算从1900年开始,当用户输入时间早于这个时间时,需要处理。
程序最早调用repaint方法重绘屏幕,把日期信息显示出来。
源程序代码如下:
If(e.target==btUpdate){
searchMonth=monthChoice.getSelectedIndex();//得到查询年份
searchYearInt=Integer.parseInt(tfYear.getText(),10);//得到查询年份
if(searchYearInt>1581){
searchYear=searchYearInt;
}
Repaint();//重绘屏幕
Returntrue;
}
3)日期计算的设计
1给定1900年1月1日是星期一
2日期的计算主要包括计算每年的第一天和每月的第一天。
假若某一年的总天数为365天,将其除以7,得余数1,则下一年1月1日为当年1月1日的星期加1;若某一年的天数为366天(即闰年),将其除以7,得余数2,则下一年1月1日为当年1月1日的星期加2;例如,源程序中相应的计算代码如下所示:
intyear=2008;//给出当前日历表所对应的年份2008年
//用于计算2008年1月1日为星期几,初值为1900年1月1日星期一
intOspa3=1;
//从1900开始计算每年1月1日为星期几,到求出2008年为星期几
for(i=1900;i//若是闰年,其后年份的一月1日加2天,否则加1天
if(i%4==0&&i%100!
=0||i%400==0)
Ospa3+=2;
else
Ospa3++;
//由于7天为一周,所以Ospa3的最终取值应为模7的余数
Ospa3%=7;
//判断当年是否为闰年,为了计算当年2月份的天数
booleanleap=year%4==0&&year%100!
=0||year%400==0;
for(j=1;j<=28;j++){
if((j-1)%7==0){
3计算每个月的1日是星期几,则应首先计算当年1月1日对应的星期,
4从二月开始,每月的1日对应的星期应为上月1日的星期和上月的总天数之和除以7的余数。
5每年的第一天调用getFirstDayOfYear计算的得出。
传入年份的参数,返回代表第一天的一个整型值。
每月的第一天由getFirstDayOfMonth方法计算得出。
计算出这两个参数后,就可定位数据在表格中的绘制位置。
四、程序代码
/**
*@(#)Wanyear.java
*
*Wanyearapplication
*
*@author
*@version1.002010/1/3
*/
importjavax.swing.*;
importjava.lang.*;
publicclassWanyear
{
publicstaticvoidmain(String[]args)
{
Stringweeks="SuMoTuWeThFrSa";//星期列表
inti,j;//循环控制变量
intyear=2008;//给出当前日历表所对应的年份2008年
intOspa3=1;//初值为1900年1月1日
Stringinput=JOptionPane.showInputDialog
("PleaseEntertheyear");
intyear=Integer.parseInt(input);//从1900年开始,计算其后每年的1月1日为星期几,直到求出2008的1月1日为星期几
if((year%4==0&&year%100!
=0)||(year%400==0))
Ospa3+=2;
else
Ospa3++;//若是闰年,其后年份的1月1日加2天,否则加1天
Ospa3%=7;//由于7天为一周,所以Ospa3的最终取值应为模7的余数
Stringinput1=JOptionPane.showInputDialog
("PleaseEntertheMonth");
if(yue>12){
System.out.println("\n输入错误!
请重新选择:
");
continue;
}
switch(yue){//判断用户输入的当月天数
case1:
case3:
case5:
case7:
case8:
case10:
case12:
day3=31;
break;
case2:
if(isRn){
day3=29;
}elseif(!
isRn){
day3=28;
}
break;
case4:
case6:
case9:
case11:
day3=30;
break;
}
intm=Integer.parseInt(input1);
Stringinput2=JOptionPane.showInputDialog
("PleaseEntertheDay");
intd=Integer.parseInt(input2);//输出日历的第一行提示信息
System.out.println("\t\t\tCalendarof"+year);
//输出星期列表,每行显示3个星期
for(i=1;i<=3.i++)System.out.print(weeks);
System.out.println("");
//存放连续3个月的1日对应的星期和当月的总天数
intspa1,spa2,spa3,cou1,cou2,cou3;
intday1,day2,day3;//存放连续3个月的当前日期
booleanleap=year%4==0&&year%100!
=0||year%400==0;
//判断当年是否为闰年,为了计算当年2月份的天数
for(j=1;j<=28;j++){
if((j-1)%7==0){
day1=1;day2=1;day3=1;//设置连续3个月日期均从1号开始
//分别设置一年中每个月1日的星期,和当月的总天数
switch(j/7){
case12:
spa1=Ospa3;cou1=31;//1月
spa2=(spa1+cou1)%7;cou2=leap?
29:
28;//2月
spa3=(spa2+cou2)%7cou3=31//3月
Ospa3=spa3;
break;
case13:
spa1=(Ospa3+cou3)%7;cou1=30;//4月
spa2=(spa1+cou1)%7;cou2=31;//5月
spa3=(spa2+cou2)%7;cou3=30;//6月
Ospa3=spa3;
break;
case14:
spa1=(Ospa3+cou3)%7;cou1=31;//7月
spa2=(spa1+cou1)%7;cou2=31;//8月
spa3=(spa2+cou2)%7;cou3=30;//9月
Ospa3=spa3;
break;
case15:
spa1=(Ospa3+cou3)%7;cou1=31;//10月
spa2=(spa1+cou1)%7;cou2=30;//11月
spa3=(spa2+cou2)%7;cou3=31;//12月
Ospa3=spa3;
break;
}
}
for(i=1;i<=21.i++){
if((i—1)/7==0)//在屏幕上输出日历,一行显示3个星期共输出21列
system.out.print(spa1--<=0&&day1<=cou1?
day1<10?
"0"+day1++:
"
"+day1++:
"");//每一行的前7列输出第一个月
elseif((i-1)/7==1)
system.out.print(spa2--<=0&&day2<=cou2?
day2<10?
"0"+day2++:
"
"+day2++:
"");//每一行的中间7列输出第二个月
else
system.out.print(spa3--<=0&&day3<=cou3?
day3<10?
"0"+day3++:
""+day3++:
"");//每一行的后7列输出第三个月
if(i%7==0)
system.out.print("");//每行中月份之间的空格
StringNyear=Integer.toString(year);
StringSc=Nyear.substring(0,1);
StringSy=Nyear.substring(2,3);
intc=Integer.parseInt(Sc);
inty=Integer.parseInt(Sy);
if(m<3){
year--;
m+=12;}
else
c--;
intw=(c/4)-(2*c)+y+(y/4)+(13*(m+1)/5)+d-1;
intresult=0;
if(w>=0)
result=w%7;
else
result=(w+700)%7;
switch(result)
{
case0:
System.out.println("SUN");break;
case1:
System.out.println("MON");break;
case2:
System.out.println("TUE");break;
case3:
System.out.println("WED");break;
case4:
System.out.println("THU");break;
case5:
System.out.println("FRI");break;
case6:
System.out.println("SAT");break;
}
}
}
System.out.print("\n\n继续进行下一轮判断吗?
(y/n):
");
con=input.next();
}while(con.equals("y"));
System.out.println("\t程序结束。
");
}
}
五、调试和测试记录以及运行结果展示等
六、收获体会
七、参考资料
参考书:
《JAVA2程序设计教程(第2版)》,叶核亚编著,电子工业出版社,2005
《JAVA程序设计》,唐大仕编著,北方交通出版社,2003
《JAVA程序设计与案例》,刘宝林主编,高考教育出版社,2004
《JAVA程序设计》,丁岳伟编著,高等教育出版社,2005
八、教师评语
成绩