java課程設(shè)計(jì)報(bào)告-萬年歷_第1頁(yè)
已閱讀1頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  目 錄</p><p><b>  前言3</b></p><p><b>  1需求分析3</b></p><p><b>  1.1需求分析3</b></p><p><b>  1.2功能設(shè)計(jì)3</b>&l

2、t;/p><p><b>  2.概要設(shè)計(jì)3</b></p><p>  2.1程序設(shè)計(jì)思路3</p><p>  2.2程序運(yùn)行界面4</p><p><b>  2.3流程圖5</b></p><p>  3.各模塊的功能及程序說明6</p><

3、p>  3.1.初始化組件6</p><p>  3.2.初始化數(shù)據(jù)6</p><p>  3.3.繪制程序界面7</p><p><b>  4.測(cè)試分析8</b></p><p>  5.源程序清單10</p><p>  6.課程設(shè)計(jì)體會(huì)18</p><

4、p><b>  參考文獻(xiàn)19</b></p><p><b>  前言</b></p><p>  Java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語言和Java平臺(tái)(即JavaSE, JavaEE, JavaME)的總稱。Java最初被命名為Oa

5、k,目標(biāo)設(shè)置在家用電器等小型系統(tǒng)的程序語言,應(yīng)用在電視機(jī)、電話、鬧鐘、烤面包機(jī)等家用電器的控制和通信。由于這些智能化家電的市場(chǎng)需求沒有預(yù)期的高,Sun公司放棄了該項(xiàng)計(jì)劃。隨著1990年代互聯(lián)網(wǎng)的發(fā)展,Sun公司看見Oak在互聯(lián)網(wǎng)上應(yīng)用的前景,于是改造了Oak,于1995年5月以Java的名稱正式發(fā)布。Java 編程語言的風(fēng)格十分接近C、C++語言。Java是一個(gè)純的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,它繼承了 C++語言面向?qū)ο蠹夹g(shù)的核心

6、。Java舍棄了C ++語言中容易引起錯(cuò)誤的指針(以引用取代)、運(yùn)算符重載(operator overloading)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對(duì)象所占據(jù)的內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔(dān)憂。在 Java 1.5 版本中,Java 又引入了泛型編程(Generic Progr</p><p><b>  1需求分析</b></p&

7、gt;<p><b>  1.1需求分析</b></p><p><b>  本程序的要求為:</b></p><p>  1.使用圖形用戶界面;</p><p>  2.本程序能夠?qū)崿F(xiàn)日期與星期的查詢。</p><p><b>  1.2功能設(shè)計(jì)</b><

8、/p><p>  本程序要構(gòu)建的萬年歷程序,其功能有以下幾個(gè)方面:</p><p>  (1)通過網(wǎng)頁(yè)形式運(yùn)行,實(shí)現(xiàn)圖形界面。</p><p>  (2)能以月歷形式顯示日期與星期。</p><p>  (3)支持用戶自己輸入年份,并提供月份的下拉形式菜單來選擇月份。</p><p>  (4)通過點(diǎn)擊“更新”來刷新日歷。

9、</p><p><b>  2.概要設(shè)計(jì)</b></p><p><b>  2.1程序設(shè)計(jì)思路</b></p><p>  1. 總天數(shù)的算法:首先用if語句判斷定義年到輸入年之間每一年是否為閏年,是閏年,該年的總天數(shù)為366,否則,為365。然后判斷輸入的年是否為定義年,若是,令總天數(shù)S=1,否則,用累加法計(jì)算出定義

10、年到輸入年之間的總天數(shù),再把輸入年的一月到要輸出的月份之間的天數(shù)累加起來,若該月是閏年中的月份并且該月還大于二月,再使總天數(shù)加1,否則,不加,既算出從定義年一月一日到輸出年的該月一日的總天數(shù)。  2. 輸出月份第一天為星期幾的算法:使總天數(shù)除以7取余加2得幾既為星期幾,若是7,則為星期日。</p><p>  3. 算出輸出月份第一天為星期幾的算法:算出輸出月份第一天為星期幾后,把該日期以前

11、的位置用空格補(bǔ)上,并總該日起一次輸出天數(shù)直到月底,該月中的天數(shù)加上該月一日為星期幾的數(shù)字再除以7得0換行,即可完整的輸出該月的日歷。</p><p>  4. 如果年份小于1582年則程序不予判斷。</p><p><b>  2.2程序運(yùn)行界面</b></p><p>  圖1 手動(dòng)調(diào)節(jié)屏幕大小后的樣子</p><p&

12、gt;<b>  2.3流程圖</b></p><p>  3.各模塊的功能及程序說明</p><p><b>  3.1.初始化組件</b></p><p>  import java.applet.Applet; </p><p>  import java.awt.*; </p>

13、<p>  import java.util.*; </p><p><b>  3.2.初始化數(shù)據(jù)</b></p><p>  public class CalendarApplet extends Applet{ </p><p>  static final int TOP = 70; //頂端距離</p>&

14、lt;p>  static final int CELLWIDTH=50,CELLHEIGHT = 30; //單元格尺寸</p><p>  static final int MARGIN = 3; //邊界距離</p><p>  static final int FEBRUARY = 1; </p><p>  TextField tfYear =

15、new TextField("2004", 5); //顯示年份的文本域</p><p>  Choice monthChoice = new Choice(); //月份選擇下拉框</p><p>  Button btUpdate = new Button("更新"); //更新按鈕</p><p>  Gregori

16、anCalendar calendar=new GregorianCalendar(); //日歷對(duì)象</p><p>  Font smallFont = new Font("TimesRoman", Font.PLAIN, 15); //顯示小字體</p><p>  Font bigFont = new Font("TimesRoman",

17、Font.BOLD, 50); //顯示大字體</p><p>  String days[] = {"星期日", "星期一", "星期二", "星期三","星期四", "星期五", "星期六"}; </p><p>  String months

18、[] = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月", "九月","十月", "十一月", "十二月"}; </p><p>

19、  int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每個(gè)月的天數(shù)</p><p>  int searchMonth,searchYear; //查詢的年份及月份</p><p>  3.3.繪制程序界面</p><p>  public void init(){ <

20、;/p><p>  setBackground(Color.white); //設(shè)置背景顏色 </p><p>  searchMonth = calendar.get(Calendar.MONTH); //得到系統(tǒng)年份</p><p>  searchYear = calendar.get(Calendar.YEAR);//得到系統(tǒng)月份</p>

21、<p>  add(new Label(" 年:")); //增加組件到Applet</p><p>  tfYear.setText(String.valueOf(searchYear)); //設(shè)置文本域文字</p><p>  add(tfYear); </p><p>  add(new Label(" 月:

22、")); </p><p>  monthChoice.setFont(smallFont); //設(shè)置月份選擇下拉框的顯示字體</p><p>  for (int i = 0; i < 12; i++) {</p><p>  monthChoice.addItem(months[i]); //增加下拉框選項(xiàng)</p><

23、p><b>  }</b></p><p>  monthChoice.select(searchMonth); //設(shè)置下拉框當(dāng)前選擇項(xiàng)</p><p>  add(monthChoice); </p><p>  add(btUpdate); </p><p>  int componentCount

24、=this.getComponentCount(); //得到Applet中的組件數(shù)量</p><p>  for (int i=0;i<componentCount;i++){</p><p>  getComponent(i).setFont(smallFont); //設(shè)置所有組件的顯示字體</p><p><b>  } </b

25、></p><p><b>  }</b></p><p><b>  4.測(cè)試分析</b></p><p>  圖2 在年份輸入框內(nèi)輸入2014后點(diǎn)擊更新后的情況</p><p>  圖3 月份下拉列表框</p><p>  圖4 選擇月份后的情況<

26、;/p><p>  圖5 點(diǎn)擊更新按鈕后顯示的結(jié)果</p><p><b>  5.源程序清單</b></p><p>  import java.applet.Applet; </p><p>  import java.awt.*; </p><p>  import java.util.*;

27、 </p><p>  public class CalendarApplet extends Applet{ </p><p>  static final int TOP = 70; //頂端距離</p><p>  static final int CELLWIDTH=50,CELLHEIGHT = 30; //單元格尺寸</p><p

28、>  static final int MARGIN = 3; //邊界距離</p><p>  static final int FEBRUARY = 1; </p><p>  TextField tfYear = new TextField("2004", 5); //顯示年份的文本域</p><p>  Choice monthC

29、hoice = new Choice(); //月份選擇下拉框</p><p>  Button btUpdate = new Button("更新"); //更新按鈕</p><p>  GregorianCalendar calendar=new GregorianCalendar(); //日歷對(duì)象</p><p>  Font sma

30、llFont = new Font("TimesRoman", Font.PLAIN, 15); //顯示小字體</p><p>  Font bigFont = new Font("TimesRoman", Font.BOLD, 50); //顯示大字體</p><p>  String days[] = {"星期日", &

31、quot;星期一", "星期二", "星期三","星期四", "星期五", "星期六"}; </p><p>  String months[] = {"一月", "二月", "三月", "四月","五月"

32、;, "六月", "七月", "八月", "九月","十月", "十一月", "十二月"}; </p><p>  int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每個(gè)月的天數(shù)&l

33、t;/p><p>  int searchMonth,searchYear; //查詢的年份及月份</p><p>  public void init(){ </p><p>  setBackground(Color.white); //設(shè)置背景顏色 </p><p>  searchMonth = calendar.get(Cal

34、endar.MONTH); //得到系統(tǒng)年份</p><p>  searchYear = calendar.get(Calendar.YEAR);//得到系統(tǒng)月份</p><p>  add(new Label(" 年:")); //增加組件到Applet</p><p>  tfYear.setText(String.valueOf(se

35、archYear)); //設(shè)置文本域文字</p><p>  add(tfYear); </p><p>  add(new Label(" 月:")); </p><p>  monthChoice.setFont(smallFont); //設(shè)置月份選擇下拉框的顯示字體</p><p>  for (int

36、i = 0; i < 12; i++) {</p><p>  monthChoice.addItem(months[i]); //增加下拉框選項(xiàng)</p><p><b>  }</b></p><p>  monthChoice.select(searchMonth); //設(shè)置下拉框當(dāng)前選擇項(xiàng)</p><p>

37、;  add(monthChoice); </p><p>  add(btUpdate); </p><p>  int componentCount=this.getComponentCount(); //得到Applet中的組件數(shù)量</p><p>  for (int i=0;i<componentCount;i++){</p>

38、<p>  getComponent(i).setFont(smallFont); //設(shè)置所有組件的顯示字體</p><p><b>  } </b></p><p><b>  }</b></p><p>  public void paint(Graphics g){ </p>

39、<p>  FontMetrics fontMetric; //顯示字體的FontMetrics對(duì)象</p><p>  int fontAscent; </p><p>  int dayPos; </p><p>  int totalWidth, totalHeight; //總的寬度,高度</p><p>  int

40、 numRows; //行數(shù)</p><p>  int xNum, yNum; //水平和垂直方向單元格數(shù)量 </p><p>  int numDays; </p><p>  String dayStr; //顯示天數(shù)字符串</p><p>  int margin; </p><p>

41、  g.setColor(Color.lightGray); //設(shè)置當(dāng)前顏色</p><p>  g.setFont(bigFont); //設(shè)置當(dāng)前使用字體</p><p>  g.drawString(searchYear+"年",60,TOP+70); //繪制字符串</p><p>  g.drawString((searchMonth

42、+1)+"月",200,TOP+130); </p><p>  g.setColor(Color.black);</p><p>  g.setFont(smallFont);</p><p>  fontMetric = g.getFontMetrics(); //獲取變量初值</p><p>  fontAsc

43、ent = fontMetric.getAscent(); </p><p>  dayPos = TOP + fontAscent / 2; </p><p>  totalWidth = 7 * CELLWIDTH; //得到總的表格寬度</p><p>  for (int i = 0; i < 7; i++) {</p>&

44、lt;p>  g.drawString(days[i], (CELLWIDTH-fontMetric.stringWidth(days[i]))/2 + i*CELLWIDTH,dayPos-20); //繪制表格標(biāo)題欄</p><p><b>  }</b></p><p>  numRows = getNumberRows(searchYear, se

45、archMonth); //計(jì)算需要的行的數(shù)量</p><p>  totalHeight = numRows * CELLHEIGHT; //得到總的表格高度</p><p>  for (int i = 0; i <= totalWidth; i += CELLWIDTH) {</p><p>  g.drawLine(i, TOP , i, TOP+ t

46、otalHeight); //繪制表格線</p><p><b>  }</b></p><p>  for (int i = 0, j = TOP ; i <= numRows; i++, j += CELLHEIGHT) {</p><p>  g.drawLine(0, j, totalWidth, j); //繪制表格線<

47、/p><p><b>  }</b></p><p>  xNum = (getFirstDayOfMonth(searchYear, searchMonth) + 1) * CELLWIDTH - MARGIN; </p><p>  yNum = TOP + MARGIN + fontAscent; </p><

48、;p>  numDays = daysInMonth[searchMonth] + ((calendar.isLeapYear(searchYear) && (searchMonth == FEBRUARY)) ? 1 : 0); </p><p>  for (int day = 1; day <= numDays; day++) { </p><p>  

49、dayStr = Integer.toString(day); </p><p>  g.drawString(dayStr, xNum - fontMetric.stringWidth(dayStr), yNum); //繪制字符串</p><p>  xNum += CELLWIDTH; </p><p>  if (xNum > totalWidth

50、) { </p><p>  xNum = CELLWIDTH - MARGIN; </p><p>  yNum += CELLHEIGHT; </p><p><b>  } </b></p><p><b>  } </b></p><p><b>  

51、}</b></p><p>  public boolean action(Event e, Object o){ </p><p>  int searchYearInt; </p><p>  if (e.target==btUpdate){ </p><p>  searchMonth = monthChoice.ge

52、tSelectedIndex(); //得到查詢?cè)路?lt;/p><p>  searchYearInt = Integer.parseInt(tfYear.getText(), 10); //得到查詢年份 </p><p>  if (searchYearInt > 1581) {</p><p>  searchYear = searchYearInt

53、; </p><p><b>  } </b></p><p>  repaint(); //重繪屏幕</p><p>  return true; </p><p><b>  } </b></p><p>  return false; </p>&

54、lt;p><b>  } </b></p><p>  private int getNumberRows(int year, int month) { //得到行數(shù)量</p><p>  int firstDay; </p><p>  int numCells;</p><p>  if (year &l

55、t; 1582) { //年份小于1582年,則返回-1</p><p>  return (-1); </p><p><b>  }</b></p><p>  if ((month < 0) || (month > 11)) {</p><p>  return (-1); </p>

56、<p><b>  }</b></p><p>  firstDay = getFirstDayOfMonth(year, month); //計(jì)算月份的第一天 </p><p>  if ((month == FEBRUARY) && (firstDay == 0) && !calendar.isLeapYear(year

57、)) {</p><p><b>  return 4;</b></p><p><b>  }</b></p><p>  numCells = firstDay + daysInMonth[month]; </p><p>  if ((month == FEBRUARY) &&

58、 (calendar.isLeapYear(year))) {</p><p>  numCells++; </p><p><b>  }</b></p><p>  return ((numCells <= 35) ? 5 : 6); //返回行數(shù)</p><p><b>  } </b&g

59、t;</p><p>  private int getFirstDayOfMonth(int year, int month) { //得到每月的第一天</p><p>  int firstDay; </p><p><b>  int i;</b></p><p>  if (year < 1582)

60、{ //年份小于1582年,返回-1</p><p>  return (-1); </p><p><b>  }</b></p><p>  if ((month < 0) || (month > 11)) { //月份數(shù)錯(cuò)誤,返回-1</p><p>  return (-1); </p>

61、<p><b>  }</b></p><p>  firstDay = getFirstDayOfYear(year);//得到每年的第一天</p><p>  for (i = 0; i < month; i++) {</p><p>  firstDay += daysInMonth[i]; //計(jì)算每月的第一天&l

62、t;/p><p><b>  }</b></p><p>  if ((month > FEBRUARY) && calendar.isLeapYear(year)) {</p><p>  firstDay++; </p><p><b>  }</b></p>

63、<p>  return (firstDay % 7); </p><p><b>  } </b></p><p>  private int getFirstDayOfYear(int year){ //計(jì)算每年的第一天</p><p>  int leapYears; </p><p>  in

64、t hundreds;</p><p>  int fourHundreds; </p><p>  int first;</p><p>  if (year < 1582) { //如果年份小于1582年</p><p>  return (-1); //返回-1</p><p><b>  }

65、</b></p><p>  leapYears = (year - 1581) / 4;</p><p>  hundreds = (year - 1501) / 100;</p><p>  leapYears -= hundreds;</p><p>  fourHundreds = (year - 1201) / 400;

66、 </p><p>  leapYears += fourHundreds;</p><p>  first=5 + (year - 1582) + leapYears % 7; //得到每年第一天</p><p>  return first; </p><p><b>  } </b></p><

67、;p><b>  }</b></p><p><b>  6.課程設(shè)計(jì)體會(huì)</b></p><p>  通過這次課程設(shè)計(jì),我明白了編寫程序,不僅要求對(duì)課本知識(shí)有較深刻的了解,同時(shí)要求程序設(shè)計(jì)者有較強(qiáng)的思維和動(dòng)手能力。還要熟悉常用的編程技巧和編程思想,不能只關(guān)心程序的運(yùn)行結(jié)果,更要注重程序代碼的結(jié)構(gòu),編程者更要有嚴(yán)謹(jǐn)?shù)貞B(tài)度。還有通過設(shè)計(jì)過程中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論