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