试题

试题 试卷

logo

题型:综合题 题类:常考题 难易度:困难

浙江省温州市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程序如下,请回答下列问题:

(1)、某人身份证号的前17位为“33900520000101007”,根据上述步骤可计算出该身份证号的第18位校验码是
(2)、请在划线处填上合适的代码。

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

返回首页

试题篮