Java 程式設計(一)  第 四章 順序與分歧流程  上一頁    下一頁

 

4-5 if/else 敘述與 Random 亂數產生

內容:

  • 4-5-1 if/else 敘述流程

  • 4-5-2 好用的 Random 類別

  • 4-5-3 範例研討:乘法練習系統

  • 4-5-4 自我挑戰:擲骰子遊戲

  • 4-5-5 自我挑戰:電影院售票系統

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)num2num3),並計算其總合(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 程式設計(一) 含程式邏輯

 

 

翻轉電子書系列: