java课程设计万年历程序设计报告

广东商学院华商学院

实验报告

课程名称 Java程序设计(课程设计) 实验项目名称 万年历 班级与班级代码 XX专软件X班 实验室名称(或课室)厚德楼B203 专 业 任课教师 刘 X 璐 学 号: 310010114 姓 名: XXX 实验日期: 2011 年 12月 日

广东商学院华商学院教务处 制

第1页

java课程设计万年历程序设计报告

广东商学院华商学院

目 录

前言 ...................................................................................................................................................... 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程序运行界面

java课程设计万年历程序设计报告

第4页

广东商学院华商学院

2.3流程图

3.各模块的功能及程序说明

3.1.初始化组件

import java.applet.Applet;

import java.awt.*;

java课程设计万年历程序设计报告

第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.测试分析

java课程设计万年历程序设计报告

图2在年份输入框内输入1582后点击更新后的情况

java课程设计万年历程序设计报告

图3 月份下拉列表框

第8页

广东商学院华商学院

图4选择月份后的情况

java课程设计万年历程序设计报告

第9页

java课程设计万年历程序设计报告

广东商学院华商学院

图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页

相关推荐