广东商学院华商学院
实验报告
课程名称 Java程序设计(课程设计) 实验项目名称 万年历 班级与班级代码 XX专软件X班 实验室名称(或课室)厚德楼B203 专 业 任课教师 刘 X 璐 学 号: 310010114 姓 名: XXX 实验日期: 2011 年 12月 日
广东商学院华商学院教务处 制
第1页
广东商学院华商学院
目 录
前言 ...................................................................................................................................................... 3
1需求分析 ........................................................................................................................................... 3
1.1需求分析 ....................................................................................................................................... 3
1.2功能设计 ....................................................................................................................................... 3
2.概要设计 ........................................................................................................................................... 3
2.1程序设计思路 ............................................................................................................................... 3
2.2程序运行界面 ............................................................................................................................... 4
2.3流程图 ........................................................................................................................................... 5
3.各模块的功能及程序说明 .............................................................................................................. 5
3.1.初始化组件 .................................................................................................................................. 5
3.2.初始化数据 .................................................................................................................................. 6
3.3.绘制程序界面 .............................................................................................................................. 6
4.测试分析 ........................................................................................................................................ 8
5.源程序清单 .................................................................................................................................. 10
6.课程设计体会 .............................................................................................................................. 18
第2页
广东商学院华商学院
前言
Java的前身是Oak,它一开始只是被应用于消费性电子产品中。后来它的开发者们发现它还可以被用于更大范围的Internet上。19xx年,Java语言的名字从Oak编程了Java。19xx年J2SE1.1发布。19xx年J2SE1.2发布,标志Java2的诞生。十多年来,Java编程语言及平台成功地运用在网络计算及移动等各个领域。Java的体系结构由Java语言、Java class、Java API、Java虚拟机组成。它具有简单、面向对象、健壮、安全、结构中立、可移植和高效能等众多优点。Java支持多线程编程,Java运行时系统在多线程同步方面具有成熟的解决方案。Java的平台标准有Java ME,Java SE和Java EE。Java发展到今天,它的卓越成就及在业界的地位毋庸置疑。目前在众多的支持Java的开发工具中主要的7有Java Development Kit,NetBeans,Jcreator,JBuilder,JDeveloper和Eclipse等。其中Java Development Kit 简称JDK是大多开发工具的基础。以上的每种开发工具都有优缺点,对于开发者来说,重要的是要根据自己的开发规模、开发内容和软硬件环境等因素来选择一种合适的开发工具。
1需求分析
1.1需求分析
本程序的要求为:1.使用图形用户界面;2.本程序能够实现日期与星期的查询。
1.2功能设计
本程序要构建的万年历程序,其功能有以下几个方面:
(1)通过网页形式运行,实现图形界面。
(2)能以月历形式显示日期与星期。
(3)支持用户自己输入年份,并提供月份的下拉形式菜单来选择月份。
(4)通过点击“更新”来刷新日历。
2.概要设计
2.1程序设计思路
1. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
第3页
广东商学院华商学院
2. 输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
3. 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
4. 如果年份小于1582年则程序不予判断。
2.2程序运行界面
第4页
广东商学院华商学院
2.3流程图
3.各模块的功能及程序说明
3.1.初始化组件
import java.applet.Applet;
import java.awt.*;
第5页
广东商学院华商学院
import java.util.*;
3.2.初始化数据
public class CalendarApplet extends Applet{
static final int TOP = 70; //顶端距离 static final int CELLWIDTH=50,CELLHEIGHT = 30; //单元格尺寸 static final int MARGIN = 3; //边界距离 static final int FEBRUARY = 1; TextField tfYear = new TextField("2004", 5); //显示年份的文本域 Choice monthChoice = new Choice(); //月份选择下拉框 Button btUpdate = new Button("更新"); //更新按钮 GregorianCalendar calendar=new GregorianCalendar(); //日历对象 Font smallFont = new Font("TimesRoman", Font.PLAIN, 15); //显示小字体 Font bigFont = new Font("TimesRoman", Font.BOLD, 50); //显示大字体 String days[] = {"星期日", "星期一", "星期二", "星期三","星期四", "星期五", "星期六"}; String months[] = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月", "九月","十月", "十一月", "十二月"};
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每个月的天数 int searchMonth,searchYear; //查询的年份及月份
3.3.绘制程序界面
public void init(){
第6页
广东商学院华商学院
setBackground(Color.white); //设置背景颜色 searchMonth = calendar.get(Calendar.MONTH); //得到系统年份 searchYear = calendar.get(Calendar.YEAR); //得到系统月份 add(new Label(" 年:")); //增加组件到Applet tfYear.setText(String.valueOf(searchYear)); //设置文本域文字 add(tfYear); add(new Label(" 月:")); monthChoice.setFont(smallFont); //设置月份选择下拉框的显示字体 for (int i = 0; i < 12; i++) { } monthChoice.select(searchMonth); //设置下拉框当前选择项 add(monthChoice); add(btUpdate); int componentCount=this.getComponentCount(); //得到Applet中的组件数量 for (int i=0;i<componentCount;i++){ } } getComponent(i).setFont(smallFont); //设置所有组件的显示字体 monthChoice.addItem(months[i]); //增加下拉框选项
第7页
广东商学院华商学院
4.测试分析
图2在年份输入框内输入1582后点击更新后的情况
图3 月份下拉列表框
第8页
广东商学院华商学院
图4选择月份后的情况
第9页
广东商学院华商学院
图5点击更新按钮后显示的结果
5.源程序清单
import java.applet.Applet;
import java.awt.*;
import java.util.*;
public class CalendarApplet extends Applet{
static final int TOP = 70; //顶端距离 static final int CELLWIDTH=50,CELLHEIGHT = 30; //单元格尺寸 static final int MARGIN = 3; //边界距离 static final int FEBRUARY = 1; TextField tfYear = new TextField("2004", 5); //显示年份的文本域 Choice monthChoice = new Choice(); //月份选择下拉框 Button btUpdate = new Button("更新"); //更新按钮 GregorianCalendar calendar=new GregorianCalendar(); //日历对象 Font smallFont = new Font("TimesRoman", Font.PLAIN, 15); //显示小字体 Font bigFont = new Font("TimesRoman", Font.BOLD, 50); //显示大字体 String days[] = {"星期日", "星期一", "星期二", "星期三","星期四", "星期五", "星期六"}; String months[] = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月", "九月","十月", "十一月", "十二月"};
第10页
广东商学院华商学院
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每个月的天数 int searchMonth,searchYear; //查询的年份及月份 public void init(){ setBackground(Color.white); //设置背景颜色 searchMonth = calendar.get(Calendar.MONTH); //得到系统年份 searchYear = calendar.get(Calendar.YEAR); //得到系统月份 add(new Label(" 年:")); //增加组件到Applet tfYear.setText(String.valueOf(searchYear)); //设置文本域文字 add(tfYear); add(new Label(" 月:")); monthChoice.setFont(smallFont); //设置月份选择下拉框的显示字体 for (int i = 0; i < 12; i++) { } monthChoice.select(searchMonth); //设置下拉框当前选择项 add(monthChoice); add(btUpdate); int componentCount=this.getComponentCount(); //得到Applet中的组件数量 for (int i=0;i<componentCount;i++){ getComponent(i).setFont(smallFont); //设置所有组件的显示字体 monthChoice.addItem(months[i]); //增加下拉框选项
第11页
广东商学院华商学院
} } public void paint(Graphics g){ FontMetrics fontMetric; //显示字体的FontMetrics对象 int fontAscent; int dayPos; int totalWidth, totalHeight; //总的宽度,高度 int numRows; //行数 int xNum, yNum; //水平和垂直方向单元格数量 int numDays; String dayStr; //显示天数字符串 int margin; g.setColor(Color.lightGray); //设置当前颜色 g.setFont(bigFont); //设置当前使用字体 g.setColor(Color.black); g.setFont(smallFont); g.drawString(searchYear+"年",60,TOP+70); //绘制字符串 g.drawString((searchMonth+1)+"月",200,TOP+130);
第12页
广东商学院华商学院
fontMetric = g.getFontMetrics(); //获取变量初值 fontAscent = fontMetric.getAscent(); dayPos = TOP + fontAscent / 2; totalWidth = 7 * CELLWIDTH; //得到总的表格宽度 for (int i = 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 (int i = 0; i <= totalWidth; i += CELLWIDTH) { } g.drawLine(i, TOP , i, TOP+ totalHeight); //绘制表格线 for (int i = 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);
第13页
广东商学院华商学院
for (int day = 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;
} public boolean action(Event e, Object o){ int searchYearInt; if (e.target==btUpdate){ searchMonth = monthChoice.getSelectedIndex(); //得到查询月份 searchYearInt = Integer.parseInt(tfYear.getText(), 10); //得到查询年份 if (searchYearInt > 1581) { searchYear = searchYearInt; }
第14页
广东商学院华商学院
repaint(); //重绘屏幕 return true; } return false; } private int getNumberRows(int year, int month) { //得到行数量 int firstDay; int numCells; if (year < 1582) { //年份小于1582年,则返回-1 } return (-1); if ((month < 0) || (month > 11)) { } firstDay = getFirstDayOfMonth(year, month); //计算月份的第一天 return (-1); if ((month == FEBRUARY) && (firstDay == 0) && !calendar.isLeapYear(year)) { } numCells = firstDay + daysInMonth[month]; return 4;
第15页
广东商学院华商学院
if ((month == FEBRUARY) && (calendar.isLeapYear(year))) { } return ((numCells <= 35) ? 5 : 6); //返回行数 numCells++; } private int getFirstDayOfMonth(int year, int month) { //得到每月的第一天 int firstDay; int i; if (year < 1582) { //年份小于1582年,返回-1 } if ((month < 0) || (month > 11)) { //月份数错误,返回-1 } firstDay = getFirstDayOfYear(year); for (i = 0; i < month; i++) { } firstDay += daysInMonth[i]; //计算每月的第一天 //得到每年的第一天 return (-1); return (-1); if ((month > FEBRUARY) && calendar.isLeapYear(year)) { firstDay++;
第16页
广东商学院华商学院
} } return (firstDay % 7); } private int getFirstDayOfYear(int year){ //计算每年的第一天 } int leapYears; int hundreds; int fourHundreds; int first; if (year < 1582) { //如果年份小于1582年 } leapYears = (year - 1581) / 4; hundreds = (year - 1501) / 100; leapYears -= hundreds; fourHundreds = (year - 1201) / 400; leapYears += fourHundreds; first=5 + (year - 1582) + leapYears % 7; //得到每年第一天 return first; return (-1); //返回-1
第17页
广东商学院华商学院
6.课程设计体会
(1)选题目的:本次课程设计为课本后设计题目任选一题进行设计。思考一段时间后,我们组决定做一个万年历的设计。主要考虑到以前时间少课程内容多,JAVA课程基础内容掌握并不是很抓实,而对于设计一个万年历程序,由于其功能简单设计也相对较易,对于我们组每个人的学习情况比较合适,并且通过设计这样的一个日历小组件,也能使自己对JAVA的一些基础知识掌握的更加牢固。
(2)对于本程序的设计,首先考虑其功能有哪些,需要显示什么,如何进行窗体构建布局,需要用哪些知识点,如相关的类和对象等。最后,就是根据初步设计的功能和布局构架,考虑用源代码进行实现了。
经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于完成了整个课程设计。在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。
通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。所以网络这个强大的工具,确实是我们学习之中可以借助的一个很好的帮手。网络是我们学习的最好的老师之一。有问题,问网络,是一个很好的习惯。
第18页
学生实验报告册(理工类)课程名称:JAVA程序设计实验专业班级:M11计算机科学与技术II学生学号:学生姓名:所属院部:XX学院指…
重庆邮电大学Java程序设计报告书题目二级学院专业名称班级学生学号学生姓名指导教师职称学位成绩二00年月一课程设计目的更好的掌握j…
Java程序设计课程设计报告课题带函数功能和数制转换功能的计算器姓名张其卿学号20xx17010139同组姓名谭樟林专业班级指导教…
程序设计课程设计报告设计题目专业班级学号姓名指导教师时间20xx061320xx0624程序设计课程设计报告摘要计算器模拟程序课程…
Java程序设计课程设计题目巢湖学院计算机与信息工程学院实验报告记事本程序院系计算机与信息工程学院专业软件工程学生姓名杨旋顾莹莹杨…
黄淮学院JAVA课程设计报告题目:《日记本的设计与实现》课程设计学院:信息工程学院姓名:学号:专业:软件工程班级:软工1101B班…
懒惰是很奇怪的东西它使你以为那是安逸是休息是福气但实际上它所给你的是无聊是倦怠是消沉它剥夺你对前途的希望割断你和别人之间的友情使你…
JAVA2程序设计课程设计报告设计题目JAVA小日历组件设计专业计算机科学与技术班级09计本班姓名文肇星学号20xx年12月21日…
Java程序设计课程设计报告20xx20xx年度第1学期Hannio塔专业学生姓名班级学号指导教师完成日期计算机科学技术网络工程马…
河南机电高等专科学校学生课程设计报告实验课程名称Java程序设计开课实验室实验楼308机房系、部计科系年级11专业班软件技术学生姓…
Java课程设计报告课目计算器学院基础学院班级光信息20xx1学生指导教师丁振凡张晓瑞辅导教师江宇完成时间20xx年7月1日课程设…