|
4-5 if/else 敘述與 Random 亂數產生
內容:
4-5-1 if/else 敘述流程
if/else 敘述句的特點是條件成立與否,都需各自執行所屬的敘述區塊,『yes body』或『else body』。圖 4-3 為 if/else 敘述的流程圖;程式進入該敘述後,首先判斷條件是否成立,成立的話則執行『 Yes』實體(yes body)敘述區塊;否則執行『else』 實體(else body)敘述區塊。分別執行完敘述區塊後,立即離開 if/else 敘述句。另一個重點是,如果區塊內僅有一行敘述句的話,則左右大掛號({ …})可以省略。if/else 敘述的語法與範例如下:
圖 4-3 if/else 敘述的流程圖
if/else
敘述語法: |
範例: |
if (條件判斷)
{ //(Yes
body)
Statement 1;
…
}
else { //(Else
body)
Statement 1;
….
} |
if (value1 == value2) {
System.out.printf("答對了
您好棒
!!");
…
}
else {
System.out.printf("答錯了
加油!!\n");
….
} |
4-5-2 好用的 Random 類別
亂數的應用很多,賭場裡看得到的賭具多半與亂數有關,台灣從早期的瘋狂大家樂到現在合法的樂透彩也都是亂數的應用。
既然亂數是一種不可計算的數,它又如何能被設計?所以在數學上所產生的亂數也只能算是虛擬亂數,也就是自然界根本不存在真正的亂數,當然若產生的亂數已超過能歸納的規則,我們也可以將它視之為「真正的亂數」。在 Java 中,有一個專門產生亂數的類別—Random類別,它是 java.util 套件中的一個類別,所以使用上,除了要匯入 java.util.Random(或 java.util.*) 外,還要產生物件才可以使用,語法如下:
import java.util.*;
…..
Random random = new Random();
int ran1 = random.nextInt(9);
…… |
上述語法說明如下:
-
import java.util.*:表示導入 java.util 套件下所有類別,其中也包含 Random 類別。
-
Random random = new Random:宣告產生一個 Random 類別的物件,其名稱為 random(如同 int a 的功能)。接者再產生 Random 類別的屬性(new Random),並填入 random 物件變數內(如同 int a = 3 之功能)。
-
random.nextInt(n):此語法為 random 物件的 nextInt() 方法。執行nextInt(n) 方法,將會產生一個由 0 ~ n-1 的亂數;如沒有指定範圍(nextInt()),則產生整數亂數的範圍介於 –2147483468 ~ 2147483647。然而 nextInt(10),則隨機產生 0 ~ 9 之間一個數值。
-
Ramdom 其他方法:
nextDouble()
|
產生 0.0 ~ 1.0 之間雙倍浮點數 |
nextFloat()
|
產生 0.0 ~ 1.0 之間的浮點數 |
setSeed(long seed) |
設定亂數種子為 seed |
nextInt(int n)
|
產生 0 ~ n 之間的整數 |
4-5-3 範例探討:乘法練習系統
(A)程式功能:Ex4_3.java
請製作一套九九乘法練習系統,系統會隨機出現兩個 1 ~9 的整數,學生將兩值相乘的值輸入,如果正確則系統會出現『您好棒 !!』;否則出現則出現正確答案,並出現『答錯了, 還要多努力哦 !!』。期望系統操作介面如下:
期望系統操作介面如下:
輸入正確答案的結果如下:
請輸入
6 * 3 =18
答對了
您好棒
!!
輸入錯誤答案的結果如下:
請輸入
5 * 7 =42
答錯了
正確答案是
35
多加油哦
!! |
(B)製作技巧研討:
系統要求隨機產生兩個介於1 ~ 9 之間的整數相乘,因此需利用亂數產生器(Random)來達成,系統相乘的結果與使用者輸入兩者相比較,如相同則表示使用者正確,否則不正確。
(C)程式範例:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22 |
// Ex4_3.java
import
java.util.*;
public
class
Ex4_3 {
public
static
void
main(String
args[])
{
Scanner
keyin
=
new
Scanner(System.in);
Random
random
=
new
Random();
int
ran1
= 1 +
random.nextInt(9);
int
ran2
= 1 +
random.nextInt(9);
int
value1
=
ran1
*
ran2;
System.out.printf("請輸入
%d * %d =",
ran1,
ran2);
int
value2
=
keyin.nextInt();
if
(value1
==
value2)
{
System.out.printf("答對了
您好棒
!!");
}
else
{
System.out.printf("答錯了
正確答案是
%d
多加油哦
!!\n",
value1);
}
}
} |
(D)程式重點說明:
-
第 3
行:『import java.io.*;』。導入輸入套件(InputStreamReader()、BufferedReader())。
-
第 4
行:『import java.util.*;』。導入公用程式套件,其中包含 Random 類別。
-
第 9
行:『Random random = new Random();』。利用 Random 類別產生一個名稱為 random 的隨機亂數物件。
-
第 10
行:『int ran1 = 1 + random.nextInt(9);』。宣告產生整數變數 ran1。利用亂數物件(random)的整數產生方法,產生一個介於 0 ~ 8 之間的整數(nextInt(9)),再加 1,則成為 1 ~ 9 之間的隨機亂數,最後將其結果存入 ran1 變數內。
-
第 17~22
行:『if (value1 == value2) { ….} else { ….}』。此為 if/else 敘述句,如果條件成立的話(value1 == value2),則執行 if 實體(if body,列印 "答對了 …"),否則執行 else 實體(else body,列印 "答錯了 …")。
4-5-4 自我挑戰:擲骰子遊戲
(A)系統功能:PM4_3.java
許多博奕或遊戲方法,都利用擲骰子決定優先順序。請製作一套擲骰子工具,每一個骰子有 6 面(1 ~ 6),每次擲三個骰子。系統會要求擲骰子的人輸入姓名,擲完取得點數記錄,再由對賭的人輸入姓名後擲點,由系統判斷哪一個人贏了此局。期望系統操作介面如下:
請輸入第一個玩家的姓名(開始擲骰子) =>張惠妹
張惠妹
先生/小姐擲骰子是 3 1 4
合計 = 8
請輸入第二個玩家的姓名(開始擲骰子) =>蔡依玲
蔡依玲
先生/小姐擲骰子是 5 4 1
合計 = 10
恭喜
蔡依玲
先生/小姐贏了此局
|
(B)製作技巧提示:
當系統執行讀取命令時(如,user1 = keyin.readLine()),系統會等待輸入,一直到使用者由鍵盤輸入相關資料,並以『Enter』 鍵表示輸入結束,此時系統才會讀取資料並繼續執行其他命令。本範例就是利用這個特性來啟動亂數產生;即是系統要求輸入姓名後,再執行亂數產生器(num1 = 1 + random.nextInt(6)、num2、num3),並計算其總合(sum1 = num1 + num2 + num3);第二個玩家也以相同方法輸入(sum2 = num1 + num2 + num3)。最後比較誰擲的較大(sum1 >= sum2)。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
….
/*
第一個玩家擲骰子
*/
System.out.printf("\n請輸入第一個玩家的姓名(開始擲骰子)
=>");
user1 =
keyin.readLine();
num1 = 1 +
random.nextInt(6);
num2 = 1 +
random.nextInt(6);
num3 = 1 +
random.nextInt(6);
sum1 = num1
+ num2 + num3;
System.out.printf("%s
先生/小姐擲骰子是
%d %d %d
合計
= %d\n",
user1, num1, num2, num3, sum1);
/*
第二個玩家擲骰子
*/
System.out.printf("\n請輸入第二個玩家的姓名(開始擲骰子)
=>");
……
sum2 = num1
+ num2 + num3;
…..
/*
兩玩家的骰子,
比較誰大
*/
if (sum1 >=
sum2)
System.out.printf("\n恭喜
%s
先生/小姐贏了此局\n",
user1);
else
System.out.printf("\n恭喜
%s 先生/小姐贏了此局\n",
user2);
…. |
4-5-5 自我挑戰:電影院售票系統
(A)系統功能:PM4_4.java
請製作一套電影院的售票系統,系統會詢問客戶欲購買全票(250 元)、優待票(200 元)與半票(150 元)的數量;隨之輸入客戶所繳納的金額。如果繳納金額大於購票金額的話,則輸出應找零錢(500 元、100 元、50 元與 10 元)的數量;如果不夠則告知客戶,金錢不足請下次再來。期望操作介面如下:
繳納金額足夠的結果如下:
購買全票張數 (250元) =>3
購買優待票張數 (200元) =>2
購買半票張數 (150元) =>2
請輸入客戶繳納金額 =>2000
全票 3,
優待票 2,
半票 2
總計 1450
元,
客戶繳納 2000
元
應找金額 = 550
各種零錢數量如下:
100
元零錢 = 5
張
50
元硬幣 = 1
個
10
元硬幣 = 0
個
5
元硬幣 = 0
個
1
元硬幣 = 0
個
繳納金額不足的結果如下:
購買全票張數 (250元) =>6
購買優待票張數 (200元) =>2
購買半票張數 (150元) =>2
請輸入客戶繳納金額 =>1000
總計 2200,
繳納金額 1000
金額不足請下次再來,
謝謝 !!
|
(B)製作技巧提示:
本系統與 3-3-3 節的範例(Ex3_3.java)大同小異,僅增加讀入客戶購票張數,以及計算總金額多寡。吾人可利用『虛擬碼』(Pseudo Code)規劃程式大綱如下:
宣告輸入物件;
宣告相關變數;
顯示全票票價(250 元)並讀入購買張數;
顯示優待票票價(200 元)並讀入購買張數;
顯示半票票價(150 元)並讀入購買張數;
計算購買總計金額;
要求輸入客戶繳納金額,並讀取;
計算應找金額多寡;
if (應找金額 >= 0) {
計算各零錢數量;
輸出客戶購買各種票的數量;
輸出總計,以及客戶繳納金額;
輸出應找金額,以及各零錢的數量;
}
else {
輸出總計,以及客戶繳納金額;
輸出 “歡迎下次再來”;
} |
|
翻轉工作室:粘添壽
Java 程式設計(一) 含程式邏輯
翻轉電子書系列:
|