2.3 周而复始的循环 知识点题库

【加试题】下列关于某纸牌游戏的算法是:随机产生两组牌,每组17张,牌从小到大分别为“3~10、J、Q、K、A、2”,每种牌最多4张,四张相同的牌如3333称为炸弹牌型,炸弹不能拆成其他牌型。按照如下规则出牌:

①先出顺子牌型(顺子指连续的 5 张及以上的牌,如 345678,顺子最小从 3 开始,最大到 A),若有多个顺子,先长后短,长度相同按从小到大顺序出;

②再按三带一牌型(3 张相同的牌带一张单牌)、对子牌型(2 张相同)、单张牌型的顺

序出牌,同一牌型从小到大出;

③最后出炸弹,若有多个炸弹,从小到大出。

设计以下VB程序,牌“10”用0代替,比较两组出牌次数,界面如图所示,请回答下列问题。

  1. (1) 若A组初始牌为:4567880JQQQQKAAA2,B组初始牌为:56778888JQQKKKA22,则 A 组出牌次数B 组。(填:大于/等于/小于)
  2. (2) 请在划线处填入合适代码。

    Const s = "34567890JQKA2" '用 0 代替牌 10

    Dim s1 As String, s2 As String 's1 存储 A 组牌,s2 存储 B 组牌

    Dim b(1 To 18)As String

    '数组 b 存储各类牌型,其中 b(1)到 b(4)可存储炸弹牌型,b(5)到 b(18)存储其他牌型

    Private Sub Command1_Click()

    '随机产生 A 组和 B 组牌分别在文本框 Text1、Text2 中显示,代码略

    End Sub

    Sub arrange(st As String) '整理牌型的过程

    Dim a(3 To 15)As Integer,iAs Integer

    Dim j As Integer, tAs Integer,n As Integer

    Dim k As Integer, max As Integer, last As Integer

    Dim saAs String, stemAs String, flag As Boolean

    '数组元素 a(3)到 a(15)分别存储牌 3~JQKA2 的张数

    '代码略

    t = 17

    For i = 1 To 18

        b(i) = ""

    Next i

    Do While t > 0

        n = 0

        For i = 3 To 15 '寻找炸弹牌型,若有则存储到数组 b 中

            If a(i) = 4 Then

           

            n = n + 1

            b(n) = stem + stem + stem + stem

            a(i) = 0: t = t - 4

        End If

    Next i

    flag = True

    Do While flag '寻找顺子牌型,若有则存储到数组 b 中

        flag = False: max = 0: k = 1

        For i = 4 To 14

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

                k = k + 1

                If k > max Then

                    max = k

                    last = i + 1

                End If

            Else

                k = 1

            End If

        Next i

        If max >= 5 Then

            flag = True: sa = ""

            For j = last - max + 1 To last

                stem = Mid(s, j - 3, 1)

                sa = sa + stem + " "

               

            Next j

            n = n + 1:b(n) = sa

            t = t - max

        End If

      Loop

      '寻找并存储三带一、对子、单张牌型,代码略

    Loop

    End Sub

    Private Sub Command2_Click()

    Dim count1 As Integer 'count1 统计 A 组出牌次数

    Dim count2 As Integer 'count2 统计 B 组出牌次数

    Call arrange(s1)

    '在 List1 中显示 A 组出的牌型,统计出牌次数,代码略

    Call arrange(s2)

    '在 List2 中显示 B 组出的牌型,统计出牌次数,代码略

    If count2 > count1 Then

      Label3.Caption = "A 组出牌次数小于 B 组"

    ElseIf count2 = count1 Then

      Label3.Caption = "A 组出牌次数等于 B 组"

    Else

      Label3.Caption = "A 组出牌次数大于 B 组"

    End If

    End Sub

某编码由4个信息位和3个校验位组成,通过对编码信息进行验算,能够检测并纠正一位错误代码。该7位编码中b1~b4为信息位,p1~p3为校验位,位置如下:

编码中位

1

2

3

4

5

6

7

对位信息

p1

p2

b1

p3

b2

b3

b4

校验的方式如下,求校验值g1、g2、g3:

g1 = p1 Xor b1 Xor b2 Xor b4

g2 = p2 Xor b1 Xor b3 Xor b4

g3 = p3 Xor b2 Xor b3 Xor b4

其中Xor 为异或运算,规则是:0 Xor 0 =0,0 Xor 1 =1,1 Xor 0 =1,1 Xor 1 =0,

p1 Xor b1 是将p1、b1 转换为二进制后按位进行异或运算,如7 Xor 12 的结果为11。

⑴若计算得到的校验值g1、g2、g3均为0,说明校验正确,数据无错误。例如:若7位编码为1101001,计算校验值g1、g2、g3值均为0,验证正确。

⑵若校验值g1、g2、g3不全为0,说明数据有错,出错位置为g3g2g1(二进制数表示),纠错的方法是对错误的位进行取反,即“0”变“1”,“1”变“0”。例如:若7位编码为1111001,计算校验值g1=1、g2=1、g3=0,不全为0,说明数据有错,错误位置在011(二进制数)位,即第3位,原位置上“1”应为“0”,正确编码为1101001。

小明为此编写了VB程序,程序运行时,在文本框Text1中输入编码值,单击“校验”

按钮Command1后,在文本框Text2中输出运行结果,如图所示。

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

  1. (1) 若按上述规则的7位编码为1001000,其中一位有错,则正确的编码应为
  2. (2) 请在划线处填入合适的代码。

    Function check(s As String) As Integer

    Dim i As Integer g1 As Integer, g2 As Integer, g3 As Integer

    Dim c(1 To 7) As Integer

    For i = 1 To 7

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

    Next i

    g1 = c(1) Xor c(3) Xor c(5) Xor c(7)

    g2 = c(2) Xor c(3) Xor c(6) Xor c(7)

    g3 = c(4) Xor c(5) Xor c(6) Xor c(7)

    If g1 + g2 + g3 = 0 Then check = 0 Else check =

    End Function

    Private Sub Command1_Click()

    Dim i As Integer, m As Integer, Outs As String

    m =

    If m = 0 Then

    Text2.Text = "验证正确,数据无错误"

    Else

    For i = 1 To 7

    If i = m Then

    Outs = Outs + Chr( Asc(Mid(Text1.Text, i, 1)) Xor )

    Else

    Outs = Outs + Mid(Text1.Text, i, 1)

    End If

    Next i

    Text2.Text = "第" + Str(m) + "位上数据有错误,正确编码应为:" + Outs

    End If

    End Sub

有如下VB程序段:

s=0 : i=1

Do While

   s=s+i

   i=i+1

Loop

执行该程序段后,变量s的值等于10,则程序方框处的语句是(  )

A . i < 5 B . i <= 5 C . i = 4 D . i <= 6
现有n*n大小的网格(n≤10),每个格子从左到右、从上到下编号依次编号为1、2、3„„n*n,当n为3时,网格如图a所示。网格中每个格子都有一面沿对角线方向放置的挡板,且朝向随机。现将一个小球从左上角1号格子自上而下射入网格,则小球将在网格中不断反弹(不考虑实际的能量损失与重力影响等因素),最终从某个格子离开网格,根据挡板的朝向与小球的运动方向,将有几种不同的反弹情况。如图b所示,小球进入网格后,先后经过1、2、5、6、3号格子,之后离开网格。

编写VB程序,功能如下:在文本框Text1中输入n的值,单击“生成”按钮Command1,

生成网格和随机的挡板,并输出。然后单击“开始”按钮Command2,在文本框Text2中显示小球进入网格后的运动路径。程序中利用数组a存储网格的状态,其中“/”与“\”两种字符表示两种朝向的挡板。程序运行界面如图c所示。


图 c

请回答下列问题:

  1. (1) 要使程序运行时,窗体标题显示“网格弹球”,可在Form_Load 事件过程中添加语句(单选,填字母:A . Form1 = "网格弹球" / B . Forml.Text="网格弹球"/ C . Form1.Caption="网格弹球")。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Dim n As Integer

    Dim a(0 To 100) As String

    Private Sub Command1_Click()      '生成网格和挡板

    n = Val(Text1.Text)

    '生成 n*n 的网格和随机的挡板,并通过图形控件输出,代码略

    End Sub

    Private Sub Command2_Click()

    Dim ans As String, pre As String

    Dim cur As Integer

    cur = 1:  : ans = ""

    Do While cur >= 1 And cur <= n * n

     ans = ans + Str(cur) + "→"

    If pre = "左" And a(cur) = "\" Or pre = "右" And a(cur) = "/" Then

     cur = cur + n: pre = "上"

     ElseIf  Then

     cur = cur - n: pre = "下"

    ElseIf pre = "上" And a(cur) = "\" Or pre = "下" And a(cur) = "/" Then

     If cur Mod n = 0 Then

     Exit Do

     Else

     cur = cur + 1: pre = "左"

     End If

    ElseIf pre = "上" And a(cur) = "/" Or pre = "下" And a(cur) = "\" Then

     If   Then

     Exit Do

     Else

     cur = cur - 1: pre = "右"

     End If

     End If

    Loop

    Text2.Text = ans + "离开"

    End Sub

  3. (3) 程序中加框处代码有错,请改正。
s=int(input("请输入一个两位数:"))

s=s%6

print(s)

程序运行后,键盘输入33,其输出结果为 (    )

A . 5.5 B . 3 C . 5 D . 3.0
在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan),以获得更好的压缩比。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:

经过扫描后得到的数据结果为:

57

45

0

23

0

0

0

0

0

0

0

0

0

0

0

0

0

-30

1

0

0

0

0

0

-16

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

“57,45,0,0,0,0,23,0,-30,-16,0,0,1,0,0,0,0,…,0,0”,数据元素个数为64个。进一步经过压缩后,最终得到行程编码:“57, 1, 45, 1, 0, 4, 23, 1, 0, 1,-30, 1,-16, 1, 0, 2, 1, 1, 0, 51”,数据元素个数为20个。

  1. (1) 行程编码压缩最坏情况下,数据压缩后数据元素的数量将是原来的倍。
  2. (2) 根据上述扫描算法,其 VB 代码实现如下,请在划线处填入合适的代码。

    Dim a(0 To 1000) As Integer     '存储原矩阵数据,按行优先存储

    Dim b(0 To 1000) As Integer     '存储Z形扫描后数据

    Dim c(0 To 1000) As Integer     '存储行程编码压缩后数据

    Dim n As Integer

    ‘矩阵导入代码略,以行优先存储在a数组中,如例子中数据存储顺序为“57,45,0,23,0,0…”

    Private Sub Command2_Click()

        Dim choice As Integer     ' 1:向右移动 ;2:向右上移动;3向下移动 4向左下移动

        Dim row As Integer, col As Integer, i As Integer, j As Integer

        Dim pre As Integer, count As Integer

        choice = 1: row = 0: col = 0: i = 0

        Do While (row <> n - 1 Or col <> n - 1)

            b(i) = a(row * n + col):i = i + 1     

            If choice = 1 Then

                

                If row = 0 Then choice = 4 Else choice = 2

            ElseIf choice = 2 Then

                row = row - 1: col = col + 1

                If  Then

                    choice = 1

                ElseIf col = n - 1 Then

                    choice = 3

                End If

            ElseIf choice = 3 Then

                row = row + 1

                If col = 0 Then choice = 2 Else choice = 4

                ElseIf choice = 4 Then

                    row = row + 1: col = col - 1

                If row = n - 1 Then

                    choice = 1

                ElseIf col = 0 Then

                    choice = 3

                End If

            End If

        Loop

        b(i) = a(n * n - 1):j = 0: pre = b(0): count = 0

        For i = 0 To n * n - 1                 '输出Z形序列,并进行行程压缩

            If pre = b(i) Then

                count = count + 1

            Else

                c(j) = pre: c(j + 1) = count

                

                pre = b(i):j = j + 2

            End If

        Next i

        c(j) = pre: c(j + 1) = count

        Text1.Text = ""

        For i = 0 To j + 1

            Text1.Text = Text1.Text + Str(c(i)) + ","

        Next i

    End Sub

有如下VB程序段:

For i = 1 To 8

    a(i) = Int(Rnd * 10) * 2 + 1

Next i

For i = 1 To 3

    For j = 1 To 8 - i * 2

        If a(j) > a(j + 2) Then

            t = a(j): a(j) = a(j + 2): a(j + 2) = t

        End If

    Next j

Next i

执行该程序段后,在下列选项中,a(1)~a(8)各元素可能的值是(    )

A . 3,1,8,7,11,13,17,15 B . 3,1,5,7,9,13,15,21 C . 5,3,5,7,9,17,15,19 D . 17,1,13,7,9,13,7,15
下列VB程序段功能为:在文本框Text1中显示整型数组元素a(1)到a(9)中的最小值和最大值。

amin = a(1): amax = a(1)

i = 2: j = 9

Do While i <= j

    If a(i) > a(j) Then

       

       

    Else

       

       

    End If

    i = i + 1: j = j - 1

Loop

Text1.Text = Str(amin) + "," + Str(amax)

上述程序段中方框处可选语句为:

①If a(j) > amax Then amax = a(j)

②If a(j) < amin Then amin = a(j)

③If a(i) < amin Then amin = a(i)

④If a(i) > amax Then amax = a(i)

则方框处语句依次可为(    )

A . ④②③① B . ④③②① C . ③②④① D . ③①④②
有如下程序段:

s=0

for i in range(1,11,2):

s=s+i

print(s)

该程序段运行后,s的值为

若一个正整数从左向右读与从右向左读都一样, 我们就将其称之为“回文数”。设计一个在列表框List中显示100 500之间的所有回文数的程序,实现该功能的VB程序段如下:

For k=100 To 500

    x=k

    z =0

    Do While x> 0

        

        

        

    Loop

    If z=k Then

        List1.AddItem Str(k)

    End If

Next k

上述程序段中方框处可选语句为:

①x=x\10   ②y=xMod10

③z=z+10*y   ④z=10*z+y

则(1)(2)(3)处语句依次为(    )

A . ①②③ B . ②①③ C . ①②④ D . ②①④
下列程序段运行输出正确的是(      )

BookInfo0=("ID0010230",15.68,36)

BookInfo1=("ID2315937",20,2)

BookSet={BookInfo0,BookInfo1}

t=0

For i in BookSet:

t+=i[1]*i[2]

print(t)

A . 68,36 B . 604.48 C . 20 D . 2
(加试题)若数组元素d(1)到d(8)的值依次为“6,9,12,18,20,28,32,45”,查找Key值的VB程序段如下:

t(1) = 1: t(2) = 1

For i = 3 To 5

    t(i) = t(i - 1) + t(i -2)

Next i

Key =13

i=1: j=8: k=6

Do While i <=j

    m = i+t(k-1)                      ‘①

    If Key = d ( m ) Then Exit Do        ‘Exit Do表示退出循环

    If d(m) > Key Then

        j= m - 1

        k=k-1

    Else

        i = m + 1

        k=k-2

    End If

Loop

运行该程序段后,①处的赋值语句共执行(    )

A . 1次 B . 2次 C . 3次 D . 4次
listque=[]   #定义列表listque存储订单

x=0

while(x!=4):    #当x=!4时,执行循环

 print('1. 添加订单')

 print('2. 发货')

 print('3. 查看订单列表')

 print('4. 退出')

 x=int(input("输入你的选择:"))    #输入选择项

 if  1 :

 y=input("输入订单编号:")     #输入订单编号

  2     #在列表listque中添加订单号

 elif x==2:

  3  #如果订单列表为空

 print("订单列表为空")

 else:

 print("发货单号:"+listque.pop(0))

 elif x==3:

 print("等待发货:",listque) #查询列表listque中的订单号

 print()

 input("运行完毕,请按回车键退出...")

此列表,定义的是(   )列表。(从“空、非空” 里选填); 补充划线1/2/3处的内容。

A . 空;x=1;listque.append(y) ; if len(listque)=0: B . 非空;x==1;listque.append(x) ; if len(listque)==0: C . 空;x==1;listque.append(y) ; if len(listque)==0: D . 非空;x==1;listque.append(y) ; if len(listque)==0
下列有while循环结构的说法不正确的是(      )
A . 执行过程中表达式一般是一个关系表达式或逻辑表达式。 B . While循环格式一般为:While(表达式):语句或者语句组。 C . 表达式为真执行循环体;为假退出循环。 D . 表达式为假执行循环体;为真退出循环。
列表list1=[2,3,5,10,18,22,29],现在想要得到列表的最后一个元素29,下列选项中不能实现该功能的是(    )
A . list1[6] B . list1[7] C . list1[-1] D . list1[6:7]
已知字典dic1存放学生的姓名和对应的数学成绩,dic1={"朱丹红":88,"沈美丽":90,"江小鱼":79,"王华":91},现想获取学生江小鱼的数学成绩,下列操作正确的是(    )
A . dic1[2] B . dic1=["江小鱼"] C . dic1{"江小鱼"} D . dic1["江小鱼"]
有如下Python程序,程序执行,输入数据k之后输出的结果不正确的是( )

L=[8, 10, 9, 14, 13, 4, 9, 13, 10]

k=int(input('请输入 k 值:'))

j=0

for i in range(8):

  if L[i]<=k:

    L[j]=L[i]

    j=j+1

print(L[:j])

A . k=8 输出:[8,4] B . k=9 输出:[8,9,4,9] C . k=10 输出:[8,10,9,4,9,10] D . k=13 输出:[8,10,9,13,4,9,13]
已知S='新冠肺炎COVID­19',执行语句x=S [0:4]后,x的值为(    )
A . '新冠肺炎' B . '新冠肺炎C' C . 新冠肺炎 D . 新冠肺炎C
有如下VB程序段:

i =1

Do While i<=5

    a(i)= Int(Rnd*10)*2 + 1

    If Not flag(a(i)) Then flag(a(i))=True

    i= i + 1

Loop

已知数组flag各元素的初值为False,运行以上程序段程序,数组元素a(1)到a(5)的值可能为(    )

A . 3  9  16  15  11 B . 5  7  9  7  13 C . 9  3  7  1  15 D . 9  17  5  21  1
解决下列问题,适合采用循环结构算法的是(    )
A . 判断一个整数是否为偶数 B . 输入一个圆的半径,计算其面积和周长 C . 输入10000个数值,计算平均值 D . 输入一个正方形面积,求边长
最近更新