课程设计(论文)任务书软件学院学院_______________________________ 专业_______________________ 班一、课程设计(论文)题目 ____________________________________________________________二、课程设计(论文)工作自2012 年12月_2£日起至2012年12月_28_日止。
三、课程设计(论文)地点:软件学院实训中心四、课程设计(论文)内容要求:1 •本课程设计的目的______________________________________________________________(1)掌握Java语言的程序设计方法;( 2)理论联系实际,进一步提高学生的软件开发技术;( 3)培养学生分析、解决问题的能力;( 4)提高学生实践论文撰写能力。
2 •课程设计的任务及要求1 )课程设计任务:(1) 设计一个万年历系统,能查看日期。
___________________________________________(2) 能查任意一年任意一月的日期。
_______________________________________________(3) 背景显示当前年月。
_________________________________________________________ 2) 创新要求:(1)月份查看使用下拉菜单。
(2)查看框可随意拉大拉小,背景显示当前的年月。
__________________________________3) 课程设计论文编写要求___________________________________________________________(1)课程设计任务及要求____________________________________________________________(2 )设计思路--工作原理、功能规划(3)详细设计---数据分析、算法思路、类设计、功能实现(含程序流程图、主要代码及注释)、界面等。
(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5 )设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。
(6 )参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)(7) 报告按规定排版打印,要求装订平整,否则要求返工;(8) 课设报告的装订顺序如下:封面---任务书---中文摘要---目录----正文---附录(代码及相关图片)2012年12 月日(9 )严禁抄袭,如有发现,按不及格处理。
2012年12 月24 日课程设计(论文)评审意见讲师中文摘要Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems 公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME )的总称。
Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
Java平台由Java虚拟机(Java Virtual Machine,简称JVM )和Java应用编程接口( Applicatio n Programmi ng In terface,简称API)构成。
Java 应用编程接口为Java 应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。
在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。
现在Java平台已经嵌入了几乎所有的操作系统。
这样Java程序可以只编译一次,就可以在各种系统中运行。
Java应用编程接口已经从1.1x版发展到1.2版。
目前常用的Java平台基于Java1.4, 最近版本为Java1.7。
Java优势,是适合团队开发,软件工程可以相对做到规范,这是一个很难比拟的优势。
java 劣势,是j2ee的架构很完美,第一版软件可以做满意,但是很不适合互联网模式的持续不断修改。
互联网软件工程管理上的不足,持续的修修补补导致架构的破坏。
系统更新需要重启web服务,很难接受。
Java是一种应用前景很广的语言,应该好好学习,通过课程设计巩固学过的知识,为今后的学习打下坚实的基础。
2012年12 月日目录一、课程设计任务及要求 (1)二、需求分析 (1)三、设计思路 (2)四、详细设计 (3)五、运行调试与分析讨论 (10)六、设计体会与小结 (12)七、参考文献 (13)、课程设计任务及要求1)任务:1、万年历是一个强大的日历系统,通过它可以实现对过去, 现在以及将来日期的查找, 通过在年份对话框中输入要查询的年份,再相应的在月份对应的下拉菜单选择要查询的月份,则可得到相应的日历。
本实验是对图形用户界面,布局管理器的综合运用,理解JAVA的时间处理机制,编写独立运行的窗口。
2)要求:1. 使用图形用户界面。
2. 本程序能够实现任意年份月份的查询。
二、需求分析1). 随着科学技术的不断发展,计算机已经成为我们工作学习和生活中不可缺少的工具。
文本编辑器是个人计算机最司空见惯的应用程序了,在学习了Java 语言之后,我决定使用Java 语言编写一个简单的万年历,可以实现查询日期和显示时间的功能,满足日常基本的工作学习和娱乐需要。
1) 总天数的算法:首先用if 语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
2 ) 输出月份第一天为星期几的算法:使总天数除以7 取余加2得几既为星期几,若是7,则为星期日。
3) 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7 得0 换行,即可完整的输出该月的日历。
4) 如果年份小于1582 年则程序不予判断。
1 )流程图:2)代码:import java.applet.Applet;import java.awt.*;import java.util.*;public class Cale ndarApplet exte nds Applet{ static final int TOP = 70; // 顶端距离static final int CELLWIDTH=50,CELLHEIGHT = 30; //单元格尺寸static final int MARGIN = 5; //边界距离static final int FEBRUARY = 1;TextField tfYear = new TextField("2004", 5); //显示年份的文本域Choice monthChoice = new Choice(); // 月份选择下拉框Button btUpdate = new Butt on ("查看");// 更新按钮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; /查/ 询的年份及月份public void init(){ setBackground(Color.yellow); //设置背景颜色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.addItem(months[i]); //增加下拉框选项}monthChoice.select(searchMonth); /设/ 置下拉框当前选择项add(monthChoice);add(btUpdate);int componentCount=this.getComponentCount(); /得/ 到Applet 中的组件数量for (int i=0;i<componentCount;i++){ getComponent(i).setFont(smallFont); //设置所有组件的显示字体}}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.drawStri ng(searchYea 叶年",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 (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);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;} 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)) { return (-1);}firstDay = getFirstDayOfMonth(year, month); // 计算月份的第一天if ((month == FEBRUARY) && (firstDay == 0)&& !calendar.isLeapYear(year)) {return 4;}numCells = firstDay + daysInMonth[month];if ((month == FEBRUARY) && (calendar.isLeapYear(year))) { numCells++;}return ((numCells <= 35) ? 5 : 6); //返回行数}private int getFirstDayOfMonth(int year, int month) { // 得到每月的第一天int firstDay;int i;if (year < 1582) { //年份小于1582 年,返回-1 return (-1);}if ((month < 0) || (month > 11)) { // 月份数错误,返回-1 return (-1);}firstDay = getFirstDayOfYear(year); //得到每年的第一天for (i = 0; i < month; i++) { firstDay += daysInMonth[i]; // 计算每月的第一天}if ((month > FEBRUARY) && calendar.isLeapYear(year)) { firstDay++;「efum(firsfDay%7=private infgefFi 「sfDayofyear(infyeaw斗wa ^s Minf-eapYears 八infhundreds 八 inffourHundreds八in二「sc- 宀二&>书序宁B 1「efum(二)八二岚回二-eapYears H(year 二581)、4八hundredsH(year二52)二00八-eapYears —H hundreds八fourHundreds H(year-122)、400八-eapYears +H fourHundreds八f i 「sll 5+(year -1582) + -eapYears % 7八注®a^M「efumfi 「sc五、运行调试与分析讨论1)背景显示当前日期:(小府用CalendarApplerclass, 口回「小应用程序年:2013|月:一月 T 查看已倉动小应用程玮「2 )月份下拉菜单:[全I 小应用耳序楚書毒CalendarAppletchs^ I = I 回 小应用程序13 14 20 21 27281 015 22 292013 月:月=4 5 111 12 18 192526'期五星期六〔月月月月月月月月三一四五六七八九3)年份框输入2015,月份选择3,点击查看: 曰小应冃谟孚童#H Calends ^Applet, class <1 ■■应用程序六、设计体会与小结JAVA课程基础内容掌握并不是很抓实,而对于设计一个万年历程序,由于其功能简单设计也相对较易,对于我个人的学习情况比较合适,并且通过设计这样的一个日历小组件,也能使自己对JAVA的一些基础知识掌握的更加牢固。