Java 程式設計(一)  第 七章 陣列  上一頁    下一頁

 

7-4 陣列線性搜尋

內容:

  • 7-4-1 線性搜尋演算法

  • 7-4-2 範例研討:實現線性搜尋法

  • 7-4-3 範例研討:大樂透電腦選號

  • 7-4-4 自我挑戰:最高與最低成績者

  • 7-4-5 自我挑戰:成績查詢系統

7-4-1 線性搜尋演算法

從陣列內尋找某一筆資料,最簡單的方法是線性搜尋法;演算法是由陣列的起頭開始比較尋找(比較內容),如搜尋到則立即停止,否則繼續往下一個元素尋找,一直到陣列結束為止,如圖 7-5 所示。線性演算法所處理的陣列不需要特殊處理(如由大到小排列),最佳狀況是第一筆資料就找到;最差狀態是最後一筆資料才搜尋到。

7-9 線性搜尋法的運作

7-4-2 範例研討:實現線性搜尋法

  • 程式功能:Ex7_6.java

吾人利用 num[] 陣列儲存 10 個整數,輸入一個整數來查詢是否在 num  內,再顯示其執行結果,如下:

num[] = 20   13   45   24   42   34   22   89   19   70  

請輸入一個數值 =>17

17 不在 num 陣列內

num[] = 20   13   45   24   42   34   22   89   19   70  

請輸入一個數值 =>24

24 找到了

B)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

import java.util.Scanner;

public class Ex7_6 {

    public static void main(String args[]) {

      Scanner keyin = new Scanner(System.in);

          int value, flag=0, i;              

          int[] num = {20, 13, 45, 24, 42, 34, 22, 89, 19, 70};

          System.out.printf("num[] = ");

          for (int k=0; k<10; k++)

              System.out.printf("%d   ", num[k]);

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

          System.out.printf("請輸入一個數值 =>");

          value = keyin.nextInt();

          i=0;

          while (i < 10) {

              if (value == num[i]){

                       flag = 1;

                       break;

              }

              i++;

          }

          if(flag == 1)

               System.out.printf("num[%d] = %d 找到了\n", i, value);

          else

          System.out.printf("%d 不在 num 陣列內", value);

    }

}

7-4-3 範例研討:大樂透電腦選號

A)程式功能:Ex7_7.java

請製作大樂透的電腦選號系統,系統能自動選出 6 個由 01 ~ 49 號碼,但這六個號碼都不可以重複。期望操作介面如下:

B)製作技巧研討:

編寫一個產生 6 個隨機亂數的程式並不困難,但如果要這 6 個亂數不重複的話,不加點小技巧是不行的。首先準備一個 6 個元素的陣列(int[] num = new int[6];),每次隨機選出號碼後,立即比較陣列內是否有重複號碼(之前所取的),如果沒有則加入該陣列內。第 1 次選出號碼(i=0),陣列還是空的(j=0),則幾乎不用比對;如已選出 3 個號碼,下一個選出號碼就必須比對之前 3 個號碼是否有重複,依此類推。最後再印出以選出的 6 個號碼。

(C)程式範例:

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

//Ex7_7.java

 

import java.lang.Math;

public class Ex7_7 {

    public static void main(String args[]) {

          int value, flag;                // 隨機選取號碼

          int[] num = new int[6];     // 儲存選取號碼

          int i=0;

          while (i < 6) {

              flag=0;

              value = 1 + (int)(Math.random()*46);

              for (int j=0; j<i; j++) {      // 檢視已選出的號碼

                  if (value == num[j]) {   // 是否重複

                      flag = 1;        // 重複則放棄重來

                      break;

                 }

              }

              if (flag == 0) {

                 num[i] = value;      // 沒重複則填入陣列

                 i = i+1;

              }

          }

          System.out.printf("幸運號碼是: ");

          for (i=0; i<6; i++)

              System.out.printf("%d  ", num[i]);

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

    }

}

D)程式重點分析

  • 9~16 :『while{i<6} {…}』。選出 6 個不重複號碼。

  • 11~17 :『for(int j=0; j<i; j++) { if(value == num[j])  …}』。線性搜尋敘述句。

  • 13~14 :『if(value == num[j]) continue;』。如發現號碼重複,則放棄重來。

7-4-4 自我挑戰:最高與最低成績者

A)程式功能:PM7_6.java

         數學老師利用一個二維陣列儲存某一班級學生的成績,score[][] = {{411101, 70}, {411102, 80}, {411103, 75}, {411104, 90}, {411105, 85}, {4111106, 65}, {411107, 83}, {411108, 78}}。請編寫一程式列印出該班成績最高與最低分數與姓名,期望操作介面如下:

D:\Java2_book\chap3>javac PM7_6.java

 

D:\Java2_book\chap3>java PM7_6

最高者 411104 成績= 90

最低者 411106 成績= 65

B)製作技巧提示:

二維陣列(score[][])的每行(score[i], i =0, 1, 2 .., 7)紀錄一筆學生資料,第 0 列(score[i][0])儲存學號、第 1 列(score[i][1])儲存數學成績。吾人可利用兩只一維陣列(max[] min[])儲存最高成績與最低成績,其中第 0 列(如max[0])儲存學號、第 1 列(如max[1])存放成績。圖 7-6 為搜尋運作程序,起先將最高成績的陣列設定為 0max = {0, 0});最低成績設定成超過成績界線(min = {0, 999}),再依序比較每位學生成績,如果高於 max,則該紀錄複製到 max 陣列內;如果低於 min,則複製到 min 上。如此由第 0 筆到最後一筆搜尋之後,max   min 陣列分別得到最高與最低成績的紀錄。虛擬碼提示如下:

7-11 最高與最低成績搜尋

01

02

03

04

05

06

07

08

09

10

宣告成績儲存陣列並給初值(int score[][]= {{411101, 70}, …});

宣告最高成績陣列(int max[] = {0, 0});

宣告最低成績陣列(int min[] = {0, 9999});

搜尋最高與最低成績者:

        for(int i=0; i<score.length; i++) {

             if(score[i][1] > max[1])

                  max = score[i];

             if(score[i][1] < min[1])

                  min = score[i];

        }

7-4-5 自我挑戰:成績查詢系統

A)程式功能:PM7_7.java

數學老師利用一個二維陣列儲存某一班級學生的成績,score[][] = {{411101, 70}, {411102, 80}, {411103, 75}, {411104, 90}, {411105, 85}, {4111106, 65}, {411107, 83}, {411108, 78}}。請編寫程式可允許輸入學生學號,並輸出該學生的數學成績,期望操作介面如下:

D:\Java2_book\chap3>java PM3_2

== 成績查詢系統 ==

請輸入學生學號 =>4111120

沒有學號 = 4111120 的資料

 

D:\Java2_book\chap3>java PM3_2

== 成績查詢系統 ==

請輸入學生學號 =>411103

學號 = 411103, 成績= 75

B)製作技巧提示:

利用輸入學號作為查詢關鍵,由陣列的起頭到結尾依序比較第 0 個欄位(score[i][0], i=0, 1, 2, …, score.length-1),如果相同則印出第 1 個欄位的內容(score[i][1],成績欄位);虛擬碼提示如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

宣告輸入物件(Scanner);

宣告成績儲存陣列並給初值(int score[][]= {{411101, 70}, …});

宣告旗號並給予初值(int flag=0);

讀入查詢學號(num);

搜尋查詢成績:

        for(int i=0; i<score.length; i++) {

             if(score[i][0] == num){

                輸出顯示學號與成績;

                flag = 1;

             }

         }

         if(flag ==0)

            輸出顯示沒有資料;

翻轉工作室:粘添壽

 

Java 程式設計(一) 含程式邏輯

 

 

翻轉電子書系列: