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

 

7-4 自我挑戰:驗證身分證號

內容:

7-4-1 程式功能

『真水水塑身美容中心』希望建立一套客戶資料管理系統,登錄客戶資料,針對每位客戶包含有下列資料:

(1) 身分字號(String SID):須符合標準格式。

(2) 姓名(String name):

(3) 性別(String sex):僅提供女性服務。

(4) 年齡(int age):

(5) 地址(String addr):

請建立一個雛型客戶資料管理系統,測試系統規劃是否完備;該系統允許輸入客戶資料,再顯示是否正確。期望操作介面如下。

        (1) 編譯後,正常執行如下:

D:\Java2_book\chap7\PM7_1>javac Customer.java    【編譯 Customer.java

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

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

Customer.class

Customer.java

PM7_1.class

PM7_1.java

D:\Java2_book\chap7\PM7_1>java PM7_1

** 真水水朔身中心 建立客戶資料 **

請輸入 客戶姓名 =>張美麗

請輸入身分字號 = >A277465487

請輸入性別 =>

請輸入年齡 =>30

請輸入地址 =>高雄市鳥松區

=== 列印客戶資料 ===

身分證號        姓名  性別  年齡    地址

A277465487      張美麗        30      高雄市鳥松區

(2) 如果客戶身分證號錯誤,則系統會拒絕操作並離開,如下:

D:\Java2_book\chap7\PM7_1>java PM7_1

** 真水水朔身中心 建立客戶資料 **

請輸入 客戶姓名 =>劉美麗

請輸入身分字號 = >K123456723

這是偽造的 !!

程式停止運作

(3) 如果客戶不是女性,則系統會拒絕操作並離開,如下:

D:\Java2_book\chap7\PM7_1>java PM7_1

** 真水水朔身中心 建立客戶資料 **

請輸入 客戶姓名 =>劉大勇

請輸入身分字號 = >A277465487

請輸入性別 =>

僅服務女性 !! 對不起

程式停止運作

7-4-2 製作技巧提示

本系統最大的特點是,必須偵測所輸入的身分證字號是否正確,由這一點可觀察出來客戶所提供的資料是否偽造的。因此,需在客戶資料類別(Customer.class)必須提供此檢查功能。身份證號碼第一個字元 A ~ Z表示地區,第二個字元 1(男性)或 2(女性)表示性別,後面緊接著 7 個數字(0 ~ 9),最後是檢查碼(0~9),總共 10 個字。

檢查方法如下:首先將英文字母以(A=10 B=11 C=12 D=13 E=14 F=15 G=16 H=17 J=18 K=19 L=20 M=21 N=22 P=23 Q=24 R=25 S=26 T=27 U=28 V=29 W=30 X=31 Y=32 Z=33 I=34 O=35)轉換成數字,與原有數字組成 11 個數字;接著,第 1 數乘以 1、第 2 數乘以 9、第 3 個數乘以 8 ,依此類推第 9 個數乘以 2,第 10 個數乘以 1,將上述的結果相加,總和的個位數(num),再被 10 減的結果(10-mun),與第 11 個數字相同,則表示正確。

本系統需要 Customer.java PM7_1.java 兩只類別程式,前者規劃 Customer 類別使用;後者為主類別程式,本書僅提示 Customer.java 程式,另者請讀者自行編寫(請參考範例 Ex7_1.java)。

7-4-3 客戶物件 - Customer.class

吾人針對系統要求登錄客戶哪些資料與相關限制,製作了 Customer 類別(Customer.java),其功能架構如圖 7-7 所示,各項功能如下:

(a) int setSID(String No):設定客戶身份證字號方法。如果 No 字號符合標準格式,則執行正常,並回傳 1;否則拒絕操作並回傳 0

(b) int setSex(String Sex):設定客戶性別的方法。如果 Sex 為女性則執行正常,並回傳 1;否則拒絕操作回傳 0

(c) String getSID():取得客戶身份證字號的方法。

(d) String getSex():取得客戶性別的方法。

(e) String name:儲存客戶姓名的變數,可任意存取。

(f) int age:儲存客戶年齡的變數,可任意存取。

(g) String addr:儲存客戶地址的變數,可任意存取。

7-9 Customer 類別功能架構

7-10 Customer.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

//Customer.java

 

import java.util.Scanner;

class Customer {

    private String SID;        // 身分證字號, 須符合格式

    String name;               // 客戶姓名

    private String sex;        //     , 僅提供女性

    int age;                   //    

    String addr;               //    

 

    int setSID(String No) {   // 設定身分字號方法, 1: 正常, 0: 錯誤

         String[] dig1 = new String[10];   // 儲存身分證號字元

         int[] dig2 = new int[11];        // 儲存轉換後數字

         int temp;

 

         if (No.length() != 10) {

              System.out.printf(“ 10 個字元, 請重新輸入 !!”);

              return 0;

         }

         Scanner s = new Scanner(No).useDelimiter(“”);

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

             dig1[I] = s.next();

 

         temp = Character.getNumericValue(dig1[0].charAt(0));

         if (temp == 18)    // 字母 I, 設定為 34

              temp = 34;

         else if (temp == 24)  // 字母 O, 設定為 35

              temp =35;     

         else if((temp>18) || (temp < 24))  // J ~ N 前進 1 個數

              temp = temp – 1;

         else if (temp > 24)

              temp = temp – 2;         // P ~ Z 前進 2 個數

 

         for(int I=1; I<10; I++)

              dig2[I+1] = Integer.parseInt(dig1[I]);

         dig2[0] = temp / 10;

         dig2[1] = temp %10;

        

         int sum = dig2[0];       // 1 個數字乘以 1

         int k = 9;

         for(int I=1; I<10; I++) {       // 2 ~ 9 數字分別

              sum = sum + dig2[I] * k;   // 乘以 9 ~ 1 累加

              k = k-1;

         }

 

         int check = 10 –(sum % 10);    // 10 – 個位數

         if (check == dig2[10]) {      // 是否與第 11 數字相同

               SID = No;

               return 1;

         }

         else {

              System.out.printf(“這是偽造的 !! \n”);

              return 0;

         }

     }

            

    String getSID() {            // 讀取員工代號方法

         return SID;

    }

    int setSex(String Sex) {   //設定性別方法, 1: 正常, 0: 錯誤

         if (Sex.equals(“”)) {

              sex = Sex;

              return 1;

         }

         else {

              System.out.printf(“僅服務女性 !! 對不起 \n”);

              return 0;

         }

    }

    String getSex() {     // 取的客戶性別方法

         return sex;

    }

}

程式重點說明:

(1) 17~20 :『if (No.length() != 10) { …}』。檢視輸入身證號(No)長度是否 10 個字元,如不是則拒絕操作,中斷並回傳 0

(2) 21~23 :『Scanner s = new … 』。將輸入身份證字號(No)各個字元取出,並分別存入 dig[] 陣列中。

(3) 25~34 :『temp = Character.getNumericValue(..) …』。檢視身份正字號的第一個字母(A ~ Z),並轉換成相對應數字。

(4) 36~39 :將其餘身份證號碼,與第一個字母相對應的數字,分別依序存入 dig2[] 陣列中。

(5) 41~46 :累加計算 dig2[] 陣列內的數字。

(6) 48 :『int check = 10 –(sum % 10);』。10 減掉累積後的個位數。

(7) 49~58 :『if (check == dig2[10]) {…}』。與第 11 個數字比對是否相同,如是的話,格式相符;否則可能該身份證字號是偽造或輸入錯誤。

7-4-4程式 架構提示

請讀者自行編寫,程式架構如圖 7-9 所示。

7-11 PM7_1 程式架構

 

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: