Java 程式設計()  第七章 類別與物件產生  上一頁    

 

7-6 專題 研討儲蓄存款系統

內容:

  • 7-6-1 範例研討:步驟(1) 建立存款帳戶規格

  • 7-6-2 範例研討:步驟(2) 建立儲蓄存款系統

  • 7-6-3 自我挑戰:步驟(3) 建立交易檔規格

  • 7-6-4 自我挑案:步驟(4) 建立安全性存款系統

『藝術銀行』期望製作一套『活期儲蓄存款系統』,程式設計師很難了解系統需求,因此依照可能狀態分段製作,每一階段完成並得到上級同意後,再往下一階段實現,吾人將各步驟分批實施如下。

7-6-1 範例研討:步驟(1) 建立存款帳戶規格

(A) 系統功能:PM7_2_1.javaaccount.java

系統需要建立客戶帳戶。每一存款帳戶包含:姓名(String name)、帳戶(String No)與存款餘額(int balance),各項資料限制如下:

(1) 帳戶:由 12 個數字與 1 個檢查碼所構成(合計 13 碼),檢查碼計算方式是利用一個加權系列: 1 3 1 3 1 3... 交替變換,帳號第一個數字乘以 1、第二位乘以 3、第三位乘以 1...等依此類推,再將所乘的結果相加(= total),再取 10 的餘數(value = total % 10),檢查碼即是 10 減該餘數(= 10 - value)。

(2) 存款餘額:如果取款後,餘額會少於 0,則會拒絕提款。

請製作一個帳戶類別(Account.class)是其具有上述功能,再至作主程式引用該類別,驗證是否正常。當建立帳戶時,只要輸入 12 個帳號,系統自動產生檢查碼;處理帳戶而輸入帳號,系統也會檢查檢查碼是否正確。期望驗證帳戶類別功能的結果如下:

D:\Java2_book\chap7\PM7_2\PM7_2_1>javac Account.java     【編譯 Account.java

D:\Java2_book\chap7\PM7_2\PM7_2_1>javac PM7_2_1.java    【編譯 PM7_2_1.java

D:\Java2_book\chap7\PM7_2\PM7_2_1>dir/b

Account.class                                           【帳戶 Account 類別】

Account.java

PM7_2_1.class                                       【主程式 PM7_2_1 類別】

PM7_2_1.java

 

D:\Java2_book\chap7\PM7_2\PM7_2_1>java PM7_2_1         【執行主類別】

***建立新帳戶***                                       // 輸入帳戶驗證

請輸入姓名=>粘添壽

請輸入帳號(12 位數字) =>123451234589

****建立完成****

完整的新帳戶(13)=>12345123458910

請輸入存款金額 =>50000

餘額 = 50000

列印帳戶資料                                    // 輸出驗證結果

帳戶姓名: 粘添壽

帳戶號碼(13 )12345123458910

餘額= 50000

(B) 帳戶類別(Account.class)

首先必須建立帳戶類別,其內容包含帳戶姓名(name)、帳號(ID)與餘額(balance),其中 ID  balance 為私有變數,必須透過物件方法存取,其架構如圖 7-11 所示。

7-17 Account.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

//Account.java

/* 設定客戶姓名、帳號(ID) 與存款餘額 */

import java.io.*;

import java.util.Scanner;

 

class Account{

    String name;

    private int[]ID = new int[13];

    private int balance;

// 設定帳號

    int setID(String ID_Str) {

        if(ID_Str.length() !=12){

            System.out.printf("12個字元,請重新輸入!!\n");

            return 0;

        }

        else{

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

            int total = 0;

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

               ID[i]=s.nextInt();

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

                   total+=ID[i];

               else

                   total+=ID[i]*2;

            }

            ID[12] = (10-(total%10));

            System.out.print("****建立完成****\n完整的新帳戶(13)=>");

            for(int i=0;i<13;i++)

                  System.out.print(ID[i]);

             System.out.println();

             return 1;            

       }

     }

 

// 取得帳號

    int[] getID(){

        return ID;

    }

// 寫入帳號

    int writeID(String ID_STR1) {

        if(ID_STR1.length() !=13){

            System.out.printf("長度不對\n");

            return 0;

        }

        else{

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

            int total = 0, check, check_R;

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

               ID[i]=s.nextInt();

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

                   total+=ID[i];

               else

                   total+=ID[i]*2;

            }

            check_R = s.nextInt();

            check = 10-(total%10);

            if (check == check_R) {

                ID[12] = check;

                return 1;

            } else {

                 System.out.printf("檢查碼不對\n");

                 return 0;

            }   

           }

    }    

 

// 存款

    int saveM(int money){

        balance = balance + money;

        return balance;

    }

// 取款

    int recM(int money) {

        int m = balance - money;

        if (m >=0) {

           balance = m;

           return balance;

        }

        else {

           return -1;

        }

    }

// 查詢餘額

    int checkM(){

        return balance;

    }   

}

(C) 主類別(PM7_2_1.class)

我們寫一個簡單程式來驗證 Account 類別是否能滿足所需,程式範例如下:

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

//PM7_2_1.java

 

import java.util.*;

public class PM7_2_1{

    public static void main(String[] args) {

        Scanner keyin = new Scanner(System.in);

        String ID_Str;

        Account customer = new Account();

        System.out.printf("***建立新帳戶***\n請輸入姓名=>");

        customer.name = keyin.nextLine();

        System.out.printf("請輸入帳號(12 位數字) =>");

        ID_Str = keyin.nextLine();

        int flag = customer.setID(ID_Str);

        if (flag == 0)

              return;

        System.out.printf("請輸入存款金額 =>");

        int money = keyin.nextInt();

        int balance = customer.saveM(money);

        System.out.printf("餘額 = %d\n", balance);

/* 列印帳戶清單 */

        System.out.printf("列印帳戶資料\n");

        System.out.printf("帳戶姓名: %s \n", customer.name);

        int[] ID = customer.getID();

        System.out.printf("帳戶號碼(13 )");

        for (int i=0; i<13; i++)

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

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

        System.out.printf("餘額= %d\n", customer.checkM());

    }

}

7-6-2 範例研討:步驟(2)建立儲蓄存款系統

(A) 系統功能:PM7_2_2.javaAccount.java

帳戶規格 (Account.class) 經過驗證可行之後,期望您進一步請幫『藝術銀行』建立一套『儲蓄存款系統』的雛形系統,包含有下列功能:

(1) 讀入現有帳戶資料(deposit.data)

(2) 顯示帳戶:顯示系統每一帳戶的姓名、帳號與餘額。

(3) 存款:客戶提款功能,選擇後會要求輸入客戶帳號,再要求輸入存款金額,執行後會顯示目前餘額。

(4) 提款:選擇後會要求輸入客戶帳號,再要求輸入提款金額,執行後會顯示目前餘額。

(5) 查詢餘額:選擇後會要求輸入客戶帳號,再顯示餘額。

(6) 儲存資料:將資料寫入 deposit.data 檔案內。

沿用設計完成的 Account.class 類別,並利用它產生一個物件陣列,儲存客戶帳戶資料。系統啟動時,必須將 deposit.data(必須事先產生)資料寫入陣列內。

(1) 編譯後,有下列檔案:

D:\Java2_book\chap7\PM7_2_2>dir/b

Account.class                       【帳戶類別】

Account.java

deposit.data                         【資料檔案】

PM7_2_2.class                       【主類別】

PM7_2_2.java

(2) 主選單有 8 個選項如下:

D:\Java2_book\chap7\PM7_2_2>java PM7_2_2

== 藝術銀行 活期儲蓄系統 ==

(1) 讀入所有帳戶        (2) 新帳戶        (3) 顯示所有帳戶

(4) 帳戶提款作業        (5) 帳戶存款作業        (6) 帳戶查詢餘額

(7)           (8)  

請選擇工作項目 =>

(3) 首先由檔案讀入資料(選項 1),再觀察目前所有帳戶的資料(選項 2),如下:

請選擇工作項目 => 1

 

= 藝術銀行 活期儲蓄系統 ==

1) 讀入所有帳戶        (2) 新帳戶        (3) 顯示所有帳戶

4) 帳戶提款作業        (5) 帳戶存款作業        (6) 帳戶查詢餘額

7)           (8)  

請選擇工作項目 => 3

= 列印所有帳戶資料 ==

帳號            姓名    餘額

234567812344   粘添壽  60000

345678901238   劉聲聲  60000

(4) 建立新帳戶(選項 2) 操作如下:

請選擇工作項目 => 2

**建立新帳戶***

請輸入姓名=>張美人

請輸入帳號(12 位數字) =>345678901234

***建立完成****

完整的新帳戶(13)=>34567890123410

請輸入存款金額 =>50000

餘額 = 50000

(5) 客戶提款(選項 4) 的操作如下:

請選擇工作項目 => 4

請輸入存款帳號 =>1234567812344

請輸入提款金額 =>6000

帳戶:粘添壽目前餘額為:54000

(6) 客戶存款作業(選項 5)如下:

請選擇工作項目 => 5

請輸入提款帳號 =>1234567812344

請輸入存款金額 =>70000

帳戶:粘添壽目前餘額為:124000

(7) 客戶查詢餘額(選項 6) 的操作如下:

請選擇工作項目 => 6

請輸入存款帳號 =>1234567812344

帳戶:粘添壽目前餘額為:124000

(8) 儲存檔案(選項 7) 的操作如下:

請選擇工作項目 => 7

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

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

(B) 系統分析

請讀者自行研討。

(C) 程式範例

7-18 PM7_2_1 程式架構

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

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

//PM7_2_2.java

 

import java.io.*;

import java.util.*;

public class PM7_2_2 {

    static Account[] customer;     // 客戶資料的物件陣列

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

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

    static String file_R = "deposit.data";

 

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

       keyin = new Scanner(System.in);

       customer = new Account[50];

      

       mainMenu();

       int select = keyin.nextInt();

       keyin.nextLine();

       while (select !=8) {

            switch (select) {

                case 1:      /* 讀入帳戶資料 */

                     readData();

                     break;

                case 2:      /* 新建立帳戶 */

                     addAcc();

                     break;

                case 3:      /* 顯示所有帳戶 */

                     dispData();

                     break;

                case 4:     /* 提款作業 */

                     recMoney();

                     break;

                case 5:          /* 存款作業 */

                     saveMoney();

                     break;

                case 6:          /* 查詢餘額 */

                     checkMoney();

                     break;

                case 7:          /* 儲存帳戶資料 */

                     saveData();

                     break;

                default:

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

           }

           mainMenu();

           select = keyin.nextInt();

           keyin.nextLine();

       }

    }

    /* 顯示主選單 */

    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("(7)   \t");

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

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

    }

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

    public static void readData() throws IOException {

        String inData;

        String ID_STR1;

        int money;                   

        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");

                customer[k] = new Account();

                ID_STR1 = s.next();

                if (customer[k].writeID(ID_STR1) == 0) {

                     System.out.printf("%s 帳戶不對\n", ID_STR1);

                     continue;

                }

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

                money = s.nextInt();

                customer[k].saveM(money);

                k = k +1;

           }

           data.close();

       }

       else {

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

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

           keyin.nextLine();

           System.exit(1);

       }

    }

    public static void addAcc() {

        String ID_Str;

        customer[k] = new Account();

        System.out.printf("***建立新帳戶***\n請輸入姓名=>");

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

        System.out.printf("請輸入帳號(12 位數字) =>");

        ID_Str = keyin.nextLine();

        int flag = customer[k].setID(ID_Str);

        if (flag == 0)

              return;

        System.out.printf("請輸入存款金額 =>");

        int money = keyin.nextInt();

        int balance = customer[k].saveM(money);

        System.out.printf("餘額 = %d\n", balance);

        k = k + 1;

 

    }

    /* 顯示所有帳戶 */

    public static void dispData() {

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

        System.out.printf("帳號\t\t姓名\t餘額\n");

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

            int[] ID = customer[i].getID();

            for (int j=0; j<13; j++)

                System.out.printf("%d", ID[j]);

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

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

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

        }

    }

    /* 檢查帳號 */

    public static int checkAcc(String ID_Str) {

          int[] ID = new int[13];

          int[] ID_R = new int[13];

          int acc, flag=0;

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

          for (int i=0; i<13; i++)

              ID[i] = s.nextInt();

          for (acc=0; acc<k; acc++) {

               ID_R = customer[acc].getID();

               if (Arrays.equals(ID, ID_R)) {

                    flag =1;

                    break;

               }

          }

           if (flag == 0) {

              System.out.printf("無此帳號,請離開 !!\n");

              return -1;

           }else {

              return acc;

           }

    }

 

    /* 存款作業 */

    public static void saveMoney() {

          int[] ID = new int[13];

          int flag;

          System.out.printf("請輸入提款帳號 =>");

          String ID_Str = keyin.nextLine();

          int acc = checkAcc(ID_Str);

          if (acc < 0) {

              System.out.printf("無此帳號,請離開 !!\n");

              return;

          }

          System.out.printf("請輸入存款金額 =>");

          int money = keyin.nextInt();

          int m = customer[acc].saveM(money);

          String name = customer[acc].name;

          System.out.printf("帳戶:%s目前餘額為:%d\n", name, m);

     }

     /* 提款作業 */

     public static void recMoney(){

          System.out.printf("請輸入存款帳號 =>");

          String ID_Str = keyin.nextLine();

          int acc = checkAcc(ID_Str);

          if (acc < 0) {

              System.out.printf("無此帳號,請離開 !!\n");

              return;

          }

          System.out.printf("請輸入提款金額 =>");

          int money = keyin.nextInt();

          int m = customer[acc].recM(money);

          if(m <0){

              System.out.printf("存款不足、請離開 !!\n");

              return;

          }  

          String name = customer[acc].name;

          System.out.printf("帳戶:%s目前餘額為:%d\n", name, m);

     }

    /* 查詢餘額  */

     public static void checkMoney(){

          System.out.printf("請輸入存款帳號 =>");

          String ID_Str = keyin.nextLine();

          int acc = checkAcc(ID_Str);

          if (acc < 0) {

              System.out.printf("無此帳號,請離開 !!\n");

              return;

          }

          int m = customer[acc].checkM();

          String name = customer[acc].name;

          System.out.printf("帳戶:%s目前餘額為:%d\n", name, m);    

     }

     /* 儲存資料 */

     public static void saveData() throws IOException {

         BufferedWriter outData = new BufferedWriter(new

 FileWriter(file_R));

         int[] ID_R = new int[13];

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

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

             long temp=0;

             ID_R = customer[i].getID();

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

                  temp = temp + ID_R[j];

                  temp = temp * 10;

             }

             temp = temp /10;

             outData.write(temp + "\t");

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

             outData.write(customer[i].checkM() + "\t");

             outData.newLine();

        }

        outData.close();

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

    }

}

7-6-3 自我挑戰:步驟(3)建立交易檔規格

(A) 系統功能:PM7_2_3.javaAccount.javatranscation.java

為了安全起見,一般銀行大多會儲存客戶處理帳戶的過程,可作為客戶查詢交易過程使用。因此,『藝術銀行』期望建立一個交易檔(Transcation.data)紀錄每一帳戶的每一筆交易(提款或存款),交易檔的每一筆資料記錄有:

  • 帳戶(String No

  • 日期(String date

  • 交易種類int type1 表存款;0 表提款)、

  • 交易量(int trade,其中交易量正數表示存款;負數表示提款。

請製作一個具有上述功能的類別(Transcation.class),並利用主程式輸入各項資料後,印出資料觀察是否可行。

7-6-4 自我挑戰:步驟(4)建立安全性存款系統

(A) 系統功能:PM7_2_4.javaAccount.javatranscation.java

交易檔類別建立之後,接著由 PM7_2_2.java 擴充。當客戶處理存款或提款功能時,皆會將交易資料寫入利用 Transcation.class 所建立的物件陣列內。功能選項也增加下列功能:

(1) 『顯示交易資料』:顯示所有客戶的交易資料。

(2) 儲存交易資料』:將帳戶資料寫入 deposit.data 檔案,也將交易資料寫入 transaction.data 檔案內。

(3) 『客戶交易查詢』:可供以帳號,查詢帳戶所有交易資料。

 

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: