PLWeb-Java-Examples

From YuntechWiki

Jump to: navigation, search

PLWeb 上 Java 的練習範例

Contents

PLWeb 簡介

PLWeb 是一個幫助程式語言的學習者,有效的使用「動手實做」的學習方法而開發出來的學習平台。教師可以使用 PLWeb 設計一系列的程式設計練習,而學生也可以下載包含這些程式設計練習的編輯器,方便的完成程式的撰寫、提問、測試及繳交等支援學習的程序。一個 PLWeb 的課程包含數個教學單元,每個單元均由數個在難度上逐漸遞增的程式設計練習所組成。在完成這些練習題之後,學生便可以感受到學習的成效。

PLWeb 上的練習題有以下幾種,這幾種題目都可以在登入後,以下載的編輯器完成:

  1. 是非選擇題:這些題目取材自 wiki.plweb.org 上的教材。其目的是提醒學生閱讀教材,並確認學生對教材有一定的瞭解之後,才進行程式的撰寫。
  2. 除錯題:這種題目可以讓學習者練習除錯。
  3. 程式碼填空題:將一個完整程式的重要部分挖空,使學生在練習時,可以專注在重點,以加快學習的速度。
  4. 預測答案題:這部分的題目會讓學習者,預測一個程式在執行過程中的輸出,以確認學習者,對程式中的語意是否確實瞭解。
  5. 程式撰寫題:這部分的題目,會針對某一單元(例如:迴圈),撰寫一個完整的程式。
  6. 綜合應用題組:每一個綜合應用題組,包含幾個小題。這些小題以逐步增加功能的方式,協力完成一個約 200 行程式碼的綜合應用。

以上的題組與 TQC+ Java 認證考試的題組,以適合學習的方式混合,讓學習者以「動手實作,邊寫邊學」的方式,扎扎實實的學習程式設計。

以下是這些練習題的範例:

是非選擇題

  • 請參考下面的程式,回答以下的問題。本題為針對教材內容所做之測驗,旨在檢測您是否已閱讀教材內容並且了解。這些的測驗可幫助您了解重要之觀念,以利進行後續的練習題。
1 class Market{    
2   static int sEgg = 5, sFruit = 20;    
3   static int getMoney(int nEgg, int nFruit) {        
4     return sEgg * nEgg + sFruit * nFruit;
5   }    
6   int getMoney() {
7     return sEgg + sFruit;
8   }
9 }
  • 第 2 行的程式為何種的宣告方式:
    1. 類別變數
    2. 實例變數
    3. 類別方法
    4. 實例方法
  • 第 6 行的程式為何種的宣告方式:
    1. 類別變數
    2. 實例變數
    3. 類別方法
    4. 實例方法

除錯題

  • 請改正以下的程式的語法錯誤:
public class Good {
  public static main (String args[]) {
    System.out.println(I love Java!);
    System.out.println("Java is so good!")
  }
}

程式碼填空題

  • 請使用 if 撰寫一個類別方法,這個方法傳入兩個 boolean 值:b1, b2,並回傳一個 boolean 值,這個 boolean 等於 (b1 && b2) 的值。
public class AndToIf {
public static void main(String args[]) {
System.out.println(andToIf(true, true));
System.out.println(andToIf(true, false));
System.out.println(andToIf(false, true));
System.out.println(andToIf(false, false));
}
 
static boolean andToIf(boolean b1, boolean b2) {
if (b1)
____________;
else
return _____;
}
}

預測答案題

  • 請在下邊程式碼中的______處填入正確的答案,使得執行此程式後傳回 4 個 true。
class GrandParent {
String eyes() {
return "blue";
}
String test1() {
return this.eyes();
}
}
 
class Parent extends GrandParent{
String eyes() {
return "green";
}
String test2() {
return super.eyes();
}
}
 
public class Generation {
public static void main(String args[]) {
GrandParent gail = new GrandParent();
Parent sue = new Parent();
System.out.println(gail.eyes().equals("____"));
System.out.println(gail.test1().equals("____"));
System.out.println(sue.eyes().equals("____"));
System.out.println(sue.test2().equals("____"));
}
}

程式撰寫題

  • 請寫一個程式持續輸入一個數 n,使用遞迴計算 n 的階乘,直到輸入999為止。
import java.util.Scanner;
public class Factorial {
static Scanner keyboard = new Scanner(System.in);
public static void main(String args[]) {
int num1;
System.out.print("Input n: ");
num1 = keyboard.nextInt();
while (num1 != 999) {
System.out.printf("%d 的階乘 = %d\n", num1, fac(num1));
System.out.print("Input n: ");
num1 = keyboard.nextInt();
}
}
 
static int fac(int n) {
if(n == 0) {
return 1;
} else {
return (n * fac(n - 1));
}
}
}

綜合練習題組

  1. 請以避免在不同類別中重複寫相同的程式碼的方式,為某校資訊管理系(MIS)設計其學生成績資訊系統。 MIS 有 IT 與 IM 兩個學程。MIS 學生的共同必修課為 chi, eng。 IT 的選修課有:pl, db, ds;IM 的選修課有:econ, acct。
    • 學生總平均成績的計算公式是:
    必修課的平均成績 * 0.4 + 選修課的平均成績 * 0.6
    • 請 new 兩位學生的資料並計算其「選修課的平均成績」及「總平均成績」。
  2. 該系決議另行增加一個ITM學程,ITM的學生除了要修IT的課之外,另外還需要修 acct 一門課。
    • ITM學生總平均成績的計算公式是:
    必修課的平均成績 * 0.4 + IT 課程的平均成績 * 0.4 + acct * 0.2
    • ITM學生選修課平均成績的計算公式是:
    (IT 課程的平均成績 + acct) / 2
    • 請 new 一位 ITM 的學生,並計算其「選修課平均成績」及「總平均成績」。
  3. 請以類別變數累計學生人數,並呼叫一個方法傳回該系的學生人數。
  4. 請使用 HashMap 為該系設計一 MISClass 類別。一個 MISClass 的實例即代表一個班級,並且有 put, list 兩個方法: put 可以加入一名學生;list 可以印出該班所有學生的名字及平均成績。
  5. 請使用例外處理將該班學生平均成績大於 100 (資料錯誤)之學生的名字前增印兩個星號(**),並結束程式。

PLWeb 決定程式是否寫完的方式

由於要自動的判斷任一程式是否有錯,是一個 unsolveable 的問題,所以 PLWeb 不會嘗試以任何的方式,判斷學習者的程式是否有邏輯上的錯誤。相反的,PLWeb 僅僅以學習者的程式所產生的螢幕輸出字元,與標準答案的螢幕輸出字元逐字比對,如果完全一致,則判斷學習者完成了這個程式。

當然一位學習者可以只使用 printf 之類的輸出指令,騙過 PLWeb 的檢查程式。然而,這樣的方式對學習者在學習上全無幫助。此外,如果學校的考試或證照考試是以上機實作的方式進行,我們便可以相信 PLWeb 的使用者會自動的寫完應該完成的程式,以提昇自己的程式設計能力。因為唯有如此,才有可能通過考試。

由於 PLWeb 是以逐字檢查的方式比對螢幕輸出的字元,所以有時漏掉一個「空白」仍會被檢查為尚未完成。這樣是有點不太方便,但是為了讓 PLWeb 與使用者,都明確的知道檢查的規則,所以我們並沒有採用「跳掉空白」之類的模糊比對方式,如此使用者在看到 PLWeb 編輯器所給的字元比對錯誤的位置時,便可以方便的改正這個錯誤。

Personal tools