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

 

6-6 自我挑戰檔案輸入/輸出

內容:

  • 6-6-1 自我挑戰:超商商品管理系統

  • 6-6-2 自我挑戰:倉儲管理系統

    • (A) 程式功能

    • (B) 製作技巧提示

6-6-1 自我挑戰:超商商品管理系統

A程式功能:PM6_3.javaElement.java

請幫『春嬌生鮮超市』建立一套商品登錄系統。該系統功能有『顯示所有資料』、『增加商品資料』、以及『儲存資料』。庫存資料儲存於 storage.data 檔案內。假設描述商品屬性(Element.java)為:商品編號(String no)、商品名稱(String name)、單價(int price)、單位(Sting unit)、庫存量(int stock)與製造商(String maker)。

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

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

(1) 系統啟動時,會由 storage.data 檔案讀入目前資料內容,如果該檔案不在,則會要求先建立後再執行,如下:

D:\Java2_book\chap6\PM6_3>java PM6_3

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

<Enter> 鍵離開 =>

(2) 進入系統後,包含 5 個工作選項,如下:

D:\Java2_book\chap6\PM6_3>java PM6_3

 

== 春嬌超市 商品管理系統 ==

(1) 顯示所有資料        (2) 增加商品資料        (3) 修改商品資料

(4)           (5)  

請選擇工作項目 =>

(3) 進入系統後,包含 5 個工作選項,如下:

D:\Java2_book\chap6\PM6_3>java PM6_3

 

== 春嬌超市 商品管理系統 ==

(1) 顯示所有資料        (2) 增加商品資料        (3) 修改商品資料

(4)           (5)  

請選擇工作項目 =>

(4) 工作選項(1) 為顯示儲存的產品資訊,如下:

請選擇工作項目 => 1

== 列印所有商品資料 ==

代號    品名            單價    單位    庫存量        製造商

A1001   黑松汽水        20            210             黑松公司

A1002   可口奶滋        50            310             統一食品

(5) 工作選項(2) 是增加商品資料的操作,如下:

請選擇工作項目 => 2

請輸入商品編號 =>1005

請輸入商品名稱 =>台灣啤酒

請輸入單價 =>60

請輸入單位 (//公斤) =>

請輸入安全庫存量 =>50

請輸入製造商 =>台灣菸酒公司

(6) 工作選項(3)修改商品資訊的操作,如下:

請選擇工作項目 => 3

請輸入欲修改的商品編碼 =>A1005

[台灣啤酒]請輸入商品名稱 =>金門高粱

[60]請輸入單價 =>500

[]請輸入單位 (//公斤) =>

[50]請輸入庫存量 =>30

[台灣菸酒公司]請輸入製造商 =>金門酒廠

(7) 工作選項(4) 是儲存所有資料到檔案,如下:

請選擇工作項目 => 4

** 將儲存檔案 (storage.data) **

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

B製作技巧提示:

為了方便製作,吾人可將此系統劃分為若干個子系統(方法或函數)來分別實現,如圖 6-8 所示;虛擬碼提示如下:

6-13 超商商品管理系統架構

宣告商品類別(class Element { …};

宣告主類別範圍(class PM9_2{

宣告商品物件陣列(static Element[] art);

宣告紀錄資料筆數的變數(static int number);

宣告庫存檔案的變數(static String file);

宣告鍵盤輸入物件(static BufferedReader keyin);

宣告主方法範圍(main(){

產生物件陣列範圍(art = new Element[50]);

設定類別變數內容(number=0file=”storage.data);

呼叫執行讀取檔案資料方法(read_data());

呼叫主功能選單(mainMenu())並讀取功能選項(select;

while (select != 4) {

switch(select) {

case 1: disp_data()  /* 顯示所有資料 */

case 2: add_data()   /* 增加商品資料 */

case 3: modify_data()   /* 修改商品資料 */

case 4: save_data()   /* 儲存資料 */

}

   呼叫主功能選單(mainMenu())並讀取功能選項(select;

}

    } // 主方法結束

    /* 主工作項目選單 */

宣告主功能表選單方法(mainMenu() { ….});

宣告檔案讀取方法(read_data());

/* stroage.data 檔案讀入並存入 art[] 陣列 */

    宣告顯示所有資料方法(disp_data());

宣告增加商品資料方法(add_data());

    宣告儲存商品資料方法(save_data());

/* art[] 陣列內容輸出至 storage.data 檔案 */

} // 主類別結束

(C) 程式片段提示

6-14 PM6_3 程式架構

(1) Element 類別的原始檔案:(Element.java)

01

02

03

04

05

06

07

08

09

10

11

12

//Element.java

 

class Element {

    String ID;        // 商品編號

    String name;      // 商品名稱

    int price;        // 單價

    String unit;      // 單位

    int stock;        // 庫存數量

    String maker;     // 製造商

}

(2) 主類別的原始檔案片段:(PM6_3.java)

l   主類別的原始檔案片段:(PM6_3.java)

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

//PM6_3.java

/* 請建立一套商品登錄系統,功能有:顯示所有資料、增加商品資料、儲存資料;

 * 資料儲存於storage.data檔案內 */

 

/* Element.class 須於同目錄下 */

import java.io.*;

import java.util.Scanner;

public class PM6_3 {

    static Element[] art;            // 商品資料的物件陣列

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

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

    static String file_R;    // 庫存檔案

 

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

       keyin = new Scanner(System.in);

 

       art = new Element[50];

       number=0;                 // 儲存資料的筆數

       file_R = "storage.data";                  

       read_data();

 

       mainMenu();

       int select = keyin.nextInt();

       keyin.nextLine();

       while (select !=5) {

            switch (select) {

                case 1:     /* 顯示所有資料 */

                     disp_data();

                     break;

                case 2:     /* 增加商品資料 */

                     add_data();

                     break;

                case 3:     /* 修改商品資料 */

                     modify_data();

                     break;

                case 4:          /* 儲存資料 */

                     save_data();

                     break;

                default:

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

           }

           mainMenu();

           select = keyin.nextInt();

           keyin.nextLine();

       }

    }

    /* 主工作項目選單 */

    public static void mainMenu() {

        System.out.printf("\n== 春嬌超市 商品管理系統 ==\n");

        …..

        ….

 

    }

 

    /* stroage.data 檔案輸入至系統 */

    public static void read_data() throws IOException {

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

        String inData;

        if (fileID.exists()) {

            BufferedReader data = new BufferedReader(new

                                              FileReader(fileID));

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

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

                art[number] = new Element();

                art[number].ID = s.next();

                art[number].name = s.next();

                art[number].price = s.nextInt();

                art[number].unit = s.next();

                art[number].stock = s.nextInt();

                art[number].maker = s.next();

                number = number +1;

           }

           data.close();

       }

       else {

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

           System.out.printf(" <Enter> 鍵離開 =>");

           keyin.nextLine();

           System.exit(1);

       }

    }

 

    /* 顯示所有資料 */

    public static void disp_data() {

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

        System.out.printf("代號\t品名\t\t單價\t單位\t安全庫存量\t製造商\n");

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

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

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

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

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

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

            System.out.printf("%s\n", art[i].maker);

        }

    }

 

    /* 增加商品資料 */

    public static void add_data(){

          int k=number;

          art[k] = new Element();

          System.out.printf("請輸入商品編號 =>");

             art[k].ID = keyin.nextLine();

          System.out.printf("請輸入商品名稱 =>");

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

          System.out.printf("請輸入單價 =>");

             art[k].price = keyin.nextInt();

             keyin.nextLine();

          System.out.printf("請輸入單位 (//公斤) =>");

             art[k].unit = keyin.nextLine();

          System.out.printf("請輸入庫存量 =>");

             art[k].stock = keyin.nextInt();

             keyin.nextLine();

          System.out.printf("請輸入製造商 =>");

             art[k].maker = keyin.nextLine();

          number = number+1;

     }

 

    /* 修改商品資料 */

    public static void modify_data(){

          System.out.printf("請輸入欲修改的商品編碼 =>");

          String num = keyin.nextLine();

          int flag = 0, test;

          int i = 0;

          while(i < number) {

              test = art[i].ID.compareTo(num);

              if (test == 0) {

                  flag = 1;

                  break;

              }

              i = i + 1;

          }

          if (flag == 0) {

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

             return;

          }         

          System.out.printf("[%s]請輸入商品名稱 =>", art[i].name);

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

          System.out.printf("[%d]請輸入單價 =>", art[i].price);

             art[i].price = keyin.nextInt();

             keyin.nextLine();

          System.out.printf("[%s]請輸入單位 (//公斤) =>", art[i].unit);

             art[i].unit = keyin.nextLine();

          System.out.printf("[%d]請輸入庫存量 =>", art[i].stock);

             art[i].stock = keyin.nextInt();

             keyin.nextLine();

          System.out.printf("[%s]請輸入製造商 =>", art[i].maker);

             art[i].maker = keyin.nextLine();

     }

 

     /* 儲存商品資料至 storage.data */

     public static void save_data() throws IOException {

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

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

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

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

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

             outData.write(art[i].price + "\t");

             outData.write(art[i].unit + "\t");

             outData.write(art[i].stock + "\t");

             outData.write(art[i].maker + "\n");

        }

        outData.close();

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

    }

}

6-6-2 自我挑戰:倉儲管理系統

A程式功能:PM6_4

(擴充 PM6_3.java 功能)請幫『春嬌超商連鎖店』建立一套『倉儲管理系統』,可供隨時登錄各連鎖店進出貨量。該系統功能有『顯示所有資料』、『增加商品資料』、『出貨登錄』、『進貨登錄』、以及『儲存資料』。庫存資料儲存於 storage.data 檔案內。當點選『出貨』或『進貨』功能時,系統會將目前所建立的商品資料顯示於螢幕上,管理者點選產品再輸入數量即可。假設描述商品屬性(Element.class)為:商品編號(String no)、商品名稱(String name)、單價(int price)、單位(Sting unit)、庫存量(int stock)與製造商(String maker)。

(1) 除了 PM6_3.java 5 個功能外,還要擴充『進貨資料登錄』與『出貨資料登錄』兩個工作選項,如下:

D:\Java2_book\chap6\PM6_4>javac PM6_4.java

 

D:\Java2_book\chap6\PM6_4>java PM6_4

 

== 春嬌超市 商品管理系統 ==

(1) 顯示所有資料        (2) 增加商品資料        (3) 修改商品資料

(4) 進貨資料登錄        (5) 出貨資料登錄        (6)  

(7)  

        請選擇工作項目 =>

(2) 當選擇『進貨資料登錄』後,系統會出現目前庫存狀況,再選擇進貨那一種商品,並輸入進貨數量。輸入後再選擇『顯示所有資料』(選擇 4 1) 的結果如下:

       請選擇工作項目 => 4

=== 請點選 (進出貨) 商品 ==

(1) 黑松汽水 260  (2) 可口奶滋 410  (3) 可口可樂 500  (4) 台灣啤酒 200

(5) 滿漢大餐 200

請輸入商品選項 =>4

進貨數量 =>50

 

= 春嬌超市 商品管理系統 ==

1) 顯示所有資料        (2) 增加商品資料        (3) 修改商品資料

4) 進貨資料登錄        (5) 出貨資料登錄        (6)  

7)  

       請選擇工作項目 => 1

= 列印所有商品資料 ==

代號    品名            單價    單位    安全庫存量      製造商

1001   黑松汽水        20            260             黑松公司

1002   可口奶滋        50            410             統一食品

1003   可口可樂        15            500             英商太古

1004   台灣啤酒        60            250             台灣菸酒

1005   滿漢大餐        50            200             統一食品

(3) 當選擇『出貨資料登錄』後,系統同樣會出現目前庫存狀況,再選擇出貨那一種商品與數量。輸入後再選擇『顯示所有資料』(選擇 5 1) 的結果如下:

        請選擇工作項目 => 5

 === 請點選 (進出貨) 商品 ==

(1) 黑松汽水 260  (2) 可口奶滋 410  (3) 可口可樂 500  (4) 台灣啤酒 250

(5) 滿漢大餐 200

請輸入商品選項 =>3

出貨數量 =>200

 

== 春嬌超市 商品管理系統 ==

(1) 顯示所有資料        (2) 增加商品資料        (3) 修改商品資料

(4) 進貨資料登錄        (5) 出貨資料登錄        (6)  

(7)  

        請選擇工作項目 => 1

== 列印所有商品資料 ==

代號    品名            單價    單位    安全庫存量      製造商

A1001   黑松汽水        20            260             黑松公司

A1002   可口奶滋        50            410             統一食品

A1003   可口可樂        15            300             英商太古

A1004   台灣啤酒        60            250             台灣菸酒

A1005   滿漢大餐        50            200             統一食品

(4) 離開系統之前,記得『儲存資料』(選項 6),如下:

        請選擇工作項目 => 6

** 將儲存檔案 (storage.data) **

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

B製作技巧提示:

6-15 PM6_4 程式架構

本系統大致上與 PM6_3.java 相似,僅增加了『進貨登錄』與『出貨登錄』功能選項。當執行這兩項功能時,系統必須將目前已登錄產品與數量,顯示於螢幕上;操作者點選後,再輸入進出貨數量。因此,必須另製作一只顯示產品名稱與數量,並可選擇輸入的子程式(list_art()),兩功能子程式(enter_date() out_data())分別呼叫它,再傳回正確的產品選項。這三個子程式提示如下:

/* 進貨登錄子程式 */

public static void enter_data(){

int num = list_art();

if (num == 999) {

return;

}

System.out.printf("進貨數量 =>");

int enter = keyin.nextInt();

keyin.nextLine();

art[num].stock = art[num].stock + enter;

}

/* 出貨登錄子程式 */

public static void out_data(){

int num = list_art();

if (num == 999) {

return;

}

System.out.printf("出貨數量 =>");

int outer = keyin.nextInt();

keyin.nextLine();

art[num].stock = art[num].stock - outer;

}

 

/* 顯示商品清單及選擇商品子程式 */

public static int list_art()  {

System.out.printf(" === 請點選 (進出貨) 商品 ==\n");

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

System.out.printf("(%d) %s %d  ", i+1, art[i].name, art[i].stock);

if ((i+1) % 4 == 0)

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

}

System.out.printf("\n請輸入商品選項 =>");

int num = keyin.nextInt();

keyin.nextLine();

num = num -1;

if ((num >= number) || (num < 0) ){

System.out.printf("錯誤輸入!! 按任何鍵回主選單\n");

keyin.readLine();

return 999;

}

return num;

}

 

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: