题型:综合题 题类:常考题 难易度:困难
浙江省温州市2018届高三上学期信息技术期中考试试题
①把身份证前 17 位的每个数字和加权系数相乘并累加求和。身份证号码前17位数的加权系数见下表:
身份证号位数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
加权系数 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
②根据步骤①求得的和值,与11做取余运算得到序号,再根据序号提取校验码字符。如:所得和值除以11的余数为“0”,则对应的校验码为“1”。如下表:
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
校验码 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
若步骤②中提取的校验码和身份证号最后一位相同,则校验通过,否则校验失败。
某人根据上述原理设计了一个身份证校验VB程序,功能如下:程序启动时从数据库student.accdb中读入全校学生身份证数据(全校共15个班级),并在列表框List1中显示,单击“校验”按钮Command1,在列表框List2中输出各班身份证号出错学生的信息和出错人数,若某班无出错学生,则不显示。程序界面如图所示。实现上述功能的VB程序如下,请回答下列问题:
Const max = 1000
Dim n As Integer '存放学生人数
Dim sfzh(1 To max) As String, xm(1 To max) As String
'数组sfzh、xm分别存放学生身份证号、姓名
Dim bj(1 To max) As Integer, flag(1 To max) As Boolean
'数组bj、flag分别存放学生班级、身份证校验结果
Dim cw(1 To 15) As Integer '数组cw存放各班身份证号出错人数
Function check(x As String) As Boolean
'本函数功能:校验身份证号x,若校验通过返回True;否则返回False
Dim i As Integer, sum As Integer, xh As Integer, jym As String
Dim a(1 To 18) As Integer, w(1 To 18) As Integer
jym = "10X98765432" : sum = 0
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
For i = 2 To 18
sum = sum + a(i) * w(i)
Next i
xh = sum Mod 11
If = Mid(x, 18, 1) Then check = True Else check = False
End Function
Private Sub Form_Load()
'本过程从数据库中读入指定数据到数组sfzh、xm、bj,并在List1中显示
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"
'本过程其它语句略,学生人数存变量n,数组cw各元素初值置为0
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer
For i = 1 To n
If check(sfzh(i)) Then flag(i) = True Else flag(i) = False
Next i
For i = 1 To 15
For j = 1 To n
If bj(j) = i And flag(j) = False Then
List2.AddItem sfzh(j) + " " + xm(j)
End If
Next j
If cw(i) > 0 Then
List2.AddItem Str(i) + "班共有以上" + Str(cw(i)) + "个身份证号错误"
List2.AddItem ""
End If
Next i
End Sub
⑴预处理。用数组a存放不同的分值,数组b存放相同分数的人数,数组s存放高于此分数的人数,数组下标表示名次。依次从数据库读取每个学生的成绩(数据库中每个学生的成绩已降序存储,即从高到低排列),当读入数与前一个数相同时,该名次的人数加1,当读入数与前一个数不同时,名次加1,即数组下标加1,存储当前分数,求高于本分数的人数并存储。
举例:如果数据库中有一组成绩(降序):95,95,93,93,92,91,90,按上述算法处理,三个数组的最终结果如图所示。
数组/下标 | 1 | 2 | 3 | 4 | 5 |
a | 95 | 93 | 92 | 91 | 90 |
b | 2 | 2 | 1 | 1 | 1 |
s | 0 | 2 | 4 | 5 | 6 |
⑵对需要查找的成绩二分查找。读入需要查找的成绩x,在数组a中二分查找成绩,若找到,输出名次、相同分数的人数和高于本分数的人数;若找不到,输出“查无此分”。
程序代码如下,在横线处填入合适的代码。
Dim rank As Integer
Dim a(1 to 1000) As Integer ‘存放不同的分数值
Dim b(1 to 1000) As Integer ‘存放相同分数的人数
Dim s(1 to 1000) As Integer ‘存放高于此分数的人数
rank=0
Private Sub Form_Load()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim tmp As Integer, n As Integer
tmp=-1: n=0
conn.ConnectionString=“provider=Microsoft.ACE.OLEDB.12.0;data source=“App.Path+”Score.accdb”
conn.open
Set rs.ActiveConnection=conn
rs.open “Select * from score”
n=0
Do While Not rs.EOF
n=n+1
mark=rs.fields(“成绩”)
If mark=tmp Then ‘当前读入分数与上一个分数相同,则对应名次的人数增加1
b(rank)=b(rank)+1
Else ‘当前读入分数与上一个分数不同时
rank={#blank#}1{#/blank#} ‘名次增加1
a(rank)={#blank#}2{#/blank#} ‘存储当前分数到数组a中
s(rank)={#blank#}3{#/blank#} ‘求高于本分数的人数并存储至数组s
b(rank)=1 ‘将自身统计入同分人数
End If
{#blank#}4{#/blank#} ‘更新上一个分数
rs.Movenext
Loop
End Sub
Private Sub Command1_Click()
Dim x As Integer, low As Integer, high As Integer, mid As Integer
x=Val(Text1.Text)
low=1: high=rank
mid=(low+high)\ 2
Do While low <=high and {#blank#}5{#/blank#}
mid=(low+high)\ 2
If a(mid) < x Then
high=mid-1
Else
low=mid+1
End If
Loop
If a(mid)=x Then
Label1.Caption=“名次:“+mid+”同分人数:“+b(mid)+”高于此分人数:”+s(mid)
Else
Label1.Caption=“查无此分”
End If
End Sub
试题篮