Java 程式設計()  第 六章 檔案輸入/輸出運用  上一頁    下一頁

 

6-5 專題製作 :建立人事管理系統

內容:

6-5-1 程式功能:Ex6_3.javaPersonal.java

『展鵬網路行銷公司』希望建立一個電子化管理系統,其中包含若干個子系統,各子系統所使用的員工資料都能夠統一處理,才不至於發生各系統之間不一致的問題。請您幫該公司規劃員工資料的屬性,並建立『人事資料管理系統』(Ex6_3.java)可讓管理人員『新增』、『修改』與『刪除』員工資料,爾後其他子系統也可引用該資料(Human.data)。目前預估員工資料包含有:員工代號、姓名、服務部門、性別、出生、底薪、職務加級等屬性,並由獨立檔案製作而成(Persional.java),經過編譯後產生 Persional.class

至於員工資料請以 Human.data 檔案名稱儲存。第一次執行沒有 Human.data 檔案,則利用編輯工具(如:notepad++) 開啟一個新檔,直接另存新檔並將檔名取 “Human.data”(雙引號包起來,不要輸入任何內容),再儲存於本程式的同一目錄下即可。

期望操作介面與執行結果如下:

(1) 執行該檔案之前,需先建立 Human.dat,如果該檔案不在,則會要求先建立後再執行,如下:(系統啟動時,會將 Human.dat 檔案內容讀入)

D:\Java2_book\chap6\Ex6_3>java Ex6_3

Human.data 檔案不存在, 請先建立它

<enter>鍵離開 =>

(2) 系統包含 6 個工作選項,無論增加、修改或刪除員工資料之後,都必儲存資料才有效,亦是,離開系統(選項 6) 之前必須儲存資料(選項 5),選單如下:

D:\Java2_book\chap6\Ex6_3>java Ex6_3

=== 人事資料管理系統 ===

(1) 顯示所有資料        (2) 增加員工資料        (3) 修改員工資料

(4) 刪除員工資料        (5)           (6)  

請選擇工作項目 =>

(3) 選擇 (1) 表顯示系統內所有員工資料,如下:

請選擇工作項目 => 1

= 列印所有員工資料 ==

代號    姓名    部門    性別    出生    底薪    加級

101    王力宏  會計課        63/12/5 80000   40000

102    張惠妹  業務課        64/3/12 90000   70000

103    蔡依玲  製造課        67/3/15 80000   60000

(4) 工作選項(2)是增加員工資料,操作介面如下:

請選擇工作項目 => 2

請輸入員工編號 =>7106

請輸入姓名 =>劉有得

請輸入服務部門 =>資訊部

請輸入性別 (/) =>

請輸入生日 (西元//) =>71/09/12

請輸入底薪 =>54000

請輸入職務加級 =>11000

(5) 工作選項(3)是修改員工資料,操作介面如下:

請選擇工作項目 => 3

請輸入欲修改員工的代號 =>7105

請輸入 張有德 姓名 =>張有得

請輸入 資訊部 服務部門 =>製造部

請輸入性別 (/) =>

請輸入生日 75/09/23 (//) =>76/09/23

請輸入 60000 底薪 =>50000

請輸入 20000 職務加級 =>20000

(6) 工作選項(4)是刪除員工資料,操作介面如下:

請選擇工作項目 => 4

請輸入欲刪除員工的代號 =>7105

7105 資料已刪除 !!

(7) 工作選項(5)是將目前員工資料儲存到檔案內,操作介面如下:

請選擇工作項目 => 5

** 將儲存檔案 (Human.dada) **

***** 儲存完畢 ****

6-5-2 製作技巧研討

吾人將製作本系統的重點歸類成下列重點: (如圖 6-7 所示)

6-11 人事資料管理系統架構

(1) 建立一個專屬員工資料類別的原始檔案(Personal.java),類該類別內的變數成員較能符合其他管理系統運用。

(2) 需要針對 Human.data 檔案宣告產生輸入與輸出物件。

(3) 可依照本系統所提供的功能,劃分多個子系統再分別實現。為了讓子系統能直接處理員工資料,而將其物件陣列(Personal[] emp;)與登記所儲存資料筆數的變數(int k;),設定成類別靜態變數(static)。

(4) 主方法(main()):宣告檔案(Human.data)輸入與輸出物件、儲存資料的物件陣列(emp[])。讀取 Human.data 檔案內容,並分別將各個欄位內容填入相對應的物件陣列的變數成員內。再利用 while/switch/case 迴圈讀取操作者的工作選項。

(5) 主選單程式(main_menu()):顯示本系統所提供的工作項目。

(6) 顯示資料子程式(disp_data()):將目前物件陣列(emp[],靜態變數)登錄的員工資料,輸出顯示到螢幕上。

(7) 增加資料子程式(add_data()):可輸入增加一位員工資料到物件陣列(emp[])上。

(8) 修改資料子程式(modify_data):修改物件陣列(emp[])內某位員工的資料。

(9) 刪除資料子程式(delete_data):刪除物件陣列(emp[])內某位員工的資料。

(10) 儲存資料子程式(save_data):依序將物件陣列(emp[])各筆員工資料輸出到檔案(Human.data)上。

6-5-3 程式範例:(執行前,須建立 Human.data 檔案)

6_12 Ex6_3 程式架構

(A) Personal 類別的原始檔案

01

02

03

04

05

06

07

08

09

10

11

12

//Personal.java

 

class Personal {     

     int ID;          // 員工代號

     String name;     // 員工姓名

     String depart;   // 服務部門

     String sex;      //    

     String birth;    // 出生日期

     int payment;     //    

     int duty;        // 職務加級

}

(B) 主類別的原始檔案

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

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

//Ex6_3.java

/* 請建立一套人事資料管理系統,可讓管理人員新增、修改、刪除員工資料 */

 

import java.io.*;

import java.util.Scanner;

public class Ex6_3 {

    static Personal[] emp;         // 員工資料的物件陣列

    static int k;                  // 紀錄儲存筆數

    static Scanner keyin;   // 鍵盤輸入物件

 

    public static void main(String args[]) throws IOException {

       keyin = new Scanner(System.in);

 

       /* 讀取 Human.data 檔案資料, 再存入 emp 物件陣列中 */

       emp = new Personal[50];

       k=0;         // 讀取資料的筆數

       String inData;

       String file_R = "Human.data";                     

       File fileID = new File(file_R);    // 產生輸入檔案物件

       if (fileID.exists()) {

           BufferedReader data = new BufferedReader(new

                                              FileReader(fileID));

           while ((inData=data.readLine()) != null) {

                Scanner s = new Scanner(inData).useDelimiter("\t");

                emp[k] = new Personal();

                emp[k].ID = s.nextInt();

                emp[k].name = s.next();

                emp[k].depart = s.next();

                emp[k].sex = s.next();

                emp[k].birth = s.next();

                emp[k].payment = s.nextInt();

                emp[k].duty = s.nextInt();

                k = k +1;

           }

           data.close();

       }

       else {

           System.out.printf("%s 檔案不存在, 請先建立它\n", file_R);

           System.out.printf("按任何鍵離開 =>");

           keyin.nextLine();

           System.exit(1);

       }

       mainMenu();

       int select = keyin.nextInt();

       while (select !=6) {

            switch (select) {

                case 1:     /* 顯示員工資料 */

                     disp_data();

                     break;

                case 2:     /* 增加員工資料 */

                     add_data();

                     break;

                case 3:     /* 修改員工資料 */

                     modify_data();

                     break;

                case 4:          /* 刪除資料 */

                     delete_data();

                     break;

                case 5:          /* 儲存資料 */

                     save_data();

                     break;

                default:

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

           }

           mainMenu();

           select = keyin.nextInt();

       }

    }

    public static void mainMenu() {

        System.out.printf("\n=== 人事資料管理系統 ===\n");

        System.out.printf("(1) 顯示所有資料\t");

        System.out.printf("(2) 增加員工資料\t");

        System.out.printf("(3) 修改員工資料\n");

        System.out.printf("(4) 刪除員工資料\t");

        System.out.printf("(5)   \t");

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

        System.out.printf("請選擇工作項目 => ");

    }

    public static void disp_data() {

        System.out.printf("== 列印所有員工資料 ==\n");

        System.out.printf("代號\t姓名\t部門\t性別\t出生\t底薪\t加級\n");

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

            System.out.printf("%d\t", emp[i].ID);

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

            System.out.printf("%s\t", emp[i].depart);

            System.out.printf("%s\t", emp[i].sex);

            System.out.printf("%s\t", emp[i].birth);

            System.out.printf("%d\t", emp[i].payment);

            System.out.printf("%d\n", emp[i].duty);

        }

    }

    public static void add_data() throws IOException {

          emp[k] = new Personal();

          System.out.printf("請輸入員工編號 =>");

             emp[k].ID = keyin.nextInt();

             keyin.nextLine();          //清除鍵盤緩衝器

          System.out.printf("請輸入姓名 =>");

             emp[k].name = keyin.nextLine();

          System.out.printf("請輸入服務部門 =>");

             emp[k].depart = keyin.nextLine();

          System.out.printf("請輸入性別 (/) =>");

             emp[k].sex = keyin.nextLine();

          System.out.printf("請輸入生日 (//) =>");

             emp[k].birth = keyin.nextLine();

          System.out.printf("請輸入底薪 =>");

             emp[k].payment = keyin.nextInt();

          System.out.printf("請輸入職務加級 =>");

             emp[k].duty = keyin.nextInt();

          k = k+1;

     }

     public static void modify_data() throws IOException {

          System.out.printf("請輸入欲修改員工的代號 =>");

          int num = keyin.nextInt();

          keyin.nextLine();          //清除鍵盤緩衝器

          int flag = 0;

          int i = 0;

          while(i < k) {

              if (emp[i].ID == num) {

                  flag = 1;

                  break;

              }

              i = i + 1;

          }

          if (flag == 0) {

             System.out.printf("test here 5\n");

             System.out.printf("沒有 %d 資料, 拒絕處理 !!\n", num);

             return;

          }         

          System.out.printf("請輸入 %s 姓名 =>", emp[i].name);

             emp[i].name = keyin.nextLine();

          System.out.printf("請輸入 %s 服務部門 =>", emp[i].depart);

             emp[i].depart = keyin.nextLine();

          System.out.printf("請輸入性別 %s (/) =>", emp[i].sex);

             emp[i].sex = keyin.nextLine();

          System.out.printf("請輸入生日 %s (//) =>", emp[i].birth);

             emp[i].birth = keyin.nextLine();

          System.out.printf("請輸入 %d 底薪 =>", emp[i].payment);

             emp[i].payment = keyin.nextInt();

          System.out.printf("請輸入 %d 職務加級 =>", emp[i].duty);

             emp[i].duty = keyin.nextInt();

     }

     public static void delete_data() throws IOException {

          System.out.printf("請輸入欲刪除員工的代號 =>");

          int num = keyin.nextInt();

          int flag = 0, m = 0;

          while(m < k) {

              if (emp[m].ID == num){

                  flag = 1;

                  break;

              }

              m = m + 1;

          }

          if (flag == 0){

             System.out.printf("沒有 %d 資料, 拒絕處理 !!\n", num);

             return;

          }

          for(int i=m; i<k; i++)

              emp[i]=emp[i+1];

          k = k-1;

          System.out.printf("%d 資料已刪除 !!\n", num);

     }

     public static void save_data() throws IOException {

         String file = "Human.data";

         BufferedWriter outData = new BufferedWriter(new FileWriter(file));

         System.out.printf("** 將儲存檔案 (Human.dada) **\n");

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

             outData.write(emp[i].ID + "\t");  

             outData.write(emp[i].name + "\t");

             outData.write(emp[i].depart + "\t");

             outData.write(emp[i].sex + "\t");

             outData.write(emp[i].birth + "\t");

             outData.write(emp[i].payment + "\t");

             outData.write(emp[i].duty + "\n");

        }

        outData.close();

        System.out.printf("***** 儲存完畢 ****\n");

    }

}

6-5-4 程式重點分析

(1) 6~8 :『static …』。 將物件陣列 emp[]、紀錄筆數變數 k 與鍵盤輸入物鍵 keyin 宣告成靜態變數,該類別內所有方法(或稱函數)都可以直接存取。

(2) 13~41 :系統被啟動後,立即將 Human.data 檔案所儲存的員工資料讀入emp[] 陣列內,以後才可以針對 emp[] 陣列作資料處理。如果 Human.data 檔案不存在的話,系統會直接離開不處理,因此第一次執行之前,必須先建立一個名稱為 Human.data 空白檔案(可利用記事本產生)。

(3) 31 :『k = k+1;』。累計目前已讀取第幾筆資料;由此可見,變數 k 非常重要,是物件陣列 emp[] 的指標器。

(4) 94~112 :『public static void add_data() throws IOException {..}』。增加員工資料函數,執行該函數時須由鍵盤輸入資料,而且鍵盤輸入是利用 BufferReader 物件,他必須指定發生異常狀態時,需將訊息擲向何處(IOException)。

(5) 155~158 :『if (flag == 0) { .. return; }』。如果變數 flag 0 的話,則該函數直接返回,就不會再執行往下的敘述句。

(6) 159~160 :『for(int i=m; i<k; i++) emp[i]=emp[i+1];』。欲刪除第 m 筆資料的動作,是將後面的資料往前移一個位置,該筆資料自然被覆蓋掉。

(7) 164~180 :『public static void save_data() …』。將物件陣列 emp[] 內容寫入檔案,如果沒有執行寫入便離開系統,則所處理的動作將不會影響到檔案內容。

 

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: