Translate

2010年3月23日 星期二

中台 - 98-2 物件導向程式設計 03/23練習



身份證檢查程式


範例:[ Download ]


學習重點

  • Procedure 設計
  • Function 設計
  • Array 陣列使用與操作
  • 字串、字元、ASCII 碼轉換

身份證認證公式

驗證規則 ( Source:戶證事務所) 
       身份證統一編號共計10 位,其中第一位為英文字母,後共有九個數字;
       而最後一位數字為檢查碼( Check Digit ) ,表示如下表:

       L1 D1 D2 D3 D4 D5 D6 D7 D8 D9 

L1: 英文字母, 代表出生地的縣/市代號
A=10 台北市 J=18 新竹縣 S=26 高雄縣
B=11 台中市 K=19 苗栗縣 T=27 屏東縣
C=12 基隆市 L=20 台中縣 U=28 花蓮縣
D=13 台南市 M=21 南投縣 V=29 台東縣
E=14 高雄市 N=22 彰化縣 * W=32 金門縣
F=15 台北縣 * O=35 新竹市 X=30 澎湖縣
G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山
H=17 桃園縣 Q=24 嘉義縣 * Z=33 連江縣
* I=34 嘉義市 R=25 台南縣

       D1: 性別,1=男, 2=女
       D2~D9: 檢查碼

       L1 對照表:
         字母A   B  C   D   E   F   G   H   J   K   L   M  N 
         代號10 11 12 13 14 15 16 17 18 19 20 21 22 
         -------------------------------------------
         字母P   Q   R   S   T   U   V   X   Y  W   Z    I   O
         代號23 24 25 26 27 28 29 30 31 32 33 34 35 

       令其十位數為X1 ,個位數為X2 ;( 如A=10:X1=1 , X2=0 )

       依其公式計算結果:
       Y= X1 + 9*X2 + 8*D1 + 7*D2 + 6*D3 + 5*D4 + 4*D5 + 3*D6 + 2*D7 + D8 + D9

       驗證
       假如Y能被10 整除,則表示該身份證號碼為正確,否則為錯誤。
即如以10 為模數,檢查號碼為( 10 - Y- D9 ) / 10 的餘數,
如餘數為0 時,則檢查碼為0 。



製作流程



○ 建立專案
○ 製作按鈕與Label、Edit元件
○ 建立全域一維陣列: NumberArray 大小為26 (NumberArray : array[0.. 25] of Integer ; )
○ 建立初使化程序 procedure initArray;

  • 進行NumberArray 初始化,其值以查表方式建立
    EX: NumberArray[0] := 10 ; //A
○ 建立輸入字串檢查函式驗證是否符合格式
   function CheckErr( idnum : String): Boolean;
  • 判斷是否長度相同 (使用Length()找出字串長度)
  • 判斷第一字母是否為大寫英文 (使用  if not( idnum[1] in ['A' .. 'Z']) then 判斷 )
  • 判斷第二個字是否為1(男),2(女)
  • 判段輸入是否為數字 (使用 if not(idnum[x] in ['0' .. '9']) then 判斷)

○ 建立身份證檢查函式
   function CheckID( IDstr : String): boolean


  • 取出第一個字母對應到NumberArray 的值 (以ASCII code 判斷做對照,byte(IDstr[1]) - byte('A');)
  • 取出該字母於array的對應值
  • 取出X1, X2值
  • 套入公式 :Y= X1 + 9*X2 + 8*D1 + 7*D2 + 6*D3 + 5*D4 + 4*D5 + 3*D6 + 2*D7 + D8 + D9
  • 若可被10除盡表該身份證為對
○ 輸出結果







BP: 這次的題目比較難,各位同學挑戰看看! 加油




沒有留言: