4.4.4 循环控制的应用 知识点题库

小张设计了某企业职工IC卡查询系统,输入职工的卡号,可以查出该卡号对应的余额。所有职工的IC卡号和相应的余额已分别保存在zg数组(按从小到大排序)和ye数组中,第i个职工卡号保存在zg(i)中,对应的卡号余额保存在ye(i)中。

程序界面如图所示,左边列表框List1中显示的是部分职工的卡号和余额,在文本框Text1中输入职工的IC卡号,单击“查询余额”按钮(Command1)后,如果找到此卡号,则在标签Lab3中显示“此卡号余额为”和对应的余额值,如果未找到则显示“找不到此卡号,请重新输入”。

 

解决此问题的部分程序段如下:

Const n=500' 设卡号总数为500

Dim zg(1 To n) As Long

Dim ye(1 To n) As Single

Private Sub Form1_Load()

' 此过程用于对数组zg和数组ye进行初始赋值,代码略

End Sub

Private Sub Command1_Click()

Dim x As Long, i As Long, j As Long, m As Long, find As Boolean

x=Val(Text1.Text)

i = 1 : j = n : find = False

Do While   ‘改错

     m = Int((i + j) / 2

     If x = zg(m)  Then

             ①     

     Else If        ②       Then

       j = m - 1

     Else

       i = m + 1

     End If

Loop

If find = true Then

       Lab3.Caption=″此卡号余额为″+Str(ye(m))+″元″

Else

       Lab3.Caption=″找不到此卡号,请重新输入″

End If

End Sub

  1. (1) 在设计程序界面时,要使命令按钮上显示“查询余额”,应修改命令按钮的属性值。
  2. (2) 程序中加框处代码有错,请改正。
  3. (3) 在程序①、②画线处填入适当的语句或表达式。将程序补充完整:

    程序中①画线处应填入

    程序中②画线处应填入

有如下VB程序段:

s = “QUOTES:keep on going never give up!”

flag = False: m = 0

For i = 1 To Len(s)

  ch = Mid(s, i, 1)

  If ch >= “a” And ch <= “z” Then

    If Not flag Then

      m = m + 1

      flag = True

    End If

  Else

    flag = False

  End If

Next i

Text1.Text = Str(m)

程序执行后文本框Text1显示的内容是(  )

A . 5 B . 6 C . 7 D . 21
小明想用数据移位思想将一段长度为n的序列a(n), 以t位置为分界,把前t-1个数和后n-t+1个数调换前后顺序,但保持每段中数据的相对位置不变。例如一段长度为6的序列1、2、3、4、5、6。t=4时,数组a中元素顺序变成4、5、6、1、2、3。实现上述功能的代码如下,下列①、②处填写正确的是(  )

t = Val(Text1. Text): m= 2

For i=t-1 To 1 Step-1

  k = a(i)

  For j=i To n- 1

      ① 

  Next j

    ② 

  n=n-1

Next i

A . ①a(j+1)=a(j)  ②a(j+1)=k B . ①a(j)=a(j+1)  ②a(j+1)=k C . ①a(j+1)=a(j)  ②a(j)=k D . ①a(j)=a(j+1)  ②a(j)=k
有两个字符串s1、s2(s2中字符不重复),若s2中的字符按顺序在s1中依次出现,则称s2是s1的子串。例:s1="acde",s2="ce",则s2是s1的子串。实现该功能的VB程序段如下:

s1 = Text1.Text: s2 = Text2.Text

i = 1: j = 1

Do While i <= Len(s1) And j <= Len(s2)

    If Mid(s1, i, 1) = Mid(s2, j, 1) Then  

Loop

If  Then Label1.Caption = "是子串" Else Label1.Caption = "不是子串"

方框处的可选语句为:

①i = i + 1        ②j = j + 1    ③i > Len(s2)  ④j > Len(s2)

以下选项正确的是(   )

A . ①②③ B .   ①②④ C .   ②①③ D .   ②①④
小明编写了一个有关整数闭区间合并操作的VB程序:从数据库读取闭区间数据(左端点和右端点),存储在数组a中,按区间数据左端点升序排序,然后进行合并操作,操作结果存储在数组b中。

例如,读取的数据为2、3、15、25、10、14、1、5、30、60、15、25,过程是:

⑴设置区间信息为[2,3],[15,25],[10,14],[1,5],[30,60],[15,25];

⑵按区间左端点升序排序,得到J区间信息为[1,5],[2,3],[10,14],[15,25],[15,25],[30,60],[15,25];

⑶合并区间,得到[1,5],[10,25],[30,60]。说明:区间[1,5]和[2,3]合并为[1,5],区间[10,14]和[15,25]合并为[10,25],区间[10,25]和[15,25]合并为[10,25],因此合并后的结果为:[1,5],[10,25],[30,60]三个区间。

程序功能如下:单击“读数据库”按钮Command1,程序从数据库读取数据,输出在文本框Text1中;单击“开始处理”按钮Command2,程序进行区间排序,并进行区间合并操作,操作后的结果输出在文本框Text2中。程序运行结果如图所示。

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

  1. (1) Private Sub Command1_CIick()中的Click()是(单选,填字母:A .对象名;B .属性名;C .事件名;D .事件处理过程名)
  2. (2) 从数据库中读入的区间为[1,10],[15,20],[6,18],[25,30],[31,200],则合并操作后的区间为
  3. (3) 请在划线处填入合适的代码。

    Dim a(1 To 100) As Integer         ′数组a存储合并前的区间

    Dim b(1 To 100) As Integer         ′数组b存储合并后的区间

    Dim n As Integer                        ′n表示区间个数

    Private Sub Command1_Click()

        Dim s1 As String, i As Integer

        '读取数据,并存储到数组a中,并输出在文本框Text1中,代码略

    End Sub

    Private Sub Command2_CIick()

        Dim s2 As String, i As Integer, j As Integer, k As Integer

        Dim n As Integer, t As Integer, x As Integer

        For i=1 To n-1

            For j=1 To 2 * n-2 * i Step 2

                If Then

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

                    t=a(j+1): a(j+1)=a(j+3): a(j+3)=t

                End If

            Next j

        Next i

        k=2

        b(1)=a(1): b(2)=a(2)

        i=2: j=3

        Do While j <=2 * n

            If b(i) >=a(j) Then

                If b(i) <=a(j+1) Then  

                Else If b(i)+1=a(j) Then

                    b(k)=a(j+l)

            Else

                k=k+1:

                k=k+1: b(k)=a(j+1)

                i=i+2

            End If

            j=j+2

        Loop

        For x=1 To k-2 Step 2

            s2=s2 & "[" & b(x) & "," &b(x+1) & "]" & ","

        Next x

        s2=s2 & "[" & b(x) & "," & b(x+1) & "]"

        Text2.text=s2

    End Sub

小轩的绿色出行花费:某著名旅游城市H市为了鼓励大家采用公共交通方式绿色出行,推出了一种地铁换乘公交车的优惠方案,方案具体细则如下:

①在搭乘一次地铁后可以获得一张优惠票,有效期为45分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于45分钟,即:t_bus-t_ subway <=45

②搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车。

③搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。

小轩同学编写了VB程序计算最近公共交通出行的费用,程序运行时,在文本框Text1中输人小轩的公共交通出行记录(各数之间以逗号分隔),单击“获取数据”按钮Command1将数据按顺序存储在数组a中并在List1中显示。其中第i条出行记录乘坐的交通工具存储在数组元素a(3*i-2)中,0代表地铁,1代表公交车;第i条记录乘车的票价存储在数组元素a(3*i-1)中;第i条记录开始乘车的时间(距0时刻的分钟数)存储在数组元素a(3* i)中。如小轩最近6条乘车记录的数据为0,5,1,0,20,16,0,7,23,1,18,31,1,4,38,1,7,68在数组a中的存储结构如下表所示。

a(1)

a(2)

a(3)

a(4)

a(5)

a(6)

……

a(16)

a(17)

a(18)

0

5

1

0

20

16

……

1

7

68

单击“计算”按钮Command2,则在标签Label2中显示小轩同学的公共交通出行总费用。程序运行界面如图所示。

  1. (1) 若小轩的出行数据如上表所示,则小轩此次出行总花费为。(填数字)
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Const maxn= 1005

    Dima(1 To 3 * maxn) As Integer

    Dim ticket(1 To 3 * maxn) As Integer

    Dim i,n,k,x,y,cost As Integer

    Dim tail,head As Integer

    Dim s As String

    Dim found As Boolean

    Private Sub Command1_Click()

        s= Text1.Text

        k= 1

        For i=1 To L en(s)

            c= Mid(s,i,1)

            If c="," Then k=k+1 Else

        Next i

        '将各条出行数据输出在列表框List1中,代码略

    End Sub

    Private Sub Command2_ Click()

        head=1:tail= 1

        For i=1 To k\ 3

            If a(3 * i-2)=0 Then

                cost= cost+a(3 * i-1)

                ticket(3 * tail)=a(3 * i)+45

                

                tail= tail+1

            Else

                Do While head < tail And ticket(3 * head) < < a(3 * i)

                    head= head+1

                Loop

                

                If found= False Then cost=cost+a(3 * i-1)

            End If

        Next i

        Label2.Caption= Str( cost)

    End Sub

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

        pd= False

        For j=x Toy

            If ticket(3 * j-1) >=a(3 * i-1) And ticket(3 * j-2)=0 Then

                pd=True

    ticket(3 * j-2)=1

                Exit Function

            End If

        Next j

    End Function

两个长度相同的字符串s1和s2,若所含字符及各字符的数量均相等时可以视为相同组合。如字符串“ABCA”与字符串“BCAA”可以视为相同组合,与“ABCD”视为不同组合。实现该功能的VB程序段如下:

Text1.text="相同":j=1

Do while j<=len(s2)

    If mid(s1, 1, 1)=mid(s2, j, 1) then

        s1=mid(s1, 2, len(s1)-1)

        s2=mid(s2, 1, j-1)+mid(s2, j+1, len(s2)-j)

       

    Else

       

        If

            Text1.text="不相同"

        End if

    End if

Loop

方框中的代码由以下三部分组成:

①j=j+1           ②j=1             ③j=len(s2)+1

则(1)、(2)、(3)中代码顺序正确的是(    )

A . ①②③ B . ②①③ C . ②③① D . ②③①
有一组正整数,要求对其中的奇偶数进行交换。交换后奇数在前,偶数在后,并保持相对顺序不变。

Const n = 10

Private Sub Command1_Click()

    num = 0: k = 0

    Do While k < n

        k = k + 1

        If   ①   Then

            num = num + 1

            b(num) = a(k)

        Else

              ② 

        End If

    Loop

    For j =③

        a(j) = b(j - n + num)

    Next j

End Sub

下列选项中,①②③中的代码顺序正确的是(      )

A . ①a(k) Mod 2 = 1 ②b(k - num) = a(k)          ③n - num To n B . ①a(k) Mod 2 = 0         ②a(k - num) = a(k)          ③n - num + 1 To n C . ①a(k) Mod 2 = 1         ②a(k - num) = a(k)          ③n - num To n D . ①a(k) Mod 2 = 0 ②b(k - num) = a(k)          ③n - num + 1 To n
阅读程序。分析代码并回答问题。

list=['a','b','c','d','e','f','g']

list1=[]

list2=[]

for i in range(7):

    if i%2==0:

        list1.append(list[i])

else:

    list2.append(list[i])

print(list1)

print(list1)

 

  1. (1) list的数据类型是
  2. (2) list中的元素的数据类型
  3. (3) list1=[ ]的作用是
  4. (4) for i in range(7)语句中,i的实际数据范围是从
  5. (5) append(list[i])的作用是
某VB程序段如下:

Dim i As Integer, n As Integer, k As Integer, s As String n = Val(Text1.Text):k = 1: s = ""

Do While 2 ^k < n

    k = k + 1

Loop

Do While n <> 0

    If n >= 2 ^ (k -1) Then s = s + "1"

    n = n - 2 ^ (k -1)

    Else

        s = s + "0"

    End If

    k = k - 1

Loop

For i= 1 To k

    s = s + "0"

Next i

在文本框Text1输入12,执行该程序段后,变量s、k的值分别为(     )

A . "1100"、2 B . "11"、2 C . "0011"、4 D . "1100"、4
有如下Python程序段:

s="水果5fRU2IT!"

ans-res="

for x in s:

    if "a"<=x<="z":

        ans=ans+chr (ord(x) -32)

    elif "A"<=x<="Z":

        ans=ans+chr (ord(x) +32)

    elif "0"<=x<="9":

        res=res+x

t-ans+res

print(t)

程序执行后,输出的结果是(    )

A . 5fRU2IT B . 5Fru2it C . Fruit52 D . 52Fruit
小明在玩翻转棋盘的游戏,游戏规则是在一个4*4的棋盘中挑选棋子(棋子只有黑白两面,0表示白,1表示黑),对于每颗被挑选的棋子,要将该棋子和它在棋盘上的上下左右4个相邻位置上的棋子一起翻转,若某个方向上无棋子,则不作处理,最后使得棋盘纯色(纯白或纯黑)。

如上图所示的棋盘,需要选择第2行第2列、第4行第2列两颗棋子,按照规则进行翻转便可使得棋盘变为纯黑。现编写程序找出实现棋盘纯色所需翻转棋子次数最少的方案并输出所挑选棋子的个数,若无答案则输出“无法翻转为纯色”。

解决该问题的算法原理:棋盘翻转方案为0000000000000000~1111111111111111之间的某几种,即十进制数 0~65535,利用枚举算法在0~65535之间枚举,即可找到最优方案。假设被选翻转棋子状态用1表示被选中,0表示不选中。例如某方案的十进制为1028即 2^10+2^2,转化为一个16位的二进制串0000010000000100就表示该棋盘中的第2行第2列、第4行第2列这两个棋子及其上下左右被选中翻转,我们认为该方案选中两个棋子进行翻转。

程序运行界面如下图所示,请回答下列问题。

  1. (1) 若某方案用十进制表示为100,则该方案总共选择了个棋子进行翻转。
  2. (2) 实现上述功能的程序代码如下,请将划线处的代码补充完整。

    '数组a储存棋盘原状态,数组b储存翻转后的棋盘状态

    Dim a(1 To 16) As Integer, b(1 To 16) As Integer, minc As Long

    Private Sub Form_Load()

      '生成原始由0、1组成的棋盘状态,用数组 a(1)-a(16)保存,代码略

    End Sub

    Private Sub Command1_Click()

      Dim k As Integer, c As Integer, i As Long, j As Long

      minc = 100

      For i = 0 To 65535

        For j = 1 To 16       '初始化棋盘

          b(j) = a(j)

        Next j

        k = 16: c = 0: j = i

        Do While j > 0

          If j Mod 2=1 Then

            b(k) = 1 - b(k)

            If k > 4 Then b(k - 4) = 1 - b(k - 4)

            If  Then b(k + 4) = 1 - b(k + 4)

            If k Mod 4 <> 0 Then b(k + 1) = 1 - b(k + 1)

            If k Mod 4 <> 1 Then b(k - 1) = 1 - b(k - 1)

            c = c + 1

          End If

         

          k = k - 1

        Loop

        If Then minc = c

      Next i

      If minc = 100 Then Label1.Caption = "无法翻转为纯色!" Else Label1.Caption = "最少翻" + Str(minc) + "次"

    End Sub

    Function check() As Boolean       '判断棋盘是否纯色

      Dim flag As Boolean, i As Integer

      flag = True

      For i = 1 To 15

        If Then flag = False: Exit For

      Next i

      check = flag

    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( )

执行下面程序代码后n的值为是(  )。

s = 0

n = 1

while s<100:

  s = s+n

  n = n+1

A . 13 B . 14 C . 15 D . 100
有如下VB程序段:

c = Text1.Text

s1 = "jiayou!" s2 = s1 + s1

For i =1 to len(s1)

    If c = Mid(s2, i, Len(s1)) Then Exit For

Next i

Label1.Caption = Str(i)

程序执行完后,Label1中显示的内容是4,则Text1中输入的内容是(     )

A . "jiayou!" B . "you!jia" C . "ayou!ji" D . "jayou!j"
输入100个学生的成绩,统计大等90的人数,大等80小于90的人数,大等70小于80的人数,大等60小于70的人数,不及格的人数.

PRIVATE SUB FORM CLICK()

    DIM X AS SINGLE

    J=0 : B=0: Q=0: L=0: Y=0

    FOR I=1 TO 

        X=VAL(INPUTBOX(“请输入一个成绩”))

        SELECT CASE

            CASE  

                J=J+1

            CASE IS>=80

                B=B+1

            CASE IS>=70

                Q=Q+1

            CASE

                L=L+1

            CASE 

                Y=Y+1

         

   

END SUB

条形码在现实生活中使用的越来越广泛,如在各种商品上印上条形码,超市里散装称重商品在称重完成后也会打上条形码。学校教务处想调查高二、高三学生对任教老师的满意度。调查方式采用学生填涂机读卡方式。由于高二、高三每个班学生选科不同。虽然采用机读卡能方便将卡上的信息读取出来,但很难区分某个学生所涂的内容是对哪个科目老师的投票。因此小张想通过设计条形码来区别该张卡是哪位学生对哪些科目的投票。小张设计的条形码,包括了学生的入学年份、该生所在班级、学号及所选课代码(选课代码:01-物理,02-化学,03-生物,04-政治,05-历史,06-地理,07-技术)。某学生条形码如下图所示,该生是2020年入学,5班,学号为23号,选科为:物理、生物、技术。

  1. (1) 根据条形码设计的规则,请你设计出2019年入学7班学号为15号,选科为化学、生物、技术学生的条形码显示的数字为:。a
  2. (2) 通过条码形与机读卡的组合,可以快速的统计出每班个班各科的教学情况。由于每个学生对投票的兴趣不一,可能存在有些学生没有兴趣参与投票。如果某个科目参与投票的学生达不到该科目选科总人数的60%,则该科目的教学调查就没有任何意义。为了统计出某个班哪几个科目的教学调查无效,小张事前应准备好的数据是       (单选,填字母)。
    A . 该年级总人数 B . 每个班级总人数 C . 参与教学调查投票的总人数 D . 每个班各科选课人数
  3. (3) 小张设计了一个实现统计某个班级哪几个科目的教学调查是无效的算法,他事先将某个班学生条形码通过扫描仪读取后存入在txm.txt中,每个条形码一行。为实现上述功能,请在划线处填入合适选项或代码。

    data=open("txm.txt")

    #班级选课人数存放在列表xknum中,代码略

    kmmc="物理化学生物政治历史地理技术"

    line=data.readline()

    kmnum=[0]*7     #用于存放实际参与教学调查每个选科人数

    while line:

        for i in range(3):      #统计每科参考投票的人数

            km=int(line[])-1    #(选填字母,从下列A、B、C、D四个选项中选取一项)

            kmnum[km]=kmnum[km]+1 a

            line=data.readline()

            s=""

            for i in range(7):

                if :   #(填程序代码)

    s=s+kmmc[i*2:(i+1)*2]+" "

           print("无效的科目有:",s)

    划线①处的选项:

    A .9+i*2:9+i*2                                       B .9+i*2:11+i*2 

    C .8+i*2:9+i*2                                       D .8+i*2:10+i*2 

答题卡一般采用2B铅笔填涂,填涂好的答题卡经过扫描后得到如图所示的数字化图像,从一个像素点的灰度值>132判断是否被填涂开始,进而判断一个信息点是否被填涂。利用如下的Python程序可以识别并统计填涂好的答题卡中的答案:
  1. (1) 答题卡通常使用红色,如使用黑色印刷,对答案识别(有/无)影响。

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

    from PIL import Image

    x_start = 11       # 起始点坐标

    y_start = 92    

    fill_width= 24       信息点宽度

    fill_height= 10         # 信息点高度

    space_width = 15       间隔宽度

    space_height = 12         # 间隔高度

    ans_cnt = 5            # 题目个数

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

    Gray_scale = 0.299 * R + 0.587 * G + 0.114 * B

    return Gray_scale < 132

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

    count = 0

    for i in range(x, x + fill_width):

      for j in range( ):

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

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

        count = count + 1

        if count >= fill_width * fill_height * 0.64:

          return True

          total_width  = fill_width + space_width

          total_height = fill_height + space_height

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

          pixels = image.load()

          ans = ""

          item=[‘A’,’B’,’C’,’D’]

          list=[]

          for col in range(ans_cnt):

            x =

            for row in range(4):

              y = y_start + total_height * row

              if fill_judge(x, y) == True:

                    

                list.append(ans)

                ans=""

    print(list)

运行如下程序,输入字符串“山羊上山山碰山羊角”,输入待查询字符“山”,Count的值为(    )

string=input('请输入字符串:')

word=input('请输入查询字符:')

count=0

for i in string:

  if i==word:

    count+=1

A . 4 B . 3 C . 2 D . 1
男性最适宜运动心率=(220-年龄-安静心率)×(60%~80%)+安静心率,女性最适宜运动心率=(210-年龄-安静心率)×(60%~80%)+安静心率。

age=float(input('请输入age='))

HRrest=float(input('请输入HRrest='))

gender=input("请输入male or female :")

if gender=='    ③    ':

        ④     

else:

       ⑤      

HRrest

high=(n-age-HRrest)*0.8+HRrest

print('最适宜的心率是:',low,'~',high)

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

以上计算最适宜运动心率的公示是有性别差异的,那么如何修改程序可以实现根据性别输出结果呢?

最近更新