居民身份证号码由十七位数字和一位校验码组成。从左至右依次为:六位地址码,八位出生日期码,三位顺序码和一位校验码。校验码生成规则:把身份证前 17 位的每一个数字和一串加权因子相乘后累加求和;将求得的和与11做取余运算得到校验码序号,最后在校验码字符串中提取与序号相对应的字符作为校验码。具体步骤如下:
(1)计算校验码序号:根据公式∑(ai×Wi) Mod 11 (i=2~18)计算得到校验码的序号;
其中:i:表示号码字符的位置序号,身份证号左边开始第1位的位置序号为18,第2位为17,依次类推,……最后一位的序号为1;
ai:表示第i位置上的号码字符的值;
Wi:示第i位置上的加权因子,通过公式w(i) = 2 ^ (i - 1) Mod 11计算得到。
(2)提取校验码字符:根据步骤(1)得到的序号提取对应的校验码字符。对应关系如下表所示,如:序号0对应校验码“1”,序号1对应校验码“0”。
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
校验码 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
若步骤(2)中提取到的校验码值和身份证号最后一位相同,则校验通过,否则校验失败(即身份证号有误)。
根据上述原理设计了一个身份证校验VB程序,功能如下:程序启动时从数据库student.accdb中读入学生身份证数据(共15个班级),并在列表框List1中显示,单击“校验”按钮Command1,在列表框List2中输出身份证号有误的班级、出错人数以及出错的学生信息。
实现上述功能的VB程序如下,请回答下列问题:
(1)分析程序,可知存放学生身份证信息的数据表为
________。
(2)请在划线处填入合适的代码。
Const max = 1000
Dim n As Integer
'存放学生人数
Dim sfzh(1 To max) As String, xm(1 To max) As String
Dim bj(1 To max) As Integer, flag(1 To max) As Boolean, cw(1 To 15) As Integer
Function check(x As String) As Boolean
Dim jym As String
Dim i As Integer, sum As Integer, xh As Integer
Dim a(1 To 18) As Integer, w(1 To 18) As Integer
jym = "10X98765432"
For i = 18 To 2 Step -1
a(i) = Val(Mid(x, 19 - i, 1))
Next i
For i = 18 To 1 Step -1
w(i) = 2 ^ (i - 1) Mod 11
Next i
sum = 0
For i = 2 To 18
______
Next i
xh = sum Mod 11
If Mid(jym, xh + 1, 1) = Mid(x, 18, 1) Then
check = True
Else
check = False
End If
End Function
Private Sub Form_Load()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
conn.ConnectionString = "provider=microsoft.ace.oledb.12.0;data source=" + App.Path + "\student.accdb"
conn.Open
Set rs.ActiveConnection = conn
rs.Open "select * from stu_info"
'本过程其余代码实现读取学生的身份证号、姓名和班级分别存数组sfzh、xm和bj中,并在列表框List1中显示,学生人数存变量n中。代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer
List2.Clear
For i = 1 To n
If
_____ Then
flag(i) = True
Else
flag(i) = False
End If
Next i
For i = 1 To 15
cw(i) = 0
Next i
For i = 1 To 15
For j = 1 To n
If
_____ Then
cw(i) = cw(i) + 1
List2.AddItem sfzh(j) + "
" + adj(xm(j), 3)
End If
Next j
If cw(i) > 0 Then
List2.AddItem Str(i) + "班共有以上" + Str(cw(i)) + "个身份证号错误"
End If
Next i
End Sub