|
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 程式架構
|