| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 562 人关注过本帖
标题:新手上路,请大神们帮忙看看
只看楼主 加入收藏
影蝶凤阁小鱼
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-9-14
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
新手上路,请大神们帮忙看看
身份证验证器.rar (2.77 KB)
为何两者不能够同时进行呀?????????如果验证最后一位是x为何其他的不能够执行啦!
搜索更多相关主题的帖子: 新手上路 
2013-10-08 17:31
Artless
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:4211
专家分:28888
注 册:2009-4-8
收藏
得分:20 
   If Right(y, 1) > "0" Then
w = Val(Right(y, 1))
   
End If
If Right(y, 1) <> "0" Then w = Right(y, 1)

无知
2013-10-09 11:22
影蝶凤阁小鱼
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-9-14
收藏
得分:0 
回复 2楼 Artless
不可以呀!这样的话以X结尾的身份证就无法实现啦!为何会发生冲突呢??????为什么两者只有能够选择其一?
2013-10-12 17:12
影蝶凤阁小鱼
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-9-14
收藏
得分:0 
请大家帮忙一下啦!
2013-10-12 17:17
影蝶凤阁小鱼
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-9-14
收藏
得分:0 
汗,怎么没人帮忙呀??????????
2013-10-16 08:59
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
收藏
得分:0 
全部变成数字就好判断了。取最后一位,判断最后一位是不是X,如果是吧最后一位当数字10即可,对你代码修改(仅command1_click和form_load部分)后如下:

Dim a(16) As Integer, b, c, d, w, h As Byte

Private Sub Command1_Click()
  Dim s
  Form_Load
  y = T1.Text
  For i = 0 To 16
    a(i) = Val(Mid(y, i + 1, 1))
    s = s + a(i) * b(i)
  Next
  w = UCase(Right(y, 1))
  If w = "X" Then w = "10"
  s = s Mod 11
  If d(s) = Val(w) Then
    MsgBox "此身份验证正确!请放心使用!", , "验证完毕"
  Else
    MsgBox "此身份验证不合格!请拘捕此人!", , "验证完毕"
  End If
  
End Sub

Private Sub Command2_Click()
  Unload Me
End Sub

Private Sub Form_Load()
  b = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
  d = Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2)
  Form1.Width = 4786
  Form1.Height = 3480
End Sub


Private Sub T1_KeyDown(KeyCode As Integer, Shift As Integer)
If T1.Text <> "" Then Command1.Enabled = True
End Sub

Private Sub T1_KeyPress(KeyAscii As Integer)
If KeyAscii = 27 Then
Unload Me
ElseIf KeyAscii = 13 Then
Command1_Click
End If

End Sub
Private Sub Timer1_Timer()

Randomize
L2.ForeColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)

L2.Left = L2.Left - 70

If L2.Left < -3000 Then L2.Left = 4300


 End Sub

2013-10-16 10:27
影蝶凤阁小鱼
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-9-14
收藏
得分:0 
回复 6楼 lowxiong
谢谢你啦!!!
2013-10-17 11:44
影蝶凤阁小鱼
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-9-14
收藏
得分:0 
问题已经解决...。。。。。。。。。
2013-10-17 11:45
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
收藏
得分:0 
回复 8楼 影蝶凤阁小鱼
如果修改为10也存在问题,就是尾数为0的和其他字母(非X字母,如a、b...等)会认为是合法的身份证,加入111111111111111110是合法,则11111111111111111a也会认为合法,其实不改为10也能解决,我当时只是为了不愿意对字符串数组赋值输双引号,偷懒才这样做的,其实身份证验证算法非常简单,代码如下(已通过验证):

Private Sub Command1_Click()
  Const 权值 = "7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2"
  Const 校验值 = "10X98765432"
  Dim Wi() As String, Ai() As Byte, S As Long, i As Integer, f As Boolean, W As String
  f = False
  If Len(Text1) = 18 Then                             '如果身份证字符长度为18位则执行验证,否则直接不合法
    W = UCase(Right(Text1, 1))                        '取校验位并对字母取大写(防止输入了小写x)
    Ai = StrConv(Left(Text1, 17), vbFromUnicode)      '取出身份证前17位(此时为这些字符的asc码,如数字0会是48)
    Wi = Split(权值, ",")                             '取出权值到数组中,是字符型数据,使用时要用函数val转换
    S = 0                                             '校验和清零
    For i = 0 To UBound(Ai)
      S = S + (Ai(i) - 48) * Val(Wi(i))               '将身份证数组中的asc码还原为数字并计算∑(Ai×Wi)
    Next
    S = S Mod 11 + 1                                  '计算出校验位置
    If W = Mid(校验值, S, 1) Then f = True            '如果数字s对应校验值位置处的字符等于校验字符则身份证合法
  End If
  If f Then
    MsgBox "该身份证合法,请予以放行!"
  Else
    MsgBox "该身份证非法,请拘捕此人!"
  End If
End Sub


[ 本帖最后由 lowxiong 于 2013-10-17 14:20 编辑 ]
2013-10-17 14:17
快速回复:新手上路,请大神们帮忙看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048240 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved