Java 程式設計()  第三章 二維陣列  上一頁    

 

3-3 專題研討

內容:

  • 3-3-1 自我挑戰:列印直式唐詩

  • 3-3-2 自我挑戰:大樂透對獎系統

3-3-1 自我挑戰:列印直式唐詩

A)程式功能:PM3_4.java

請製作一套唐詩列印系統,功能是能將所將輸入的唐詩(五言四句),分別以橫式與直式印出。期望操作介面如下:

G:\Examples\chap7>java PM3_4

== 五言四句唐詩 列印 ==

請輸入第 1 (五個字) =>山中相送罷

請輸入第 2 (五個字) =>日幕掩柒扉

請輸入第 3 (五個字) =>春草明年綠

請輸入第 4 (五個字) =>王孫歸不歸

 

== 橫式列印唐詩 ==

       

       

       

       

 

== 直式列印唐詩 ==

     

     

     

     

     

B)製作技巧提示:

本系統需要二維陣列(poem[][];),將詩句裡每一個文字儲存於陣列的元素裡,才可分別以橫式或直式印出。其中包含兩困難點,一者是如何將一串文字輸入,分別取出每一個文字,再存入陣列元素內;另一者是如何轉換陣列的行與列印出(直式列印)。前者,吾人將一串文字直接讀入系統並存放某字串變數(data)內(利用 Scanner 物件),再將該變數宣告成掃瞄物件(Scanner 物件)並指定分隔符號為沒有空格(useDelimiter("")),接著即可掃瞄取出每一個文字,再分別存入陣列內,如圖 3-4 所示。

3-4 poem[][] 陣列儲存內容

唐詩內所有文字都依序存入陣列後。原先是依照一行接一行填入文字,如果一行接一行印出,則如同輸入格式一樣是橫式輸出;如果將行與列倒過來印,則是直式輸出。虛擬碼提示如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

導入相關套件(java.util.Scanner);

宣告唐詩陣列(String[][] poem = new String[4][5]);

讀入五言四句唐詩:

        for(int i=0; i<4; i++) {

             System.out.printf("請輸入第 %d (五個字) =>", i+1);

             data = keyin.next();

             Scanner s = new Scanner(data).useDelimiter("");

             for(int j=0; j<5; j++)       // 分別讀取詩句中每一個文字

                poem[i][j] = s.next();

        }

列印橫式唐詩:

        for(int i=0; i<4; i++) {           // 列印 4

            for(int j=0; j<5; j++)        // 每行 5 個字

                System.out.printf("%s  ", poem[i][j]);

            System.out.printf("\n");

        }

列印直式唐詩:

        for(int j=0; j<5; j++) {            // 列印 5

            for(int i=0; i<4; i++)         // 每行 4 個字

                System.out.printf("%s  ", poem[i][j]);

            System.out.printf("\n");

        }

3-3-2 自我挑戰:大樂透對獎系統

A)程式功能:PM3_5.java

許多客戶買了大樂透彩券,一直不瞭解開獎辦法,再說彩券購買太多的話,每次對獎都要花費許多時間。彩券公司為了方便客戶對獎,於是在網路上公布一套對獎系統,客戶可輸入當期開獎號碼,或觀察當期號碼,也可輸入所購買號碼,系統會告知是否得獎,或簽中哪一獎,大樂透開獎辦法是:利用氣球吹出 6 1~ 49 之間不重複的號碼,另外多一個特別號;中獎種類有:

中獎獎項

開獎辦法

頭講

六個號碼相同者。

貳獎

簽中五個號碼與特別號。

參獎

簽中五個號碼。

肆獎

簽中四個號碼與特別號。

伍獎

簽中四個號碼。

陸獎

簽中三個號碼與特別號。

普獎

簽中三個號碼。

(1)期望操作介面上有 4 個選項功能如下:

D:\Java2_book\chap3>java PM3_5

 

== 歡迎光臨  六合彩對獎系統 ==

(1) 輸入開獎號碼 (2) 顯示開獎號碼

(3) 輸入對獎號碼 (4) 離開系統

         請選擇工作項目 =>

(2)選擇輸入開獎號碼(選擇 1)操作如下:

== 歡迎光臨  六合彩對獎系統 ==

(1) 輸入開獎號碼 (2) 顯示開獎號碼

(3) 輸入對獎號碼 (4) 離開系統

         請選擇工作項目 =>1

請輸入 6 個開獎號碼 =>11 22 27 29 35 40

請輸入特別號碼 =>39

(3)選擇顯示開獎號碼(選擇 2)的操作如下:

== 歡迎光臨  六合彩對獎系統 ==

(1) 輸入開獎號碼 (2) 顯示開獎號碼

(3) 輸入對獎號碼 (4) 離開系統

         請選擇工作項目 =>2

本期開獎號碼: 11 22 27 29 35 40

特別號: 39

(4)選擇輸入對獎號碼(選擇 3)的操作如下:

== 歡迎光臨  六合彩對獎系統 ==

(1) 輸入開獎號碼 (2) 顯示開獎號碼

(3) 輸入對獎號碼 (4) 離開系統

         請選擇工作項目 =>3

請輸入 6 個對獎號碼 =>11 15 18 22 27 40

4 個對中號碼:11  22  27  40

恭喜您, 伍獎

B)製作技巧提示:

吾人將開獎號碼(spaNum[])、特別號(special)、與中獎號碼(winNum[])的陣列、特別號(wining)、以及中獎數目(winSpa)宣告成靜態變數,再利用 4 個函數(方法)來製作整個系統。

3-5 PM3_5 程式架構

虛擬碼提示如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

宣告開獎號碼、特別號變數(static int spaNum[], special;);

宣告中獎號碼、特別號與數目(static int winNum[], wining, winSpa;);

主方法範圍(main()):{

宣告對獎號碼陣列(int[] num = new int[6];);

顯示及讀入工作項目(select);

while (select !=4) {

switch(select) {

case 1:

讀入六個開獎號碼(spaNum[0], .. spaNum[5]);

讀入特別號(special);

case 2:

顯示開獎號碼(spa_disp());

case 3:

讀入六個對獎號碼(num[]

                    /* 對獎程式 */

                     wining = 0; winSpa=0; int k=0;

                     for(int i=0; i<6; i++) {      // 6 個對獎號碼

                         for(int j=0; j<6; j++) {   // 6 個開獎號碼

                              if(num[i] == spaNum[j]) {

                                  winNum[k] = num[i]; // 存入中獎陣列

                                  wining = wining+1;  // 累增中獎數

                                  k = k+1;

                              }

                         }

                         if(num[i] == special)      // 1 個特別號

                             winSpa = num[i];

                     }

                     /* 比對對獎數目

                     switch(wining) {

                          case 0:

顯示全沒簽中;

                          case 1:

呼叫顯示中獎號碼(win_disp()

顯示沒有簽中;

                          case 2:

呼叫顯示中獎號碼(win_disp()

顯示沒有簽中;

                          case 3:

呼叫顯示中獎號碼(win_disp()

if (winSpa == 0)

顯示簽中普獎;

else {

顯示簽中陸獎;

                          case 4:

呼叫顯示中獎號碼(win_disp()

if (winSpa == 0)

顯示簽中伍獎;

else {

顯示簽中肆獎;

                           case 5:

呼叫顯示中獎號碼(win_disp()

if (winSpa == 0)

顯示簽中參獎;

else

顯示中貳獎;

                            case 6

呼叫顯示中獎號碼(win_disp());

顯示簽中頭講;

}

 default:

顯示錯誤輸入, 請重新選擇;

}

顯示及讀入工作項目(select);

}

}

宣告顯示工作項目方法(static void disp_menu());

宣告顯示開獎號碼及特別號方法(static void spa_disp());

宣告顯示中獎號碼及特別號方法(static void win_disp());

(C) 重點說明:

(1) 行號 29 ~ 59:判斷是否中獎的 switch(){…} 範圍。

(2) 行號 7 ~ 64:主選單 switch() {…} 範圍

翻轉工作室:粘添壽

 

Java 程式設計(二) 含物件導向

 

 

翻轉電子書系列: