每一單元教材及投影片目錄 : 0. 教學目標 : 亂數與數學類別使用 1. 前言 : 學會 Random 函數使用 開根號函式 絕對值函式 次方數函式類別介紹 : A. 類別宣告方式 class 類別名稱 { } 類別宣告的關鍵字為 class 關鍵字 class 後面則擺放類別名稱 { } 內則為該類別之定義 B. 類別中的定義可包含 變數 (variable) 函數 (function) 建構元 (constructor) 特殊函數 建構元可幫助新建立的物件設定初始值 建構元名稱須與所屬類別名稱相同 建構元不能有回傳值, 且建構元定義時不使用關鍵字 void 建構元可多載 C. 類別宣告
程式解析 行數 解析 2 使用關鍵字 class 定義類別, 本類別名稱為 CCircle 3 宣告變數 radius 的資料形態為 double 5-7 1. 宣告 CCircle 類別之建構元 2. CCircle( ), 此建構元之使用不用傳入引數 3. 將 radius 之值設為 2.7 9-12 1. 宣告 CCircle 類別之建構元 2. CCircle(double r), 此建構元之使用須傳入資料形態為倍精度浮點數之引數 3. 將傳入建構元的引數值設給 r 變數 4. 再將 r 變數的值設給 radius 變數 14-17 1. 宣告函數, 函數名稱為 show 2. show( ), 顯示此函數之使用不用傳入引數 3. 此函數印出變數 radius 的值 多載指同一類別中, 具有一個以上的建構元, 建構元名稱相同, 但傳入之引數 (1) 可個數相同但資料形態度同或 (2) 傳入之引數 個數不同 D. 類別使用
程式解析 行數 解析 23 1. 等號右邊 : 呼叫建構元 CCircle( ) 對屬於 CCircle 類別的物件設定初值 本例子將變數 radius 值設為 2.7 2. 等號左邊 : 將設定好初值之物件, 存放屬於 CCircle 類別之變數 cc1 中 3. cc1 被視為儲存 CCircle 類別之物件變數 24 1. 呼叫 cc1 物件中的 show 函數使用 2. show 函數功能為印出變數 radius 的值 3. 輸出結果為 radius=2.7 26 1. 等號右邊 : 呼叫建構元 CCircle(double r) 對屬於 CCircle 類別的物件設定初值 本例子將建構元中的變數 r 值設為 3.8, 再將變數 radius 值設為 r 2. 等號左邊 : 將設定好初值之物件, 存放屬於 CCircle 類別之變數 cc2 中 3. cc2 被視為儲存 CCircle 類別之物件變數 27 1. 呼叫 cc2 物件中的 show 函數使用
輸出結果 2. show 函數功能為印出變數 radius 的值 3. 輸出結果為 radius=3.8 E. 定義好之類別引用 有許多類別已經被 Java 程式設計師所撰寫完成, 因此 Java 把 功能相近的類別歸類到相近的類別庫中, 一旦要引用某類別庫 中的類別, 只要匯入該類別即可 類別引用語法 import java.util.scanner; import: 引用的關鍵字 java.util.scanner: 被引用的類別 2. 題目 : 亂數選號程式題目說明 : 請設計一樂透亂數選號程式, 由 1~42 中選出 6 個不重覆的數字組合並輸出 請使用已下方式 : Random randnum = new Random(); randnum.setseed(23323456); setseed 就是設定亂數種子, 可以使每次跑出的亂數序列, 都會是一樣的輸入說明 : 輸入 seed 輸出說明 : 由 1~42 中選出 6 個不重覆的數字組合並輸出, 數字間請以 tab 作為間格, 最後必須有換行字元 範例 : Sample Input: Sample Output: 23323456 34 40 41 18 24 33
解題邏輯 : a. 考慮需使用到的類別甲 鍵盤輸入值 :Scanner 類別乙 亂數產生 :Random 類別 b. 輸入整數值作為亂數的 seed c. 隨機產生 6 個介於 1~42 之間的整數甲 使用 for 迴圈執行六次亂數取值乙 利用亂數物件中的 nextint( ) 函數, 產生 1~42 之間的值程式碼 : 程式解析 : 行數 解析 1-3 多行注釋 6 引用 Random 類別 7 引用 Scanner 類別 10 建構物件設給物件變數 1. 等號右邊 : 呼叫建構元 Scanner( ) 2. 等號左邊 : 將建構好之物件, 存放屬於 Scanner 類 別之變數 scn 中 3. scn 被視為儲存 Scanner 類別之物件變數 11 宣告整數變數 seed 與 i 12 螢幕輸出, 提醒使用者從鍵盤輸入亂數 seed 值
13 等號右邊 : 使用物件 scn 中的 nextint( ) 函數, 將鍵盤中輸入的整數設給等號左邊的變數 seed 14 印出 seed 變數中的值於螢幕上 16 建構物件設給物件變數 1. 等號右邊 : 呼叫建構元 Random( ) 2. 等號左邊 : 將建構好之物件, 存放屬於 Random 類別之變數 rand 中 3. rand 被視為儲存 Random 類別之物件變數 17 使用物件 rand 中 setseed( ) 函數, 將變數 seed 值設為亂數種子 19-21 for 迴圈的使用 19 行 :for 迴圈執行條件設訂 20 行 :rand.nextint(42) 使用物件 rand 中 nextint( ) 函數, 將小括號中的值設為 42, 則會隨機產生 0-41 之間的整數值 故須把 rand.nextint(42)+1, 則產生出的亂數則介於 1-42 之間 變數間須用 tab 鍵隔開, 故須印出 \t 22 印出程式結束後的換行符號 3. 題目 : 電腦猜數字 ( 時間限制兩秒 ) 題目說明 : 設計一猜數字程式, 由電腦隨機產生一亂數 (1~100) 讓使用者來猜 每猜一次程式必須回應使用者 < 答對 > < 太大 > 或 < 太小 >, 一直到猜對才結束程式 Random randnum = new Random(); randnum.setseed(23323456); setseed 就是設定亂數種子, 可以使每次跑出的亂數序列, 都會是一樣的輸入說明 : 輸入 seed 及輸入猜測數字 (1~100) 輸出說明 : 輸出判斷結果, 直到數字正確 (true) 為止, 最後必須有換行字元 答對輸出 true 太小輸出 small 太大輸出 big
範例 : Sample Input: 23323456 10 13 11 1723 21 Sample Output: small big true true 6101 small 88 true 95 解題邏輯 : a. 考慮需使用到的類別甲 鍵盤輸入值 : 鍵盤中輸入 seed 與猜數字 Scanner 類別乙 亂數產生 : 隨機產生 1-100 間的整數值為答案 Random 類別 b. 輸入整數值作為亂數的 seed c. 隨機產生介於 1~100 間的整數作為答案 d. 使用迴圈, 讓使用者可多次輸入猜測值, 直到猜測值與答案相同 e. 使用者輸入 1~100 間的整數值並與正確答案作比較甲 輸入值 < 正確答案 : 輸出 small 乙 輸入值 > 正確答案 : 輸出 big 丙 輸入值 == 正確答案 : 輸出 true+ 換行符號程式碼 :
程式解析 : 行數解析 1-3 多行注釋 4 引用 Random 類別 5 引用 Scanner 類別 9 建構物件設給物件變數 4. 等號右邊 : 呼叫建構元 Scanner( ) 5. 等號左邊 : 將建構好之物件, 存放屬於 Scanner 類別之變數 scn 中 6. scn 被視為儲存 Scanner 類別之物件變數 10 宣告整數變數 seed,answer 與 guess seed 變數 : 儲存使用者設定之亂數種子 answer 變數 : 儲存隨機產生之 1~100 間數值 guess 變數 : 儲存使用者猜測之數值 11 螢幕輸出, 提醒使用者從鍵盤輸入亂數 seed 值
12 等號右邊 : 使用物件 scn 中的 nextint( ) 函數, 將鍵盤中輸入的整數設給等號左邊的變數 seed 13 建構物件設給物件變數 4. 等號右邊 : 呼叫建構元 Random( ) 5. 等號左邊 : 將建構好之物件, 存放屬於 Random 類別之變數 rand 中 6. rand 被視為儲存 Random 類別之物件變數 14 使用物件 rand 中 setseed( ) 函數, 將變數 seed 值設為亂數種子 15 等號右邊 : 隨機產生 1~100 間的數值並設給等號左邊的 answer 變數 29-29 do{ }while( ) 迴圈的使用 : 先執行迴圈內容一次, 再於 while 處判斷迴圈條件是否為 true( 猜的值與答案不一致 ) 繼續執行, 或 false( 猜的值與答案一致 ) 停止執行 16 行 :do 迴圈的起始處 17 行 : 提醒使用者猜測 1~100 間的數值 18 行 : 等號右邊 : 將猜測出來的數值設給 guess 變數 19 行 : 判斷 guess 的值是否大於 answer, 若為 true, 則於 20 行印出 big, 讓使用者知道猜測的值大於答案 22 行 : 判斷 guess 的值是否小於 answer, 若為 true, 則於 23 行印出 small, 讓使用者知道猜測的值小於答案 25 行 : 判斷 guess 的值是否等於 answer, 若為 true, 則於 26 行印出 true, 讓使用者知道猜對了 29 行 :while(guess!=answer); while 處判斷迴圈條件是否為 true true( 猜的值與答案不一致 ): 程式碼繼續從第 16 行開始執行 false( 猜的值與答案一致 ): 程式碼則繼續從第 8 行開始執行, 進行下一輪的 seed 值 answer 值的產生與使用者重新猜測數值
5. 作業一 : 比大小題目說明 : 設計一猜大小程式, 使用者須輸入進行 n 次比大小活動, 再由電腦隨機產生 n 個亂數 (2~49), 每個亂數搭配隨機產生 0 或 1 的值以決定該數字是要比大或比小 (0 代表比小 1 代表比大 ), 讓使用者來猜 每猜一次 ( 猜測數值介於 1~50) 必須回應使用者猜測值 x( 大於 等於或小於 ) 亂數 :< 猜對 > 或 < 猜錯 >, 一直到 n 個亂數猜完為止 Random randnum = new Random(); randnum.setseed(23323456); setseed 就是設定亂數種子, 可以使每次跑出的亂數序列, 都會是一樣的輸入說明 : 輸入 seed 及輸入猜測多少輪 (n) 比大小活動 輸出說明 : 輸出猜大小結果, 直到 n 個亂數猜完為止 每輪猜對輸出 true 猜錯輸出 false 總結猜了 n 次, 猜對 y 次, 猜對率為 y/n*100% 範例 : Sample Input: seed>23323456 n>3 guess 1 >17 guess 2 >33 guess 3 >50 Sample Output: Round1:34 17<34: 猜對 Round2:40 33<40: 猜錯 Round3:41 50>41: 猜對 ============ 共猜了 3 次, 猜對 2 次猜對率為 66.7% 6. 作業二 : 終極密碼題目說明 : 設計一猜密碼遊戲, 一開始使用者須猜測介於 1~100 之間的數值, 電腦回應所猜測的數值是否正確, 若正確即猜對 ; 若不正確, 電腦會回應密碼介於多少之間, 再由使用者從當中猜測數值, 直到猜對為止 Random randnum = new Random();
randnum.setseed(23323456); setseed 就是設定亂數種子, 可以使每次跑出的亂數序列, 都會是一樣的輸入說明 : 輸入 seed 及輸入猜測於一定範圍內的數值 輸出說明 : 輸出猜大小結果, 直到猜測數值正確為止 第一次猜測的值介於 1~100 之間 猜對 : 遊戲結束 猜錯 : 電腦回應猜測數值介於一定範圍內 若猜測的值沒有介於該範圍內, 提醒使用者輸入值介於該範圍內, 再次輸入 範例 : Sample Input: seed>23323456 guess>3 guess>50 guess>60 guess>11 guess>10 Sample Output: Remind:3~100 之間 Remind:3~50 之間 Remind: 請輸入 3~50 之間的數值 Remind:3~11 之間 Bingo 猜對了