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

【加试题】小龙编写了一个简易加法器VB程序,运行界面如图所示。在文本框Text1中输入一个数字后再输入空格表示一个加数输入完毕,连续不断输入不同的加数,待所有需要相加的数输入完毕后,单击“求和”按钮Command1后,在标签label1中显示加数的个数以及总和。(数字0和空格的ASCII码分别为48、32)

实现上述功能的VB程序如下,但横线处代码有错,请改正。

Private Sub Command1_Click()

    Dim a As String

    Dim x As Integer, s As Integer, k As Integer

    a = Text1.Text

    x = 1: s = 0: k = 0

    For i = 1 To Len(a)

        '如果输入的不是0到9的数字或者空格,则给出错误提示后结束子程序

        If (Asc(Mid(a, i, 1)) < 48 Or Asc(Mid(a, i,1)) > 57)  or(Asc(Mid(a,i,1))= 32)  then’Label1.Caption = "只能输入数字或空格"

            Exit Sub

        End If

        If Mid(a, i, 1) = " " Then

            s = s + Mid(a,x,i)

            x = i + 1

            k = k + 1

        End If

    Next i

    Label1.Caption = "这" + Str(k) + "个数的和为:" + Str(s)

End Sub

【加试题】小李编写VB程序,实现从某一字符串删除指定的连续字符串,并将处理后的字符串重新输出,程序界面如图所示,在文本框Text1中输人原始字符串,在文本框Text2中输入需要删除的连续字符串,单击Command1后,存寸本榧Text3中输出府h弹后的结果。

实现上述功能的VB程序如下.但加框处代码有错,请改正。

  Dim P As String,k As String,x As Integer

  Function f(a As Integer)As Boolean

    f=false

    If Mid(p,a,Len(k))=k Then f=True

  End Function

  Private Sub Command1_Click()

  Dim x As Integer,result As Strin9,flag As Boolean

    result=""

    p=Text1.Text

    k=Text2.Text

    For x=1 To Len(P)-Len(k)+1

         If Not f(x) Then

            result=result+Mid(p,x,1)

         Else

                              ‘(1)

         End If

    Next x

    Text3.Text=result+      ‘(2)

  End Sub

  1. (1) 处加框代码应改为

  2. (2) 处加框代码应改为

【加试题】某校根据考生名单次序安排试场座位,试场座位分布为“S”形。例  如试场安排为5组6排,则第一试场内考生座位分布如图1所示,超过该试场人数的考生,将按相同规则顺延至下一考场,且每场第一组座位都从上至下排列。座位安排算法如下:

⑴根据每试场安排的人数,判断输入的试场号是否在试场总数范围内,若是则转到⑵,否则重输试场号;

⑵根据考生次序和试场人数,计算每一考生所在试场号存入数组sc;

⑶计算考生在本试场中的次序,再根据试场安排的排数,计算考生座位所在的组数和排数,分别存人数组z和数组P。座位分布为“S”形,奇数组和偶数组座位排列顺序不同。

根据以上算法编写VB程序,在文本框Text1中输入组数,在文本框Text2中输入排数,在文本框Text3中输入试场号,单击“查询”按钮Command1,在List1中显示该试场座位表(名字前的数字是考生在名单中的次序),运行界面如图2所示。

  1. (1) 试场安排为7组5排,“S”形分布方式如上,则名单中第50个考生将被排在        (填写格式如:第X试场第X组第X排)。

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

    Dim xm(1 To 1 000)As String

    Dim n As Integer

    Private Sub Form_Load()

    ‘本过程从数据库中读取考生姓名存储在xm数组,考生人数存储在n变量中,代码略

    End Sub

    Function qxs(a As Single)As Integer

        qxs=Abs(Int(a*(-1))

    End Function

    Private Sub Command1_Click()

    Dim X As Integer,i As Integer,k As Integer,num As Integer

    Dim sc(1 To 1 000)As Integer         ‘存储考生所在试场号

    Dim z(1 To 1 000)As Integer        ‘存储考生座位所在的组数

    Dim p(1 To 1 000)As Integer         ‘存储考生座位所在的排数

    sc_z=Val(Text1.Text)               ‘存储试场安排的组数

    sc_p=Val(Text2.Text)                ‘存储试场安排的排数

    ‘list1中输入“讲台”字样,代码略

    num= sc_z*sc_p

    x=Val(Text3.Text)

    If x>0 And    ①    Then

        For i=1To n

           sc(i)=qxs(i/num)

            k=i Mod num

            z(i)=qxs(k/sc_p)

            If k<>0 Then

                If z(i)Mod 2=1 Then

                  p(i)=k-(z(i)-1)* sc_P

                Else

                  p(i)=    ②    -(k-(z(i)-1)* sc_p)

                End If

            Else

                z(i)= sc_z

                 If z(i)Mod 2=0 Then p(i)=1 Else    ③   

        End If

    Next i

    ‘本过程实现在List1中显示x试场座位表,代码略

    Else

        MsgBox(“输入的试场号,已超出试场总数,请重输”)

        Text1.Text="  "

        Exit Sub

    End If

    End Sub

     ② ③ 

编写VB程序,界面设计如图所示,使其具有下列功能:在文本框Text1中输入一个小于20的正整数n,单击“计算”按钮Command1,计算斐波那契数列中第n项的值,并在标签Label2中输出结果;若输入错误,则在标签Label2中显示相应的提示信息。(斐波那契数列是指这样的数列:1,1,2,3,5,8,13…。即:第1项和第2项的值均为1,从第3项开始,每一项的值是它前面两项之和)

  1. (1) 代码“Private Sub Command1_Click()”中的Command1 是(单选,填字母:A .对象名/B .属性名/C .属性值/D .事件名)。
  2. (2) 为实现上述功能,请在划线处填入合适的代码。

    Private Sub Command1_Click()

    Dim n As Long,k As Integer

    Dim f1 As Long,f2 As Long,f As Long

    If n>=20 Or n<=0 Then

    Label2.Caption=”输入的数据有误”

    Else

    If n<=2 Then         ‘第1,2个元素的值都为1

    f=1

    Else

    f1=1

    f2=1

    For k=3 To n

    f=f1+f2

    f1=f2

    f2=f

    Next k

    End If

    Label2.Caption = ”斐波那契数列第” + Str(n) + ”项的值为” +

    End If

    End Sub

  3. (3) 若在文本框Text1.Text输入21,则标签Label2显示的内容为
有一个10*10的场地,要在场地上放入若干件正方形货物。算法描述:

⑴货物逐个尝试放入,搜索场地矩阵(从左到右,从上到下),若某块区域能放下该货物,则标记这些相应位置为货物编号,然后返回左上角检测下一货物。

⑵搜索时,若右侧剩余列小于货物边长,则跳转到下一行,若下方剩余行小于货物边长,则直接返回检测下一货物,直到所有货物检测完毕。

小武同学根据上述算法设计了VB程序。程序运行,在列表框list1降序输出货物规格,点击“存放”按钮command1,在列表框list2输出摆放完成的场地矩阵。

算法的VB程序如下,回答下列问题。

  1. (1) 若货物4的尺寸改为4*4,其他不变,则货物9会被放在 (填数组下标)
  2. (2) 在程序划线处填上合适代码,使程序完整

    Dim hw(1 To 9) As Integer '存储正方形货物的边长

    Dim cd(1 To 100) As Integer  '场地是边长为10的正方形

    Private Sub Command2_Click()

      Dim i As Integer, j As Integer, wz As Integer, s As String

      For i = 1 To 9

        j = 1

        Do While (10 - (j - 1) \ 10) >= hw(i)   '下方空间足够

          If    ①   = False Then  '从当前位置开始能否放下

            j = j + 1

          Else  

            '把相关位置标记为i,并处理下一货物,代码略

          End If

    If 10 - (j - 1) Mod 10 < hw(i) Then  ‘右侧空间不足

       ②  

          EndIf

        Loop

      Next i

     ‘在列表框list2输出整个场地放好货物之后的矩阵图,代码略

    End Sub

    Function pd(start As Integer, bc As Integer) As Boolean

      Dim i As Integer, wz As Integer

      pd = True: wz = start

      Do While wz <= start + 11* (bc - 1) And wz <= 100

        If    ③   Then    

          pd = False

          Exit Function

    ElseIf (wz - 1) Mod 10 - (start - 1) Mod 10 = bc - 1 Then

          wz =  wz + 11 - bc     ‘位置转到下一行,与起点同列

        Else

          wz = wz + 1

        End If

      Loop

    End Function

    Private Sub Form_Load()

      ‘生成货物边长,降序显示在列表框list1,矩阵元素初始化为0,代码略

    End Sub

     ② ③ 

编写VB程序,实现如下功能:在文本框Text1中输入二进制数,单击“转换”命令按钮Command1,在文本框Text2中输出对应的十六进制数。程序运行界面如图所示,请回答下列问题:
  1. (1) 如果输入的二进制数为“1101010”,则得到的结果为 。
  2. (2) 实现上述功能的 VB 程序如下,请在划线处填入合适代码。

    Private Function bw(x As Integer, y As String) As String

    '函数bw功能:若二进制位数不足,通过在前面添"0"使得位数为4的倍数

        Dim r As Integer, i As Integer

        r = x Mod 4

        If r <> 0 Then

           For i = 1 To 4 - r

              y = "0" + y

           Next i

           x = Len(y)

        End If

        bw=  

    End Function

    Private Sub Command1_Click()

       Dim m As String, n As Integer, i As Integer, a As Integer

       Dim s As Integer, s1 As String, j As Integer

       m = Text1.Text

       n = Len(m)

       Text2.Text = ""

          m =    ’调整 m 的位数为 4 的倍数

       For i = 1 To n - 3 Step 4

       s = 0

          For j = i To i + 3

             a = Val(Mid(m, j, 1))

             s = 

          Next j

          If s >= 10 Then

             s1 = Chr(Asc("A") + s - 10)

          Else

             s1 = CStr(s)      '函数 CStr 类似于 Str,但无前导空格

          End If

          Text2.Text = Text2.Text + s1

    Next i

    End Sub

编程找出100到1000之间满足以下条件的整数:该数和该数平方合并后的数字串中不存在重复的数字。例如209,其平方数为43681,209和43681合并后的数字串“20943681”中无重复数字,209就是符合条件的数。实现上述功能的VB代码如下,但加框处代码有错,请改正。

Private Sub Command1_Click()

Dim x As Integer, y As Long, st As String

For x=100 To 1000

y=x^2

st=Str(x) & Str(y)

If     Then    ‘①

List1. AddItem"x: "& Str(x) & "x2: "&Str(y) &"x&y: "& Str(st)

End If

Next x

End Sub

Private Function judge(s As String) As Boolean

Dim a(1 To 100) As String

For i=1 To Len(s)

a(i) =Mid(s, i, 1)

Next i

For i =1 To Len(s)-1

For j=i+ 1 To Len(s)

If  Then Exit Function.      ‘②

Next j

Next i

Judge=True

End Function

显示游戏程序的得分,方法为:先定义显示字体,然后将score显示出来。为了增加代码的复用性,以便游戏循环中状态更新时反复调用,可以定义成一个函数showscore。

def ():        #定义函数,显示分数

textfont=() #字体为Arial,大小30

#生成平滑的红色字符串

t=()('score:'+str(score),True, (255,0,0))

screen.blit(t,[50,50])     #在窗口显示

某打靶比赛规则如下:n名参赛人员进行m轮比赛,每人每轮打靶3次,取3次中的最高分作为该轮比赛的成绩,统计每位选手m轮比赛的总分,再根据总分进行排名。

程序功能如下:加载窗体,程序将相关数据存储到数组a、数组b,并显示在列表框List1中,然后单击“统计”按钮Command1,在列表框List2中显示统计结果。数组b各元素含义如图a所示。程序运行界面如图b所示。

请回答下列问题:

  1. (1) 下列对象中,没有 Caption 属性的是(单选,填字母:A .Command1 / B .Form1 / C .List1 / D .Label1)。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Dim n As Integer, m As Integer

    Dim a(1 To 1000) As String

    Dim b(1 To 3000) As Single

    Private Sub Form_Load()

      '将参赛人数存入变量n,比赛轮数存入变量m中

      '将选手序号存储到数组a中、打靶成绩存储到数组b中,并显示在列表框List1中,代码略

    End Sub

    Private Sub Command1_Click()

      Dim i As Integer, j As Integer, t As Integer

      Dim max As Single, s1 As String, s2 As Single

      Dim sum(1 To n) As Single

      '对数组 sum 中各元素赋初值 0,代码略

      For i = 1 To m

        t =  

        For j = 1 To n

          max = fm(b(t + (j - 1) * 3 + 1), b(t + (j - 1) * 3 + 2))

          max =

          sum(j) = sum(j) + max

        Next j

      Next i

      For i = 2 To n          '按总分对参赛人员进行排序

        j = i - 1

        s1 = a(i)

        s2 = sum(i)

        Do While

          a(j + 1) = a(j)

          sum(j + 1) = sum(j)

          j = j - 1

        Loop

        a(j + 1) = s1

        sum(j + 1) = s2

      Next i

      For i = 1 To n

        List2.AddItem "第" + Str(i) + "名" + a(i) + " " + Str(sum(i))

      Next i

    End Sub

    Function fm(x As Single, y As Single) As Single

      '返回 x、y 中的较大值,代码略

    End Function

某VB应用程序的代码如下:

Function res(x As Integer,y As Integer,z As Integer)As Integer

  Dim temp As Integer

  If x>y Then temp=y Else temp=x

  If temp>z Then temp=z

  res=temp

End Function

Private Sub Command1_Click()

  Dim a As Integer,b As Integer,c As Integer

  a=5:b=3:c=7

  Text1.Text=Str(res(a,b,c))

End Sub

程序运行时,单击命令按钮Command1后,在文本框Text1中显示的内容是(  )

A . 0 B . 3 C . 5 D . 7
小发报名参加“智力大冲浪”节目。比赛规则如下:比赛开始时,参赛者将预先得到M元奖金。比赛时间分为N(N≤100)个时段,有N个小游戏,每个时段完成1个,第i个小游戏必须在规定时段t(i)

(1≤t(i)≤N)内完成,可以提前完成,但不能晚于该时段完成,否则要从奖金M元中扣去一部分奖金w(i),w(i)为自然数,不同的游戏扣去的奖金是不一样的。每个游戏必须从整时段开始。请间小炫如何安排自己做游戏的顺序,才能赢取最多的奖金?将结果输出到文本框Text1中。注意;比赛绝对不会让参赛者赔钱。例如:当N=5,M=100时,

游戏编号

1

2

3

4

5

完成期限t(i)

1

4

2

3

2

扣除奖金数w(i)

5

4

10

8

7

最优方案为:

完成时段

5

4

2

3

1

其中第一个游戏无法在期限内完成,扣除5元,最后赢取100-5=95元。

章法思想:让扣款高的游戏尽量准时完成,扣除的奖金越少,则最后赢取的奖金越多。

⑴按扣款数值从大到小排序,顺序为3,4,5,1,2。

⑵对于游戏,在时间段1到t(i)内完成的效果都是一样的,所以尽量在时间段t(i)内完成,若该时段

  已经被占用,则依次考察时间段t(i)-1,t(i)-2…,1。

  ①考虑游戏3,放置在时间段2完成(注:t(3)=2);

  ②考虑游戏4,放置在时间段3完成(注:t(4)=3);

  ③考虑游戏5,时间段2已经被游戏3占用,放置在时间段1完成(注:t(5)-1=1);

  ④考游游戏1,时间段1已经被游戏5占用,不能按时完成,放到时间段5;

  ⑤考虑游戏2,放置在时间段4完成(注:t(2)=4)。

  实现上述功能的VB程序如下。请在画线处填入合适的代码。

  Dim N As Integer,M As Integer

  Dim t(1 To 100)As Integer    ‘变量t(i)表示第i个游戏的完成期限

  Dim w(1 To 100)As Integer    ‘变量w(i)表示未完成第i个游戏要扣除的奖金

  Dim f(1 To 100)As Boolean    ‘变量f(i)表示第i个时段是否已经被占用

  Private Sub Form_Load( )

  ‘生成时段数量N和初始奖金数M

  ‘生成t数组和w数组

End Sub

Sub swap(x As Integer,y As Integer)    ‘自定义过程,可以用Call语句来调用该过程

  Dim z As Integer

  z=x:x=y:y=z

End Sub

Sub sort( )          ‘自定义过程,可以用Call语句来调用该过程

  Dim x As Integer, I As Integer, j As Integer

  For i=1 To N-1

    For j=i+1 To N

      If w(i)<w(j)Then

          Call swap(w(i),w(j))    ‘调用自定义过程

               ①   

      End If

    Next j

  Next i

End Sub

Private Sub Command1_Click( )

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

  Call sort         ‘调用自定义过程

  tot=0

  For i=1 To n

      f(i)=True

  Next i

  For i=1 To N        ‘对每个游戏从该游戏的规定期限开始往左找时间段,找到则完成该游戏

      p=-1

      k=t(i)

      Do While k>0 And p=-1

              If f(k)=True Then

              p=k

            Else

               ②   

            End If

      Loop

      If p=-1Then tot=tot+w(i)

  Next i

     ③   

  Text1.Text=Str(ans)

End Sub

以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③

下列程序运行显示为(   )

def hello():

    print("hello")

res = hello()

print(res)

A . 图片_x0020_100015 B . 图片_x0020_100016 C . 图片_x0020_100017 D . 图片_x0020_100018
小王编写一个VB程序模拟数据筛选,功能如下:程序运行时从数据库中读取成绩数据,按升序排序后在列表框List1中显示,在文本框Text1中输入成绩1,在文本框Text2中输入成绩2,单击“筛选”按钮Command1,筛选出大于等于成绩1且小于等于成绩2的记录,并显示在列表框List2中,程序运行界面如图所示。
  1. (1) 运行上述程序,若在文本框Text1中输入75,Text2中输入85,单击“筛选”按钮,则筛选到的记录有条(填数字)。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Const n = 20

    Dim score(1 To n) As Single

    Function adj(s As String, n As Integer)

    ‘此函数功能:在字符串 s 前添加若干个空格,使其长度变为 n。代码略

    End Function

    Function search_left(key As Integer)

    ‘此函数功能:返回大于等于 key 的数组元素的起始位置。代码略。

    End Function

    Function search_right(key As Integer)

        Dim i As Integer, j As Integer, m As Integer

        i = 1: j = n

        Do While i <= j

            

            If key >= score(m) Then i = m + 1 Else j = m - 1

        Loop

       

    End Function

    Private Sub Form_Load()

    ‘从数据库中读取成绩存数组 score,记录数存 n,并对此数组 score 升序排序,代码略

    End Sub

    Private Sub Command1_Click()

        Dim num1 As Integer, num2 As Integer, first As Integer, last As Integer

        List2.Clear

        num1 = Val(Text1.Text): num2 = Val(Text2.Text)

        first = search_left(num1): last = search_right(num2)

       

        If total <= 0 Then

            List2.AddItem "无筛选到的记录!"

        Else

            List2.AddItem "筛选到" + Str(total) + "条记录!"

            List2.AddItem "依次是:"

            For i = first To last

                List2.AddItem adj(Str(i), 3) + adj(Str(score(i)), 6)

            Next i

        End If

    End Sub

五子棋游戏规则:⒈对局双方各执一色棋子(黑和白);⒉每局黑方先下:⒊双方交替下子,每次只能下一子:⒋当一方棋子先连成五子即获胜(即横、竖或斜任意一个方向均可)。编写一个VB程序,单击“读取”按钮Command1读取五子棋某个状态的棋盘数据,单击“判断”按钮Command2,显示判断结果。运行界面如图所示:

●若双方已经分出胜负,则显示胜方及连成五子的第一颗棋子的位置(行号及列号)。

●若双方未分出胜负,则显示当前状态下将下棋的一方。

  1. (1) 若棋盘上的黑白棋子数量不相等时,则将下子的一方是
  2. (2) 编写如下VB程序,请在划线处填入合适的代码。

    Constn= 10

    Dim s(1 To 400) As String

    Private Sub Command1_ Click)

    ‘读取棋盘数据存储在数组s中,●表示黑子,o表示白子,o表示空位,代码略

    End Sub

    Private Sub Command2_ Click()

        Dim i As Integer, j As Integer, fag As Boolean

        flag= False:i= 1

        Do While i <= n And flag = False

            For j= 1 Ton

                If Then flag = True: Exit For

            Next j

            i=i+ 1

        Loop

        i=i- 1

        If flag Then

            If (i-1)*n+j) = "o" Then

                Label1.Caption = "白方胜" + Str(i) + Str(j)

            Else

                Label1.Caption = "黑方胜" + St(i) + Str(j)

            End If

        Else

            If counts() Then Label1.Caption="黑方下" Else Label1.Caption ="白方下"

        End If

    End Sub

    Function judge(x As Integer, y As Integer) As Boolean

        Dim dx(1 To 4) As Integer, dy(1 To 4) As Integer

        Dim flag As Boolean,j As Integer, i As Integer, ux As Integer, uy As Integer

        dx(1)= 1: dx(2)= 1: dx(3)= 1:dx(4)= 0

        dy(1)= 1: dy(2)= 0: dy(3)=-1: dy(4)= I

        flag = False:i= 1

        If s((x-1)*n+y) <> "o" Then

            Do While i<= 4 And flag = False

                flag = True

                For j= 1 To 4

                    ux= dx(i)*j+x

                    uy=dy(i)*j+y

                    If Not (ux>= 1 And ux <= nAnd uy>= I And uy <= n) Then flag = False: Exit For

                    If  Then flag = False: Exit For

                Next j

                i=i+ 1

            Loop

        End If

        judge = flag

    End Function

    Function counts() As Boolean

        Dim iAs Integer, j As Integer, white As Integer, black As Integer

        counts = False:white = 0: black= 0

        For i=1 To n

            For j= 1 Ton

               If(i-1)* n+j)= "o" Then white = white+ 1

               If((i-1)*n+j)= "●" Then black = black + 1

           Next j

        Next i

        If  Then counts = True

    End Function

为方便习题讲解,需对某次考试中选择题得分率数据进行统计分析,找出选择题得分率最低的前m项对应的题号及考点(若有与第m项得分率相同的,并选取)。

编写VB程序,实现上述功能。运行程序时,先读取每个选择题的题号、得分率和考点,显示在列表框List 1中。在文本框Text 1中输入得分率最低的前m项值,单击“统计”按钮,按照得分率从小到大升序排序,并在列表框List 2中输出得分率最低前m项的题号、得分率及考点。程序运行界面如图所示。

请回答下列问题:

  1. (1) “统计”按钮的事件过程名是
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Dim n As Integer

    Dim th(0 To 100)As Integer,df(0 To 100)As Single,kd(1 To 100)As String

    Private Sub Form_Load( )

        ‘读取题号、得分率和考点分别存入数组th、df和kd数组,在列表框List 1中显示,代码略

        ‘选择题的个数存入变量n,代码略

    End Sub

    Function dq(x As String,k As Integer)As String

        ‘固定数据的位数

        dq= X

        Do While

            dq=dq+""

        Loop

    End Function

    Private Sub Select _Click( )

        Dim m As Integer,i As Integer,j As Integer,p As Integer,t As Integer,mm As Integer

        List 2.Clear

        m=Val(Text1.Text)

        i=1

        Do While i<=n-1

            p=i

            For j=i+1 To n

                If Then p= j

            Next j

            If p<i Then

                t=th(i):th(i)= th(p):th(p)= t

            End If

            If  Then Exit Do

            i=i+1

        Loop

        For i=1 To m

            List 2.AddItem dq(Str(th(i)),6)+ dq(Str(df(th(i))),8)+ dq(kd(th(i)),12)

        Next i

    End Sub

  3. (3) 程序中加框处代码有错,请改正。
从前有一只九尾狐叫小九,他拥有超高的智商,喜欢数学推理。最近他喜欢上了利用约瑟夫环玩推理纸牌的游戏。即给定n张环形排列的纸牌,选定最小的一张牌为起始位置。第一次取第1张牌(起始位置的纸牌),第二次间隔1张取第3张纸牌,第三次

间隔2张取第6张纸牌,……直到取完为止(如果取的位置超过n,重新从1位置取)。如果有4张纸牌,那么取的纸牌编号依次为1,3,4,2。同样,可以知道每张纸牌的被取走的顺序如下表。

序号

1

2

3

4

1

轮次

1

2

1

3

1

4

1

2

轮次

2                     2

2

4

2

3

轮次

3

2

3

4

轮次

4

纸牌被取走顺序也可以理解为纸牌存留的轮次。每次取走一张纸牌后,下一轮第一张纸牌编号为该纸牌的后一张。上述例子中3第二个被取,留存轮次2,下一轮的第一张纸牌为4,剩下的纸牌留存轮次增加。

现在,只要给小九纸牌的数量n,他能通过逆推法快速地计算出取的纸牌编号顺序,方法如下(以n=4为例):

逆推得到的纸牌顺序

1

4

2

3

最终得到的纸牌编号

1

2

3

4

即在第i轮,上一轮纸牌轮次加1,并在后面增加一张轮次为1的纸牌。然后将轮次为1放在最前的位置,最后整体循环向右移动n-i次。直到n轮后,可知每张纸牌被取走的顺序,根据此顺序,得到每次取走纸牌的编号。

轮次

数组

1    2    3    4

1

a(1)=1

1

2

①前一轮所有值加1

②第二位增加数值1

③将轮次为1的数放在最前

④整体右移动2位

2

2    1

1    2

1    2

3

①前一轮所有值加1

②第三位增加数值1

③将轮次为1的数放在最前

④整体右移动1位

2    3

2    3    1

1    2    3

3    1    2

4

①前一轮所有值加1

②第四位增加数值1

③将轮次为1的数放在最前

④整体右移动0位

4    2    3

4    2    3

1    4    2

1    4    2

根据以上算法小九编写了如下VB程序,请回答下列问题。

  1. (1) 由题意可知,当n的值为6时,1~6张纸牌被取走顺序为
  2. (2) 请在划线处填入合适的代码。

    Dim n As Integer

    Dim a(1 To 100) As Integer

    Private Sub Command1_Click()

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

        Dim ans As String, x As Integer

        n = Val (Text1. Text)

        a(1) = 1

        For i=2 To n

            For j=1 To i-1

                

            Next j

            j=i

            Do While j>1

                a(j)=a(j-1)

                j=j-1

            Loop

            a(1) = 1

            For j=1 Ton - i

                k = a(1)

                

                a(x) = k

            Next j

        Next i

        ans =“”

        For i=1 Ton

            ans = ans + Str(a(i))

        Next i

        Label1. Caption =“序列为:”+ ans

    End Sub

    Function yd(i As Integer) As Integer

        Dim j As Integer, tmp As Integer

        For j=i To 2 Step -1

            tmp=j+1

            If tmp > i Then

            a (tmp) = a(j)

        Next j

        yd=j+1

    End Function

某密码的破译步骤如下:

⑴找出文章(以“.”结束)中所有用英文表示的数字(均为小写,数字范围1≤n≤20),单词与数字对应如下:

单词

one

two

three

four

five

six

seven

eight

nine

ten

……

twenty

数字

1

2

3

4

5

6

7

8

9

10

……

20

⑵将这些数字平方后除以100取余,得到两位数如00,04,21,96。

⑶把这些两位数按升序排成一行,组成一个最小的新数,如果新数开头为0,就去除。

⑷步骤(3)找出的最小数即为密码。

小明按照上述方法,设计了一个解密的VB程序,功能如下:单击“解密”按钮Command1,程序依次将文本框Text,1中以空格分隔的每个英文单词取出,若单词属于数字单词,则按解密步骤进行处理,最后在文本框Text2中输出解密结果。

程序运行效果如图所示,请回答下列问题:

  1. (1) 若文章内容为“tom bought two apples and five oranges, which cost ten dollars altogether.”,则破译后的密码应为
  2. (2) 请在划线处填入合适的代码。

    Dim a(1 To 20) As String

    Private Sub Form_Load()

        a(1) = "one": a(2) = "two" 

        '……将所有数字单词按顺序存入数组a中,代码略

    End Sub

    Private Sub Command1_Click()

        Dim s As String, tmp As String

        Dim c as Integer,i As Integer, j As Integer, k As Integer, t As String, ch As As String,code As Long

        Dim b(1 To 100) As String   'b数组存放数字单词处理后得到的两位数

        s = Text1.Text

        c = 0: i = 1: flag = True:t = ""

        Do While i <= Len(s)

            ch = Mid(s, i, 1)

            If ch >= "a" And ch <= "z" Then

                t = t + ch

                flag = False

            ElseIf flag = False Then

                For j = 1 To 20

                    If t = a(j) Then

                        c = c + 1

                        b(c) =

                    End If

                Next j

                t = ""

                flag = True

            End If

            i = i + 1

        Loop

        '将b数组中的两位数按数值大小进行升序排序,代码略

        For i = 1 To c

            t = Val(b(i))

            

        Next i

        Text2.Text = Str(code)

    End Sub

    Function decode(num As Integer) As String

        Dim mo As Integer

        mo = num * num Mod 100

        If mo = 0 Then

            decode = "00"

        ElseIf   Then

            decode = "0" + Trim(Str(mo))

        Else

            decode = Trim(Str(mo))       'Trim为去除字符串两端空格的函数

        End If

    End Function

排序的稳定性。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j], 且r[订]在r[j]之前, 而在排序后的序列中,r[i]仍在r[j]之前,则称这种撸序算法是稳定的:否则称为不稳定的。现编写一个VB程序,实现功能如下:随机生成n-1个不重复的[10, 99]之间的正整数,在这n-1正整数中随机选取一个位置i,将其值r[i]作为第n个数插入到某一位置j处,然后对数据序列进行排序,验证排序前和排序后这两个相同数相对次序的变化,著均不变,则排序稳定,若有改变,则排序不稳定。实现该功能的VB程序及界面如下,请回答以下问题。

Const n = 10

Dim a(1 To 10) As Integer, b(1 To 10) As Integer

Dim k1 As Integer, k2 As Integer     'k1,k2为相同数据的前、后次序

Private Sub Command1_Click ()

    Dim i As Integer, tmp As Integer, t As Integer

    Randomize

    List1.Clear

    For i = 1 To 9    '随机生成9个不重复数

        b(i) = Int(Rnd * 90) + 10

        Do While    ①   

            b(i) = Int(Rnd *90) + 10

        Loop

    Next i

    '以下代码为随机选取数组中的1个数作为第10个数字再随机的插入到原数组的1-9位置

    K1 = Int(Rnd *9 + 1)

    tmp = b(k1)

    k2 = Int(Rnd* 9 + 1)

    For i=10 To k2+1 Step -1

        b(i)=b(i-1)

    Next i

    b(k2) = tup

    For i =1 To n

        a(i) = i

        List1. AddItem Str(a(i)) +””+ Str(b(i))

    Next i

    If k1 >= k2 Then

           ②   

        t =k1: k1=k2: k2=t

    End If

    Text1. Text = Str(k1) + Str (k2)

End Sub

Private Sub Command2 _Click ()

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

    List2. Clear

    For i=1 To n-1

        k=i

        For j=i +1 To n

            If b(j) < b(k) Then k= j

        Next j

        If k<>i Then

            t=a(k): a(k)=a(i): a(i)=t

            t=b(l): b(k)=b(i): b(i)=t

        End If

    Next i

    For i= 1 To n

        List2.AddItem Str (a(i)) +"" + Str (b(i))

    Next i

    i=1

    Do While i<=n-1 And b(i)< b(i+1)

        i=i+1

    Loop

    Text2.Text = Str(a(i)) + Str(a(i + 1))

    If    ③    Then Label1. Caption="稳定" Else Label1. Caption ="非稳定"

End Sub

Function check(x As Integer, y As Integer) As Boolean

    Dim j As Integer

    check = False

    For j= 1 To y-1

        If b(j)=x Then

            check = True

            Exit For

        End If

    Next j

End Function

  1. (1) 分析程序代码,若某次运行显示“稳定”,则是否能确定选择排序是稳定排序?(填:是/否)
  2. (2) 补充横线处完整代码

     ② ③ 

def块中的代码虽然不是主程序的一部分,但运行时不会跳过。
某日期加密授权码生成方法描述如下:

1)授权码由10位字符组成,前8位为日期的密文,后2位为验证码;

2)取日期的第1位字符,若该字符第一次出现,则直接取其对应加密字符,否则取下一个不重复的加密字符。按此操作,依次取出该日期余下各位对应的加密字符;

3)求出所有日期字符数值的和,将和除16取余加1得到一位验证码字符;若和不小于16,则将和除16取整加1得到另一位验证码字符,否则另一位验证码字符为“X”。取出验证码重复时,处理规则与(2)相同。

加密(验证码)字符对应表如下。

值(十进制)

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

加密(验证码)字符

K

n

G

j

L

t

W

b

O

a

P

H

Z

q

Y

c

小明设计了一个生成8位日期(YYY YMM-DD格式)授权码的VB程序。程序功能如下:在文本框Text1中输入一个8位有效日期,单击“生成授权码”按钮Command1,在标签Label2中显示出该日期的授权码。运行效果如图所示。

实现上述功能的VB程序段如下:

  1. (1) 请在划线处填入合适代码:

    Dim f(0 To 15) As Integer

    Const Code=“KnGjLtWbOaPHZqYc”

    Private Sub Command1_ Click()

        Dim rq As String, sq As String

        Dim c As Integer, i As Integer, d As Integer

        For i=0 To 15

            f(i)=0

        Next i

        rq= Text1. text

        sq =””:d=0

        If Len(rq) <> 8 Then

            Label2. Caption=“请输入8位日期!”

        Else

            For i=1 To 8

                c= Val(Mid(rq,i, 1))

                d=d+c

                sq =+sq

            Next i

            If d >=16 Then

                yz= GetChar(d Mod 16+1) +GetChar(d \ 16+1)

            Else

                yz= GetChar(d Mod 16+1)+“X”

            End If

        Label2. Caption=sq+yz

        End If

    End Sub

    '获取不重复的加密字符

    Function GetChar(x As Integer) As String

        Dim flag As Boolean

        flag= False

        Do While flag= False

            f(x)=f(x)+1

            If f(x)=1 Then

                

                f(x)=f(x)+ 1

                flag= True

            Else

                x=(x+1) Mod 10

            End If

        Loop

    End Function

  2. (2) 若输入的日期是“20170818”,则该授权码的验证码字符是