过程与自定义函数 知识点题库

【加试题】小强用VB编写正整数十进制转换为十六进制的程序,运行界面如图所示。程序功能如下:在文本框Text1中输入待转换的十进制值,单击“十进制转换十六进制”按钮Command1,在文本框Text2中输出转换结果。

请在程序的划线处填写合适的代码。

Private Sub Command1_Click()

        Dim a As String,s As String

        Dim r As Integer,x As Integer

        x = Val(Text1.Text)

        s = ""

        Do While x > 0

  ▲                 ‘①

            x = x \ 16

            If r > 9 Then

                a = Chr(r + 55)

            Else

                a = Str(r)

            End If

              ▲                 ‘②

Loop                     

        Text2.Text = s

        End Sub

  1. (1) 程序中①划线处应填入
  2. (2) 程序中②划线处应填入
【加试题】某对分查找自定义函数search()的VB程序段如下:

  Function search(key As Integer)As String

    Dim pos As Integer,i As Integer,j As Integer

    Dim nc As String

    i=1:j=6:nc=“”

    Do While i<=j

        m=Int((i+j)/2)

        nc=nc+Str(m)

        If d(m)=key Then

            Exit Do        ‘Exit Do表示退出Do While循环

        ElseIf key<d(m)Then

             j=m-1

        Else

             i=m+1

    End If

      Loop

      search=nc

    End Function

数组元素d(1)到d(6)的值依次为“23,34,45,65,78,98”,则下列说法正确的是 (  )

A . 调用函数search(25)的返回值为字符串“3  2” B . 调用函数search(34)的返回值为字符串“45  32” C . 调用函数search(56)的返回值为字符串“3  5  4” D . 调用函数search(98)的返回值为字符串“45  78  98”
十进制整数换成二进制整数采用“除2倒取余”法。十进制小数转换成二进制小数采用“乘2顺取整”法,具体做法是:用2乘十进制数的小数部分,得到一个积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。小刘根据以上方法编写了VB程序,运行界面如图所示。程序运行时,在文本框Text1中输入一个带小数的正十进制数(小于32767),点击“转换”按钮Command1,在文本框Text2中输出转化后的带小数的二进制数,精确到3位小数。实现上述功能的VB程序如下,请回答下列问题:

  1. (1) 按照本程序的功能,在Text1中输入数据9.78,点击“转换”按钮Command1,在Text2中输出
  2. (2) 请在划线处填入合适的代码.

    Private Sub Command1_Click()

      Dim i As Integer,pos As Integer

      Dim s As String,c As String,result As String

      Dim s1 As Single,s2 As Single

      result=" ": i=1

      s=Text 1.Text

      c=Mid(s,i,1)

      Do While c<>"."

        i=i+1

        c=Mid(s,i,1)

      Loop

      pos=i

          ①    

      s2 = Val("0."+Mid(s,pos +1))

      result=convert(s1)&"." & convert(s2)

      Text2.Text=result

    End Sub

    Function convert(x As Single)As String

      Dim temp As Integer,k As lnteger

      If x>=1 Then '整数转化为二进制

        temp=x Mod 2

        result=temp & result

        x=x\2

        Do While x <>0

          temp=x Mod 2

          result=temp & result

          x=x\2

        Loop

      Else  '小数转化为二进制,保留3位小数

        k=1

        Do While   ②   

          temp=Int(x*2)

          result=result & temp

                   ③     

              k=k +1

            Loop

        End If

        convert=result

      End Function

某校跳高比赛计分规则如下:每个高度每位选手最多试跳三次,成功记为1,失败或轮空记为0。如选手第一次试跳成功记为100,第二次试跳成功记为010,第三试跳成功记为001,三次失败则终止比赛。编写VB程序统计选手积分,在文本框Text1中输入姓名和成绩,在列表框List1中输出结果,其算法如下:1.将每个选手的跳高记录三位一组转换成十进制数存储到数组a (该数组元素的值都不相同)。2.先比较数组a中各数组元素的长度,长度长的排名在前;若长度相同的情况下从后往前依次比较字符大小,当前数值大的排名在前。程序运行界面如图所示:

请在划线处填入合适的代码。

Dim a(1 To 9) As String   '存储跳高成绩

Dim b(1 To 9) As String   '存储学生姓名

Dim c(1 To 9) As Integer

Private Sub Command1_Click()

Dim ch As String, tmp As Integer, t As Integer

Dim p As Integer, k As Integer, i As Integer, j As Integer

Dim s As String

s = Text1.Text: t = 0

For i = 1 To .

    If Mid(s, i, 1) <> "/" Then

        ch = ch + Mid(s, i, 1) 

    Else

        t = t + 1

        If t Mod 2 = 0 Then

          a(t \ 2) = zh(ch)

        Else

         

        End If

       ch = ""

    End If

  Next i

For i = 1 To t\2

c(i) = i

Next i

  For i = 1 To t \ 2 - 1

    p = i

    For j = i + 1 To t \ 2

       If Len(a(c(p))) < Len(a(c(j))) Then

          p = j

       ElseIf Len(a(c(j))) = Len(a(c(p))) Then

          k = Len(a(j)): flag = True

          Do While k >= 1 And flag

             If Val(Mid(a(c(j)), k, 1)) > Val(Mid(a(c(p)), k, 1)) Then

                p = j

                flag=false

             ElseIf val(Mid(a(c(j)), k, 1)) = val(Mid(a(c(p)), k, 1)) Then

                k = k - 1

             Else

               flag = False

             End If

          Loop

       End If

    Next j

    If p <> i Then

      tmp = c(i): c(i) = c(p): c(p) = tmp

    End If

  Next i

  For i = 1 To t \ 2

     

  Next i

End Sub

Function zh(cm As String) As String

  Dim temp As String

  Dim i As Integer, j As Integer

  For i = 1 To

     For j = 1 To 3

        temp =temp * 2 + Val(Mid(cm, (i - 1) * 3 + j, 1)) .

     Next j

     zh = zh + CStr(temp)     'CStr函数可把表达式转换为字符串类型

     temp = 0

  Next i

End Function

为分析数组a中各元素依次变化的情况,进行如下定义:

变化段:数组中相邻两个元素构成一个变化段。变化段有上升段(a(i)>a(i-1))、下降段(a(i)<a(i-1))和持平段(a(i)=a(i-1))。数组a中的n个元素可构成n-1个依次排列的变化段。

波峰:从上升段转到下降段形成一个波峰。波峰的起点是峰顶前所有连续上升段中的第1个,终点是峰顶后所有连续下降段中的最后1个。

对称波峰:上升段与下降段个数相同的波峰称为对称波峰。

下图为一组数据的变化段及波峰示意图。

现要求统计数组a各元素依次变化过程中“对称波峰”的个数。小李依据上述描述设计如下VB程序。请回答下列问题:

  1. (1) 数组元素“1,4,3,3,2,6,8,7,9,3,4,7,9,6,3,1”依次变化过程中“对称波峰”的个数为
  2. (2) 请在划线处填入合适的代码。

    Const n = 20

    Dim a(1 To n) As Integer

    Private Sub Form_Load()

    '读取数据,并存储到数组a中,代码略

    End Sub

    Private Sub Command1_Click()

    Dim flag As Integer    '存储变化段的状态:1表示升,-1表示降,0表示平

    Dim count As Integer      '存储对称波峰段的个数

    Dim steps As Integer

    Dim i As Integer

    flag = 0: steps = 0: count = 0

    For i = To n

    If a(i) > a(i - 1) Then

    If IsSymPeak(flag, steps) Then count = count + 1

    If flag = 0 Or flag = -1 Then

    Else

    steps = steps + 1

    End If

    flag = 1

    ElseIf a(i) = a(i - 1) Then

    If IsSymPeak(flag, steps) Then count = count + 1

    steps = 0

    flag = 0

    Else

    steps = steps - 1

    flag = -1

    End If

    Next i

    If IsSymPeak(flag, steps) Then count = count + 1

    Text1.Text = Str(count)

    End Sub

    Function IsSymPeak(flag As Integer, steps As Integer) As Boolean

    If Then

    IsSymPeak = True

    Else

    IsSymPeak = False

    End If

    End Function

某校最近开设了10节不同内容的选修课,课的编号为1~10。每位同学只能选报一门课。事先让学生做过问卷调查并根据自己的兴趣爱好填写了选课报名志愿表(无重复),如某同学的报名志愿表为4,1,2,7,3,5,8,10,9,6,表示他最想选报的课的编号是4(第一志愿),其次为1(第二志愿),以此类推。学校根据每位学生的问卷调查得分及选课报名志愿表进行了分班,每班30人。
分班方法:优先满足问卷得分最高同学的第一志愿,如果该同学第一志愿所报名人数超过30人,则尝试满足其第二志愿,以此类推,直至该同学选课成功。
编写程序实现选课分配功能并统计各志愿录取率情况:单击读取按钮Command1后,在列表框List1中显示每位学生的相关信息。单击统计按钮Command2后,统计第X志愿录取人数及录取率的统计结果清单,显示在列表框List2中。程序界面如图a所示。实现上述功能的VB程序代码如下,请回答下列问题:

  1. (1) 代码“List2.AddItem”中的AddItem是(单选,填字母:A .属性名/B .对象名/C .方法名/D .事件名)。
  2. (2) 在划线处填入合适代码。

     ② ③ 

   函数可分为两种类型。
给出只包含加、减、乘、除中一个运算符的算术等式,求该算术等式中的最小进制。如等式6*9=42,该等式中的数字均属于13进制。推算的算法是:

1)找出等式中单个数字的最大值;

2)从最大值加1的数制开始,按该数制的运算规则,把等式中所有数字转换成十进制数;

3)如果等式两边的结论是成立的,那么该数制就是符合上述等式的最小数制,否则从下一个数制重新计算,直到十六进制为止。

小明为此编写了一个VB程序,程序运行时,在文本框Text1中输入一个等式,单击“计算”按钮Command1,在文本框Text2中显示该等式中数字所属的数制。程序运行界面如下图所示。

  1. (1) 根据上述算法,则等式“5+7=13”成立,则该等式中的数属于进制数。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Private Sub Command1_Click()

    Dim s1 As String, ysf As String, t1 As String, t2 As String, t3 As String

    Dim ch As String, t As String, max As Integer, jz As Integer, i As Integer

    s1=Text1.Text

    t1=0: max=0

    For i=1 To Len(s1)

    ch=Mid(s1, i, 1)

    If ch=“+” Or ch=“-” Or ch=“*” Or ch=“\\” Then

        ysf=ch: t1=t: t=“ ”

    ElseIf ch=“=” Then

        t2=t: t=“ ”

    ElseIf ch >= “A” And ch <= “F” Then

        t=t+ch

        temp=

        If max < temp Then max=temp

    Else

        t=t+ch

        If max < Val(ch) Then max=Val(ch)

    End If

    Next i

    t3=t: jz=0

    Do While i <= 16

    If ysf=“+” Then

        If XtoD(i, t1)+XtoD(i, t2)=XtoD(i, t3) Then jz=i: Exit Do

    ElseIf ysf=“-” Then

        If XtoD(i, t1) - XtoD(i, t2)=XtoD(i, t3) Then jz=i: Exit Do

    ElseIf ysf=“*” Then

        If XtoD(i, t1) * XtoD(i, t2)=XtoD(i, t3) Then jz=i: Exit Do

    Else

        If XtoD(i, t1) / XtoD(i, t2)=XtoD(i, t3) Then jz=i: Exit Do

    End If

    i=i+1

    Loop

    If jz <> 0 Then

    Text2.Text=“该数属于” +Str(jz)+ “进制”

    Else

    Text2.Text=“没有找到合适的进制”

    End If

    End Sub

    Function XtoD(x As Integer, s As String) As Integer

    Dim j As Integer

    j=0

    For i=Len(s) To 1 Step -1

    XtoD=XtoD+Val(Mid(s, i, 1)) * x ^ j

     

    Next i

    End Function

给定两个十进制整数X和Y(X<=Y),求出从X到Y的所有整数中出现“1”的个数。例如:X=6,Y=15时,6,7,8,9,10,11,12,13,14,15,出现了7个“1”。小明编写了一个VB程序,功能如下:在文本框Text1中输入整数X,在文本框Text2中输入整数Y,单击“统计”按钮Command1后,在列表框List1中显示X到Y,并在标签Label3中显示从X到Y的所有整数中出现“1”的个数。程序运行界面如图所示,请在划线处填入合适代码。
  1. (1) 下列程序段中句List1.AddItem中的AddItem是 (填字母:A . 属性名/B . 事件名/C . 方法名/D . 对象)
  2. (2) 为了实现上述功能,请在划线处填入合适的代码。

    Private Sub Command1_Click()

    Dim x As Integer, y As Integer, t As Integer

    Dim i As Integer, n As Integer, count As Integer

    x = Val(Text1.Text)

    y = Val(Text2.Text)

    count = 0

    For i = x To y

    List1.AddItem Str(i)

    n = i

    Do While n > 0

    If n Mod 10 = 1 Then

          count = count + 1

    End If

       

      Loop

    Next i

    Label3.Caption = "X到Y之间1的个数有" +   +"个"

    End Sub

  3. (3) 如果删除加框处代码,并运行程序,在文本框Text1中输入“40”,在文本框Text2中输入“10”,单击“统计”按钮,则标签框Label3显示X到Y之间1的个数有个。
有如下程序,从数据库获取成绩,单击“读取数据”按钮将n个非降序数保存在数组cj(1)~cj(n)中,并将成绩显示在列表框中。在文本框中输入成绩key,单击“查找”按钮,在标签中显示大于等于该成绩的学生人数。

  1. (1) 界面中“查找”按钮的对象名为
  2. (2) 实现上述功能的 VB 程序如下,请在划线处填入合适的代码

    Dim cj(1000) As Integer, n As Integer

    Private Sub btncmd1_Click( )

    Dim i As Integer, j As Integer

    Dim k As Integer ,tmp As Integer

    For i = 2 To n

      tmp = cj(i)

      j = BinarySearch

      For k = i To j + 1 Step -1

        cj(k) = cj(k - 1)

      Next k

      cj(k) = tmp

    Next i

    For i = 1 To n

      List1.AddItem Str(cj(i))

    Next i

    End Sub

    Private Sub btncmd2_Click()

    Dim i As Integer

    i = BinarySearch(Val(Text1.Text), 1, n)

    Label2.Caption = "共有" ++ "位同学大于等于该成绩。"

    End Sub

    Function BinarySearch(key As Integer,i As Integer,j As Integer) As Integer

    Dim m As Integer

    Do While i <= j

    m = (i + j) \ 2

      If cj(m) >= key Then

        j = m - 1

      Else

        i = m + 1

      End If

    Loop

    BinarySearch =

    End Function

    Private Sub Form_Load()

    '从数据库获取n个成绩存储在 cj(1) ~cj(n)组中,代码略

    End Sub

有如下VB程序段:

Private Sub Command1_Click( )

  Dims As String, i As Integer

  s=Text1.Text

  For i=1 To 8 Step 2

      s=ds(s, i)

  Next i

  Text2.Text=s

End Sub

Function ds(s As String, m As Integer)As String

  Dim n As Integer

  n=Len(s)

  If m<1 0r m>n Then ds= "位置有误"

  If m=1 Then ds=Mid(s, 2, n-1)

  If m=n Then ds=Mid(s, 1, n-1)

  If m <n Then ds=Mid(s, 1, m-1)+Mid(s, m+1, n-m)

End Function

若在文本框Text1中输入“TXHOLLYCLASS”,执行该程序段后,文本框Text2中显示的是(  )

A . THLYLS B . XHLLCLSS C . TXHOLLY D . XOLCLASS
字符加密:用 VB 编写某字符串加密解密程序(仅针对 ASCII 码字符)。其加密过程如下:

1)对待加密的字符进行判断,如果是英文字符的,则将该字符后移2位(如:字符“A”转换成“C”,字符“Z”转换成“B”,字符“a”转换成“c”,字符“z”转换成“b”),其他字符保持不变;

2)求出每个字符的ASCII码,然后用7位二进制来表示,比如“4”的ASCII码为十进制52,转换为7位二进制为“0110100”;

3)从左至右依次记为第1,2,3……7位,分别把第3,4,5位取反。即0变1,1变0,至此“0110100”变为“0101000”,将此二进制转换为ASCII码为40,对应的字符为左括号“(”,即“4”经过加密后得到加密字符为左括号“(”。

在文本框Text1中输入ASCII字符,单击“加密”按钮Command1,则在文本框Text2中显示经过加密的字符。程序界面如图所示,请完成下列问题。

  1. (1) 若在文本框Text1中输入字符“4My5”,则在文本框Text2中显示的加密字符为
  2. (2) 实现上述功能的 VB 程序如下, 请在划线处填入合适的代码。

    Private Sub Command1_Click()

        Dim s As String, ch As String s = Text1.Text

        For i = 1 To Len(s)

            ch = Mid(s, i, 1)

            If ch >= "A" And ch <= "Z" Then

               

                ElseIf ch >= "a" And ch <= "z" Then     '让小写字母后移2位,代码略

            End If

            Text2.Text = Text2.Text +

        Next i

    End Sub

    Function jm(x As String) As String

        Dim a(1 To 7) As Integer, j As Integer, n As Integer, asc1 As Integer

        asc1 = Asc(x)

        n = 0

        For j = 7 To 1 Step -1

            If j = 3 Or j = 4 Or j = 5 Then a(j) = 1 - asc1 Mod 2

            Else

                a(j) = asc1 Mod 2

            End If

            n =

            asc1 = asc1 \ 2

        Next j

        jm = Chr(n)

    End Function

在美国国家信息交换码中,ASCII值从32到127是可以打印并显示的字符,把这96个字符随机调整次序,生成密码本。根据输入的密钥和明文,单击“加密”按钮Command1,输出密文。基本算法如下:

1)用数组mab分别记录1~96个字符的ASCII值,用数组zm记录对应字符在密码本中位置,如mab(9)=65,表示密码本中第9个字符是“A”,则对应的zm(65)=9;

2)把密钥中每个字符的ASCII值的各个数字进行累加(如Hi分别为(7+2)+(1+0+5)),将累加的和除以9取余数后加7,作为将密码本转换成二维表的列数;

3)每个明文在转换后二维表中位置作为密文,该位置是用十六进制表示的行号和列号。

程序运行的界面如下图所示:

实现上述功能的VB程序如下,请回答以下问题:

  1. (1) 若输入密钥为“AB”,则根据算法及密码本,字母“A”加密后的密文是
  2. (2) 请在划线处填入合适的代码。

    Dim Mab(96) As Integer        '存储密码本中每个字符的ASCII值

    Dim zm(127) As Integer         '存储ASCII值32至127的字符在密码本数组mab中的下标

    Private Sub Form_Load()

        '产生密码本及96个字符在密码本中位置,代码略。

    End Sub

    Function p(s As String) As Integer

        Dim i As Integer, t1 As Long

        Dim sum As Integer, s1 As String

        t1=0

        i=1

        Do While i<=Len(s)

            s1=Mid(s, i, 1)

            t1=Asc(s1)

           

            i=i+1

        Loop

        p=sum Mod 9+7

    End Function

    Private Sub Command1_Click()

        Dim i As Integer, t As Integer, hang As Integer

        Dim s As String, s1 As String, Lie As Integer

        List1.Clear

        s1=Text1.Text

        t=p(s1)

        Label5.Caption= “将密码本换成一张”+Str(t)+ “列的二维表”

        i=1

        Do While i<=96

            s=s+Chr(Mab(i))+ “”

            If i Mod t=0 Or i=96 Then

                List1.AddItem s

                s= “”

            End If

            i=i+1

        Loop

        wz= “123456789ABCDEF”

        s=Text2.Text

        For i =1 To Len(s)

            s1=Mid(s, i, 1)

           

            hang=(t1-1)\t+1

            lie=(t1-1) Mod t+1

            s2=

        Next i

        Text3.Text=s2

    End Sub

老张要准备一道晚宴,需要上n个菜,为了省事他在n个不同的餐厅订好了这些菜。现在他需要尽快取回这些菜,对于每一道菜,有两种取菜方式:

1)让各店的外卖员送货上门,对于第i个菜需要花费a(i)的时间。

2)自己去餐厅取回家,每次出门仅能取回一道菜,对于第i个菜,从出门到回家整个过程需要花费b(i)的时间。

每家餐厅都有各自的外卖员送菜,并且无论老张是否在家,他们都能把菜送到。为了节省时间,能由外类员送的菜尽量由外卖负各自送达,现在需要知道最少花费多少时间能集齐所有的菜。

比如n=4,a(i)=(30,70,40,50),b(1)=(20,10,20,30},那么花费时间少的方案是第一个菜和第三个菜让让外卖员送,第二个菜和第四个菜老张自己取,一共需要40分钟。

设计VB程序计算最少时间,界面如下图

实现上述功能的VB程序如下,回答以下问题:

  1. (1) 根据程序语句判断对象Lab3属于类。

    (单选,填字母:A .Form1/B .Label /C .TextBox / D .CommandButton)

  2. (2) 请在划线处填入合适的代码。

    Const n=4

    Dim a(1 To n) As Integer    'n道菜由每家餐厅外卖员送达耗时

    Dim b(1 To n) As Integer    'n道菜自取耗时

    Private Sub Form Load)

        '产生外卖送货各道菜耗时,并存储到数组a中,并显示

        '产生自取各道菜耗时,并存储到数组b中,并显示

        '代码略

    End Sub

    Private Sub Command1_Click()

        Dim i As Integer, max As Integer, ans As Integer

        Dim left As Integer, right As Integer, m As Integer

        For i=1 To n

            If a(i) > max Then       '外卖员送菜的最长时间

        Next i

        left= 1: right = max: ans = max

        Do While left <= right

            m= (left + right) \ 2

            If Then

                ans = m: right=m-1

            Else

                left=m+1

            End If

        Loop

        Lab3. Caption=“最快”+ Str(ans) + “分钟”

    End Sub

    Private Function check(t As Integer) As Boolean

        Dim total As Integer

        check = False

        For i =1 To n

            If a(i) > t Then

                total ='如果外卖来不及就自己取

            End If

        Next i

      If  Then check = True

    End Function

  3. (3) 程序中加框处代码有错,请改正。
某景区渡口游客可乘船往返于河的两岸,有m个人自河东去河西,n个人自河西返回河东。现有一艘船,最大载重量为wt,最多可同时载两人,船自河东出发,最后返回河东。所有人的体重不会超过wt,求把所有人载过河所需最少往返次数。编写一个VB程序,实现上述功能。程序运行时,在列表框List1中显示所有游客的体重和去向(W表示往西、E表示往东),如“132E”表示体重为132往东。单击“统计”按钮Command1,在标签Label1中显示最少往返次数。程序运行界面如图所示。

  1. (1) VB语句List1.AddItem" "中AddItem是 (单选,填字母:A .对象名/B .方法名/ C .属性名)。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Const m = 6, n = 8, wt = 200

    Dim d(1 To m + n) As String, a(1 To m + n) As Integer

    Private Sub Form_Load()

        '读取m + n 个人的体重及去向数据存入d 数组,代码略

    End Sub

    Private Sub Command1_Click()

        Dim i As Integer, p As Integer, q As Integer, s As String

        Dim num As Integer, num1 As Integer, num2 As Integer

        '以下代码实现从d 数组中提取每个人的体重数据,根据去向分段存入a 数组

        p = 1 : q =

        For i = 1 To m + n

            s = Mid(d(i), 1, Len(d(i)) - 1)

            If Mid(d(i),  , 1) = "W" Then

                a(p) = Val(s): p = p + 1

            Else

                a(q) = Val(s): q = q + 1

            End If

        Next i

        num1 = GetNum(1, m)

        num2 = GetNum(m + 1, m + n)

        If num1 > num2 Then num = num1 Else num = num2

        Label1.Caption = "过河需要最少往返次数:" + Str(num)

    End Sub

    Function GetNum(head As Integer, tail As Integer) As Integer

        Dim i As Integer, j As Integer, k As Integer, cnt As Integer, t As Integer

        '以下代码实现对数组a 降序排序

        i = head

        Do While i < tail

            k = i: i = tail

            For j =

                If a(j - 1) < a(j) Then

                    t = a(j): a(j) = a(j - 1): a(j - 1) = t

                    i = j

                End If

            Next j

        Loop

        cnt = 0: i = head: j = tail

        Do While i <= j

            If  Then j = j - 1

            cnt = cnt + 1: i = i + 1

        Loop

        GetNum = cnt

    End Function

  3. (3) 程序加框处的代码有误,请改正。
某阅卷系统设计如下:

读取学生答案文件后和标准答案进行对照并判分,题型分为单选、多选和填空。

单选阅卷规则:和标准答案一致得全部分数,错选或不选不给分

多选阅卷规则:和标准答案一致得全部分数,漏选给一半分数,错选或不选不给分

填空阅卷规则:标准答案表中允许有多种答案存在。学生的答案在标准答案中存在,得全部分数,不存在或未填不给分。

例如"学生答案.txt"内容如下:

张三|A|D|AC|AD|字符串|

李四|A|D|ACD|A|string|i>=0

标准答案:

题号

1

2

3

4

5

6

题型

单选

单选

多选

多选

填空

填空

答案

A

D

ACD

AD

字符串或string

i==0或i>=0

分值

2

2

2

2

2

2

程序执行结果:

张三 成绩: 9 分

李四 成绩: 11 分

  1. (1) 如果学生的答案数据为'王五|A|C|AD|ACD|string|i=0',则输出的结果是
  2. (2) 请在横线处填入合适的代码。

    def dx(s1,s2,n):        # 对多选题进行判分

      flag =True

      for i in s1:

        if :

          flag =False

          break

      if s1==s2:

        return n

      elif :

        return 0

      else:

        return n/2

    f=open('学生答案.txt')

    line=f.readline()       # 按行读取学生答案.txt 文件

    bzda=['单选','A',2,'单选','D',2,'多选','ACD',2,'多选','AD',2,'填空',['字符串','string'],2,'填空',['i==0','i>=0'],2]

    while line:

      studa=line.split('|')       # 将字符串以'|'为间隔分割成成多个字符串组成的列表

      zf=0

      for i in range(len(studa)-1):

        p=3*i

        if bzda[p]=='单选':       # 对单选题判分

          if studa[i+1]==bzda[p+1]:

            zf=zf+bzda[p+2]

        elif bzda[p]=='多选':        # 对多选题判分

          zf=

        else:

          if studa[i+1]!= '' and studa[i+1] in bzda[p+1]:

            zf=zf+bzda[p+2]

      print(studa[0],'成绩:',zf,'分')

      line=f.readline() # 读取下一行

    f.close( )

在过程调用中,参数的传递可分为传递和传递两种方式。
某学校某一年级共有m(偶数)个班级,在开展运动会期间,所有班级的学生随机站成一排并按位置顺序进行编号,已知共有n位同学。现要选取k位选手参加跳绳比赛,选取方法是:在排好的队列中选取连续的k位(k是偶数且k>=m)学生,要求每个班级至少有一位学生参加比赛,并且参赛的男生人数和女生人数相同。现要设计一VB程序,确定选取学生的起止位置,VB的部分界面如下图所示,加载窗体时,在List1中生成n个学生所处的位置和学生编号,其中位置就是学生所在队列中的位置,学生编号由两位数字构成,即班级+性别(0表示男生,1表示女生),在文本框Text1中输入抽取的学生的人数k,单击“抽取”按钮Command1,在列表框List2中显示满足条件的所有队列情况。

  1. (1) 若共有4个班级,学生排列的编号是11,21,30,11,40,41,30,21,20,10,11,20,31,40,若k=4,共存在种抽取方案。
  2. (2) 请在划线处填入适当代码。

    Dim s As String

    Dim i As Integer,sum As Integer

    Dim a(1 To 1000) As Integer

    Dim b(1 To 1000) As Integer

    Dim ton(1 To 6) As Integer      '存储选中队列中各个班级的人数

    Const m = 6

    Const n = 300

    Private Sub Form_Load()

        For i = 1 To n

            '随机生成n个学生编号显示在列表框List1中,并将学生的班级号和性别分别存储在数组a和b中

        Next i

    End Sub

    Private Sub Command1_Click()

        Dim j As Integer, k As Integer, tmp As Integer

        k=Val(Text1.text)

        For i = 1 To n – k + 1

            For j =

            If ton(a(j)) = 0 Then

                sum = sum + 1

           

            End If

            If xb(b(j)) = False Then tmp = tmp + 1

        Next j

        If  Then

            List2.AddItem Str(i) + Str(i + k - 1)

        End If

        sum = 0: tmp = 0

        For k = 1 To m

            ton(k) = 0

        Next k

        Next i

    End Sub

    Function xb(data As Integer) As Boolean

        xb = False

        If data = 0 Then xb = True

    End Function

某会务组根据参会者提交的入住宾馆和到达指定上车点时间的信息,安排车辆接送参会者去宾馆。不同宾馆的参会者分开接送,同一宾馆的参会者可同乘一辆车,每辆车最多接送v人,每个参会者的等待时间都不超过w分钟。参会者人住的宾馆和到达上车点的时间用长度为7的字符串表示,例如“A-09:15”表示参会者当天入住A宾馆,9点15分到达上车点,如果w为10,那么该参会者最晚9点25分出发:去宾馆。

编写VB程序,统计接送n个参会者所需的最少车辆数。运行程序,列表框List1中按入住宾馆分组显示所有参会者提交的信息,同一宾馆的按时间先后排列。单击“统计”按钮Command1,在文本框Text1中显示所需的最少车辆数。程序运行界面如图所示。

  1. (1) 如图所示,如果每辆车最多接送4人,每个参会者的等待时间不超过10分钟,接送所有到A宾馆的参会者最少需要辆车。
  2. (2) 实现上述功能的部分VB程序如下,请在划线处填入合适的代码。

    'n、v、w是常量

    'n为参会人数,v为每辆车最多接送人数,w为参会者最长的等待时间,代码略

    Private Sub Form_ Load()

        '读取n个参会者提交的信息,依次存入a(1)~a(n)

        '将a(1)~a(n)接入住宾馆分组,同一宾馆参会者按时间先后排序

        '并在List1中显示,代码略

    End Sub

    Private Sub Commandl_Click()

        Dim i As Integerj As Integer, sum As Integer

        a(n+1)=" "

        j=1: sum = 0

        For i-2 To n+ 1

            If Mid(a(i), 1, 1)< Mid(a(j),1,1)Then

               

                j=i

            End If

        Next i

        Text1. Text = Str(sum)

    End Sub

    Function getDif(tsl As String, ts2 As String) As Integer

        '返回ts1到ts2的时长(单位:分钟),代码略

        '例如ts1为"08:30",ts2 为"08:35",则返回的函数值为5

    End Function

    Function getCnt(first As Integer, last As Integer) As Integer   

         Dim s1 As String, s2 As String

         Dim iAs Integer, p As Integer, k As Integer,t As Integer

         p= first:k= 1

         s1 = Mid(a(first), 3, 5)

         For i= first+1 To last

             s2 = Mid(a(i), 3, 5)

             t= getDif(s1, s2)

             If  Then

                 k=k+1

                p=i

                

            End If

        Next i

        getCnt= k

    End Function

小明使用Python编写了某答题卡中单项选择题的判分程序,该单选题每题2分。扫描答题卡获取选项填涂信息,输入标准答案,程序自动判断并输出分数。具体方法为:

一个选项是否被填涂,可以从判断一个像素的颜色开始,像素的填涂情况是通过RGB的值来判断,灰度值低于132的表示该点被填涂;一个信息点64%的像素被填涂,则认为该区域已填涂,返回值为“1”。区域未填涂时返回值为“0”;各选项的编码为:A→“1000”,B→“0100”,C→“0010”,D→“0001”;输入标准答案,程序进行对比并返回结果。答题卡相关信息如下:

  1. (1) 某题的标准答案为“C”,该题填涂情况为“0100”,则分数为
  2. (2) 实现上述功能的程序如下,请在划线处填入合适的代码。

    from PIL import Image

    #输入起始点坐标(xs,ys),信息点宽度高度(fw, fh),间隔宽度高度(sw ,sh),代码略

    num = 5               # 判分个数

    def bw_judge(R, G, B):   # bw_judge用于判断一个像素的填涂情况 代码略

    def fill_judge(x, y):      # fill_judge用于判断信息点的填涂情况

        count = 0

        for i in range(x, x + fw + 1):

            for j in range(y, y + fh + 1):

                R, G, B = pixels[i, j]

                if bw_judge(R, G, B) = = True:

                    count = count + 1

        if count >= :

            return True

    total_width = fw+ sw

    total_height = fh + sh

    image = Image.open("t2.bmp")

    pixels = image.load()

    number = ""

    bz=[""]*num

    df=0

    bzd=input('请输入标准答案:')

    da={"A":"1000","B":"0100","C":"0010","D":"0001"}

    for i in range(len(bzd)):

        bz[i]=

    for row in range(num):                       #分数判定

        for col in range(4):

            y = ys + total_height * row

            if fill_judge(x, y) == True :

                number = number + '1'

            else:                           

                number = number + '0'

        if number = = bz[row]:

     df+=2

        number=""

    print("得分为:",df)