Java 程式設計()  第 四章 陣列資料結構  上一頁    下一頁

 

4-4 專題製作 :陣列結構

內容:

  • 4-4-1 範例研討:無序成績管理系統

  • 4-4-2 自我挑戰:有序成績管理系統

4-4-1 範例研討:無序成績管理系統

(A)系統功能:Ex4_5.java

三民國中的張老師希望在電腦上管理班級同學(以學號登錄)的分數,班上課程有:國文、英文、數學、理化與自然,期望有下列功能:

(1) 具有顯示全班成績、插入同學成績、刪除、更新的功能,選單如下:

D:\Java2_book\chap4>javac Ex4_5.java

 

D:\Java2_book\chap4>java Ex4_5

== 三民國中 張老師成績管理系統

(1) 列印全班成績

(2) 新增學生成績

(3) 刪除學生成績

(4) 查詢學生成績

(5) 更新學生成績

(6) 依平均成績高低列印

(7) 離開系統

         請輸入工作選項 =>

(2)當選擇顯示全班成績(選擇 1),如下:

== 列印全班各科成績==

學號    國文    英文    數學    理化    自然    平均

 1      36      70      34      61      93       0

 7      90      51      47      34      87       0

21      88      66      94      66      44       0

 5      37      47      69      45      73       0

28      82      90      60      31      74       0

29      97      41      97      95      39       0

13      63      30      72      79      63       0

10      32      52      51      96      80       0

15      72      64      35      72      46       0

  •      39      41      60      59      59       0

(3)新增學生成績(選擇 2),如下:

         請輸入工作選項 =>2

請輸入學生學號(2位數) =>45

請輸入國文成績 =>67

請輸入英文成績 =>90

請輸入數學成績 =>87

請輸入理化成績 =>95

請輸入自然成績 =>77

(4)刪除學生成績(選擇 3),如下:

         請輸入工作選項 =>3

請輸入欲刪除學生學號 =>37

37 學生已刪除成功

目前學生人數為 8

(5)查詢學生成績(選擇 4),如下:

         請輸入工作選項 =>4

請輸入欲查詢學號 =>32

學號=32  國文=99  英文=93  數學=91  理化=61  自然=68  平均=0

(6)更新學生成績(選擇 5)如下:

         請輸入工作選項 =>5

請輸入欲更新成績的學號 =>32

更新 32 學生的成績 =>

請更新國文成績(99) =>98

請更新英文成績(93) =>90

請更新數學成績(91) =>87

請更新理化成績(61) =>77

請更新自然成績(68) =>80

(7)列印成績排序(選擇 6)如下:

         請輸入工作選項 =>6

 

== 列印全班各科成績==

學號    國文    英文    數學    理化    自然    平均

35      34      34      59      36      31      38

23      90      46      49      51      36      54

46      49      72      99      43      49      62

25      98      46      49      46      76      63

50      94      32      82      94      30      66

37      92      31      80      69      72      68

23      61      68      91      97      39      71

30      83      78      63      93      70      77

  98      90      87      77      80      86

(B)系統分析

我們需要一個 50*7 的二維陣列來儲存,假設全班人數最高為 50 位,每位學生需 7 個欄位來存放學號、國文、英文、數學、理化、自然與平均分數。為了讓使用者方便測試系統的正確性,程式內先產生 10 位學生的資料,都是由亂數產生。另外,學號並沒有按照大小順序排列。

(C)程式範例

其程式架構如圖 4-14 所示,main() 方法內除了產生學生資料的初始值外,也提供各項功能的輸入選單。Disp_menu() disp_course() 是顯示功能選單與學生成績資料顯示;Linear_search() 功能是搜尋到所欲處理資料的位置;Buffer_sort() 功能是依照平均分數排列。

4-14 Ex4_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

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

148

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

//Ex4_5.java

/* 三民國中張老師成績管理系統 */

 

import java.util.*;

public class PM4_2{

  static int course[][] = new int[50][7];     // 宣告無序陣列空間

  //陣列欄位名稱

  static String name[]={"學號","國文","英文","數學","理化","自然","平均"};

  static int point;                   // 宣告游標變數

  public static void main(String args[]) {

      Scanner keyin = new Scanner(System.in);

      Random ran = new Random();

      int value;       // 輸入元素

      int select;      // 功能選擇

      point = -1;      // 游標初值(初值已存入 5 筆資料)

      int location;

      for (int i=0; i<10; i++){        //給予陣列初值

          course[i][0] = 1 + ran.nextInt(50);

          for(int j=1; j<=5; j++)

              course[i][j] = 30 + ran.nextInt(70);

          point = point + 1;

      }

     

      disp_menu();

      select = keyin.nextInt();

      while(select != 7) {

          switch(select) {

             case 1:

                  disp_course();

                  break;

             case 2:

                  if (point >=50) {

                      System.out.printf("陣列已滿無法插入!!\n");

                  }else {

                       point = point +1;

                       System.out.printf("請輸入學生學號(2位數) =>");

                       course[point][0]= keyin.nextInt();

                       System.out.printf("請輸入國文成績 =>");

                       course[point][1]= keyin.nextInt();

                       System.out.printf("請輸入英文成績 =>");

                       course[point][2]= keyin.nextInt();

                       System.out.printf("請輸入數學成績 =>");

                       course[point][3]= keyin.nextInt();

                       System.out.printf("請輸入理化成績 =>");

                       course[point][4]= keyin.nextInt();

                       System.out.printf("請輸入自然成績 =>");

                       course[point][5]= keyin.nextInt();    

                   }

                   System.out.printf("目前學生人數為 %d\n", point);

                   break;

             case 3:

                  System.out.printf("請輸入欲刪除學生學號 =>");

                  value = keyin.nextInt();

                  location = Linear_serach(value);

                  if (location == -1){

                        System.out.printf("沒有學號= %d 學生\n", value);

                  }else {

                     for(int i = location;i<=point;i++)

                         course[i] = course[i+1];

                  }

                  point = point - 1;

                  System.out.printf("%d 學生已刪除成功\n", value);

                  System.out.printf("目前學生人數為 %d\n", point);

                  break;

             case 4:

                  System.out.printf("請輸入欲查詢學號 =>");

                  value = keyin.nextInt();

                  location = Line_serach(value);

                  if (location == -1){

                        System.out.printf("沒有學號= %d 學生\n", value);

                  }else {

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

                      System.out.printf("%s=%d  ", name[i], course[location][i]);

                       }

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

                  }

                  break;

              case 5:

                  System.out.printf("請輸入欲更新成績的學號 =>");

                  value = keyin.nextInt();

                  location = Line_serach(value);

                  if (location == -1){

                        System.out.printf("沒有學號= %d 學生\n", value);

                  }

                  else {

                System.out.printf("更新 %d 學生的成績 =>\n", course[location][0]);

                   System.out.printf("請更新國文成績(%d) =>", course[location][1]);

                   course[location][1]= keyin.nextInt();

                   System.out.printf("請更新英文成績(%d) =>", course[location][2]);

                   course[location][2]= keyin.nextInt();

                   System.out.printf("請更新數學成績(%d) =>", course[location][3]);

                   course[location][3]= keyin.nextInt();

                   System.out.printf("請更新理化成績(%d) =>", course[location][4]);

                   course[location][4]= keyin.nextInt();

                   System.out.printf("請更新自然成績(%d) =>", course[location][5]);

                   course[location][5]= keyin.nextInt();

                  }

                  break;

             case 6:

                  int sum;

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

                      sum = 0;

                      for(int j=1; j<=5; j++)

                          sum = sum + course[i][j];

                      course[i][6] = sum/5;

                  }

                  buffer_sort();

                  disp_course();

                  break;                      

             default:

                 System.out.printf("輸入錯誤 !! 請重新輸入\n");

          }

          disp_menu();

          select = keyin.nextInt();

      }

   }

   static void disp_menu() {

       System.out.printf("== 三民國中 張老師成績管理系統 ==\n");

       System.out.printf("(1) 列印全班成績\n");

       System.out.printf("(2) 新增學生成績\n");

       System.out.printf("(3) 刪除學生成績\n");

       System.out.printf("(4) 查詢學生成績\n");

       System.out.printf("(5) 更新學生成績\n");

       System.out.printf("(6) 依平均成績高低列印\n");

       System.out.printf("(7) 離開系統\n");

       System.out.printf("\t 請輸入工作選項 =>");

   }

   static void disp_course() {   /* 列印全班各科成績 */

      System.out.printf("\n== 列印全班各科成績==\n");

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

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

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

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

           for(int j=0; j<course[i].length; j++)

                 System.out.printf("%2d      ", course[i][j]);

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

      }

      System.out.printf("\n");           // 列印完畢, 換行

   }

   static int Linear_serach(int value){

      int flag=0, i=0;

      int location=-1;

      while (i <= point) {

          if(value == course[i][0]) {

               flag = 1;

               location = i;

               break;

          }

          i = i+1;

      }

      if (flag == 1)

           return location;

      else

           return -1;

   }

   static void buffer_sort(){

       int temp[] = new int[7];

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

           for(int j=0; j<=point; j++) {

               if(course[i][6] < course[j][6]){

                     temp = course[i];

                     course[i] = course[j];

                     course[j] = temp;

               }

           }

        }

     }

}

4-4-2 自我挑戰:有序成績管理系統

(A) 系統功能:PM4_3.java

請依照 Ex4_5.java 程式功能的資料結構改成有序陣列儲存,同樣的具有下列功能能:

D:\Java2_book\chap4>javac PM4_3.java

 

D:\Java2_book\chap4>java PM4_3

== 三民國中 張老師成績管理系統

(1) 列印全班成績

(2) 新增學生成績

(3) 刪除學生成績

(4) 查詢學生成績

(5) 更新學生成績

(6) 依平均成績高低列印

(7) 離開系統

         請輸入工作選項 =>

(B) 系統分析

將資料結構改成有序陣列,對於資料插入、刪除、搜尋、更新處理方面有稍微不同,這裡僅提示程式架構,如圖 4-15 所示。至於如何實現就留給讀者自挑戰看看。

4-15 PM4_3 程式架構

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: