4.4.2 while循环的应用 知识点题库

对n项(n<=100)数据序列的前x项求和,可设计如下算法:将数据序列存储在数组a中,并按一定规则转换成数组c,再借助数组c实现求和.

将数组a转换成数组c的方法描述如下:

①将数组a中的元素依次存储到数组c中,把当前数组c看作第一层;

②把第一层中的各元素进行如下处理:奇数项值不变,偶数项的值更新为自己与自己前一项的和,将更新后的数组元素看作第二层;

③把第二层中的各元素,按上述方法进行同样操作,更新后的数组元素看作第三层;

④以此类推,直到当前层中仅有一项 止。

例如x=11时,转换过程如图所示:

借助数组c,可快速计算出数组a中前x项的和.例如,数组a中前11项的和,可由表达式c(11)+c(10)+c(8)得到。表达式具体分析过程如下:

①表达式第一项为c(11);

②将下标11转换成二进制数1011,计算该二进制数最右边的“1”所对应的权值,再用11减去此权值得到10,即表达式第二项为c(10);

③按上述方法继续操作,直到计算结果等于0为止。

小龙依据上述方法设计了如下vb程序.请回答下列问题:

  1. (1) 计算数组a中前22项和的表达式为(填写表达式,如c(11)+c(10)+c(8))。
  2. (2) 请在横线处填入合适的代码。

    Dim n As Integer

    Dim a(1 To 1000) As Long, c(1 To 1000) As Long

    Private Sub Form_Load()

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

    End Sub

    Private Sub Command1_Click()

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

      For i = 1 To n

        c(i) = a(i)

      Next i

      k = 2      ‘当前层第一个偶数项的位置

      space = 1      ‘当前层偶数项与前一项的间距

      Do While k <= n

        For i = k To n Step k

          c(i) = c(i) + c(i - space)

        Next i

        k = k * 2

       

      Loop

    End Sub

    Private Sub Command2_Click()

      Dim x As Integer, sum As Long

      x = Val(Text1.Text): sum = 0

      Do While x <> 0

        sum = sum + c(x)

       

      Loop

      Text2.Text = Str(sum)

    End Sub

    Function lowbit(x As Integer) As Integer

      Dim temp As Integer

      temp = x: lowbit = 1

        Do While

          lowbit = lowbit * 2

          temp = temp \ 2

        Loop

    End Function

杨辉三角是我国古代数学的成就之一,如图所示为杨辉三角前5行的数据排列。从图可知,杨辉三角当前行的数值可由前一行推导计算得到。现要求杨辉三角第n行的数据,编写的VB程序功能如下:在文本框Text1中输入n值(n≤30),单击按钮Command1后,在标签框Label1中输出第n行的数据。

实现上述功能的VB代码如下。

Private Sub Command1_Click()

 Dim pre(0 to 30)As Long, cur(0 to 30)As Long 

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

 n = Val(Text1.Text)

     ′I处

 For i = 1 To n

   s = “”

   For j = 1 To i

     cur(j)=     ′II处

     s = s & str(cur(j))& “ ”

   Next j

   For j = 1 To i

     pre(j)= cur(j)

   Next j

 Next i

 Label1.Caption = s

End Sub

方框处的代码会是以下四句中的某一句:

① cur(1)=1     ②pre(1)=1     ③pre(j-1)+ per(j+1)    ④pre(j-1)+ per(j)

程序中I、II方框处正确的选项是(      )

A . ①③ B . ①④ C . ②③ D . ②④
下列程序段执行后,a的值为(  )

For i=1To 9

    For j=i To 9

        a=i*j

        List1.AddItem i&"*"&j&"="&a

    Next j

Next i

A . 81 B . 45 C . 9 D . 1
已知s和i的初值为0,下列程序段执行后,s的值为(  )

Do While i<10

    k=1

    i=i+1

    Do While k<10

        s=s+1

        k=k+i

    Loop

Loop

A . 30 B . 28 C . 10 D . 5
某医院每天提前发放100个预约号。考虑到老年人身体,预约的病人按照以下规则进行就诊:

①老年人(年龄≥60岁)比非老年人优先就诊;

②老年人按年龄从大到小的顺序就诊,年龄相同的按预约顺序就诊;

③非老年人按预约顺序就诊。

小王根据以上规则编写了一个VB程序,通过引入索引数组temp进行排序,使得age(temp(1))≥age(temp(2))≥age(temp(3))…≥age(temp(n))。如图a所示。

图a

图b

程序运行时,病人的数据显示在列表框List1中,单击“就诊排序”按钮Command1,排序结果显示在列表框List2中,程序运行界面如图b所示。

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

  1. (1) 分析程序,可知程序中读取的数据库工作表名称为
  2. (2) 请在画线处填入合适的代码。

    Dim pname(1 To 100)As String           ‘存放病人姓名

    Dim age(1 To 100)As Integer             ‘存放病人年龄

    Dim num(1 To 100)As Integer            ‘存放病人序号

    Dim n As Integer

    Private Sub Command1_Click( )

      Dim temp1(1 To 100)As Integer, temp2(1 To 100)As Integer   ‘索引数组

      Dim i As Integer, j As Integer, k1 As Integer, k2 As Integer, t As Integer

      k1=0:k2=0

      For i=1 To n

          If age(i)<60 Then

          k1=k1+1

        temp1(k1)=num(i)

      Else

          k2=k2+1

          temp2(k2)=num(i)

        End If

    Next i

    For i=1 To k2-1

        For j=k2 To i+1 Step-1

          If   ①   Then

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

          End If

        Next j

    Next i

    List2.Clear

    List2.Addltem "就诊号  名单   年龄"

    For i=1 To k2

        List2.Addltem Str(i)&."  "&.pname(temp2(i))&"r/&.Str(age(temp2(i)))

    Next i

    For j=1 To k1

        List2.Addltem   ②   &"    "&pname(templ(j)&"   "&.Str(age(templ(j)))

    Next j

    End Sub

    Private Sub Form_Load( )

      Dim conn As New ADODB. Connection, rs As New ADODB. Recordset

      Conn.ConnectionString="Provider=Microsoft. ACE. OLEDB. 12.0;DataSource="&App. Path&"\pdxt.accdb"

      conn.Open

      Set rs. ActiveConnection=conn

      rs. Open"select*from jzmd"

      n=0

      List1.AddItem"预约号   名单   年龄"

      Do While Not rs. EOF

           ③   

        num(n)=n

        pname(n)=rs. Fields(1)

        age(n)=rs Fields(2)

        List1. Addltem Str(num(n))&"  "&-pname(n)&."  "&.Str(age(n))

        rs. MoveNext

      Loop

      rs.Close:conn.Close

    End Sub

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

  Python语言用于实现循环结构的语句有语句和while语句。
生成一组由“0”-“9”字符组成的10位不重复随机密码,VB程序段如下:

s1= “0123456789”: n = Len(s1)

For i=To 10

   

    n=n-1

Next i

Text1.Text=s

方框中的代码从下列代码中选取:

①s=S+Mid(s1,x,1)  ②x= Int(Rnd*n)+1  ③x =Int(Rnd*(n+ 1))

④s1=Mid(s1,1,x) +Mid(s1,x+1,n-x)  ⑤s1=Mid(s1,1,x-1)+ Mid(s1,x+1,n-x)

代码顺序正确的选项是(    )

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

sum=0

for i in range(1,6)

    sum=sum+i

print(sum, i)

程序的运行结果为(     )

A . 24   5 B . 15  5 C . 24   6 D . 15  6
c=0

for i in range(1,26):

If i%2==0:

c=c+1

Print(c)

上面程序运行结果是(   )

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

Dim i As Integer, c As String, s As String, t As Integer

Dim s2 As String, pwd As String

   s= Text1.Text: pwd = "71zhYEAR":s2= ":t= 0

   For i= 1 To Len(s)

      c= Mid(s, i, 1)

      If c>= "0" Andc <= "9" Then

         t=t* 10 + Val(c)

      Else

         s2 = s2 + Mid(pwd, tMod8 + 1, 1)

      End If

   Next i

   Text2.Text= s2

运行该程序段,在文本框Text1中输入“20B13A8",文本框Text2输出的是(      )

A . hY B . YE C . YE7 D . hYA
有如下Visual Basic程序段:

m = a(1)

i =2

Do While i <= 10

    If m < a(i) Then m = a(i)

    i =i+ 1

Loop

该程序段执行后,变量m中存储的是(   )

A . a(1)至a(10)中的最大值 B . a(1)至a(10)中的最小值 C . a(2)至a(10)中的最大值 D . a(2)至a(10)中的最小值
用一个6*5矩阵表示地图,分别用a数组元素表示,第1行从左到右为a(1)到a(6),依次类推,右下角为a(30)。其中数字0表示不通,数字1表示畅通。现在要从左上角到右下角寻找一条畅通的路径。线路规则如下:

l  路线每个点只能向右或向下

l  任何一个岔口优先向右走,右侧不通再向下走

l  一条路线中每个点只能走一次,不能重复

算法思路:探路过程中,记录每个坐标到数组lu;遇到岔路口(向右向下都通),则记录路口坐标到数组cha;遇到前方无路时,需要返回到上一个路口,标记路口右侧坐标为0;当前方无路,岔路口数组也退回到0,说明整体不通,否则根据规则走到右下为止,最后输出整体线路坐标。

实现算法的程序如下,运行结果如图所示。

回答下列问题:

  1. (1) 根据规则,如图迷宫矩阵正确路线的第6个点是a数组的第个元素(填数字)
  2. (2) 在程序划线处填上合适代码,使程序完整。

    Dim a(1 To 50) As Integer

    Private Sub Command1_Click()

        Dim i As Integer, j As Integer, zb As Integer

        Dim cha(1 To 10) As Integer      ‘记录一条线路中各个岔路口坐标

        Dim lu(1 To 10) As Integer        ‘记录路线经过的坐标

        zb = 1: j = 0:  lu(1) = 1: i = 1

        Do While i <= 9      ‘第1个和最后1个固定,中间有9个需要路过的坐标

            If zb Mod 6 <> 0 And a(zb + 1) = 1 Then     ‘向右畅通

                If zb + 6 <= 30 and a(zb + 6) = 1 Then    ‘记录岔路口

                    j = j + 1

                    

                End If

                zb = zb + 1

                i = i + 1

                lu(i) = zb

            ElseIf zb + 6 <= 30 And a(zb + 6) = 1 Then    ‘向下畅通

                zb = zb + 6

                i = i + 1

                lu(i) = zb

            Else      ‘坐标退回到上一个岔路口

                If j = 0 Then Exit Do

                    Do While lu(i) <> cha(j)

                        

                    Loop

                    a(cha(j) + 1) = 0    ‘标记此路口右侧不可用

                    

                    j = j - 1

                End If

            End If

        Loop

        If j = 0 Then

            Text1.Text = "没有畅通道路"

        Else

            For i = 1 To 10

                Text1.Text = Text1.Text + Str(lu(i))

            Next i

        End If

    End Sub

    Private Sub Form_Load()

    End If ‘生成图形矩阵的数组a各个元素,并在列表框显示,代码略

    End Sub

有如下 VB 程序段:

ans = 0: i = 1

Do While i < Int(Sqr(n))

    If n / i = Int(n / i) And n / i Mod 2 = 1 Then

        ans = ans + 1

    End If

    i = i + 2

Loop

若变量n的值为81,则执行该程序段后,变量ans的值为(    )

A . 2 B . 3 C . 4 D . 5
有如下VB 程序段:

s = Text1.Text: k = 1: maxlen = 1

For i = 2 To Len(s)

    If Mid(s, i - 1, 1) < Mid(s, i, 1) Then

        k = k + 1

    If k > maxlen Then maxlen = k

    Else

        k = 1

     End If

Next i

Label1.Caption = Str(maxlen)

在文本框Text1 中输入字符串“B3b8defhADot”,执行该程序段后,则标签Label1 中显示的内容为(    )

A . 1 B . 5 C . 8 D . 13
某Python程序段如下:

s = "Errors should never pass silently.”

d={}

for ch in s:

    if ch in d:

        d[ch] += 1

    else:

        d[ch] = 1

print(d["e"])

运行该程序段,输出结果是(    )

A . 1 B . 2 C . 3 D . 4
有如下Python程序段

s = input('请输入数据: ')

s[0]

maxt = 0

for i in range (len(s)) :

    if s[i] > s[i-1] :

        t +=s[i]

        if len(t) > maxt:

            maxt = len(t)

            ans=t

    else :

        t = s[i]

print (ans)

执行该程序段后,输入“12123234561”,输出的内容是 (     )

A . 23456 B . 12123 C . 34561 D . 1212323
阅读程序。分析代码并回答问题。

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])的作用是
编写“输出所有子串”程序,实现如下功能:在文本框Text1中输人一串不重复的字符串,单击命令按钮“生成子串”,在列表框List1中输出该字符串的所有子串并输出子串的总数。程序运行界面以及工程资源窗口如下图所示,VB程序代码如下。

  1. (1) 根据程序代码可知,当前窗体中添加的按钮对象的名称为 。
  2. (2) 请在划线处填入合适的代码。

    Private Sub Command1_Click() 

        Dim s As String,sum As Integer

        Dim i As Integer,j as Integer

        s= Text1.Text

        n=0

        For i=1 To Len(s)

            For j=i To Len(s)

                List1. AddItem

                n= 1+1

            Next j

        Next i

        List1. AddItem "总共有" +Str(n)+ "个子串"

    End Sub

  3. (3) 如果输入的字符串是“China”,则输出中有个子串。
输入一个字符串,要求统计连续出现的字符次数最多有几次,例如输入s=“AABDDD”,字符“A”出现2次,字符“B”出现1次,字符“D”出现3次,故最终输出3。

s=input("请输入字符: ")

Max=0

c=1

for i in range(1,len(s)):

  if s[i]==s[i-1]:

    c+=1

    if c>Max:

                         

    else:

                         

print(Max)

程序代码如上所示,其中①和②处的应填入的代码是(     )

A . ① Max+=1  ② c+=1 B . ① Max+=1   ② c=1    C . ① Max=c   ② c=0 D . ① Max=c    ② c=1
为四则运算式“6+(8-2)*2÷3”转逆波兰表达“682-2*3÷+”设计算法,编程实现。

分析:在数学运算表达式中,运算符总是置于与之相关的两个运算对象之间,在计算结果时,要考虑括号、运算符号的优先性。为了程序实现的方便,波兰逻辑学家J.Lukasiewicz提出了另一种表示法,将运算符置于其运算对象之后,没有括号,不用考虑运算符号的优先性。这种表达式称为后缀表达式,又叫逆波兰表达式。

如表达式“682-2*3÷+”是四则运算式“6+(8-2)*2÷3”的逆波兰表达式。为了处理方便, 规定表达式中的数均为小于 10 的正整数, 运算符为+ - * ÷。

⑴抽象建模

设计两个栈bds、fh,栈bds用来存放表达式,栈fh用来暂时存放运算符。从左往右扫描四则运算式,遇到数字时,入栈bds;遇到运算符号时,根据运算符号的优先级设计进栈与出栈。

四则运算式“6+(8-2)*2÷3”转换规则的模拟过程如表1所示:

表 1

结合表1的操作过程,用栈bds和栈fh记录每个操作后的栈内情况(见下图),那么在操作2中栈fh里有内容为(请从栈底到栈顶顺序书写)。

⑵设计算法

基于问题的抽象与建模,解决该问题的主要算法描述如下:

从左往右遍历四则运算式s(设中间变量为ch):

1)当ch是数字,直接入栈bds;

2)当ch是运算符:

a.若ch为左括号时,直接入栈fh;

b.若ch为右括号时,则将栈fh元素弹出,压入栈bds,直到遇到左括号(左括号只弹出,不压入栈bds);

c.若ch为其它运算符时,如果运算符ch优先级大于栈fh中栈顶元素的优先级(或栈fh为空),直接入栈fh;否则,将栈fh元素依次弹出,并压入栈bds,直到运算符ch优先级大于栈fh中栈顶元素的优先级(或栈fh为空);

3)将栈bds中元素依次出栈,即为该四则运算s的后缀表达式。

⑶编写程序

实现上述功能的 Python 代码如下,请在划线处填入合适代码。

yxj = {"+":1,"-":1,"*":2,"÷":2} #运算规则的优先级

s = input("请输入四则运算式: ")

fh = [""]*100  #存储运算符

topfh = -1

bds = [""]*100 #存储表达式

top=-1

for ch in s:

if ch.isdigit():   #字符串只包含数字则返回 True 否则返回 False

top+=1

bds[top]=ch

elif ch == "(":

topfh +=1

fh[topfh]=ch

elif ch == ")":

while True:

tmp = fh[topfh]

topfh-=1

if tmp=="(":

top+=1

bds[top]=tmp

elif ch in yxj:

if topfh==-1 or fh[topfh]=="(":

topfh += 1

fh[topfh]=ch

elif :

topfh+=1

fh[topfh]=ch

else:

while fh[topfh]!="(" and topfh!=-1:

if yxj[fh[topfh]]>=yxj[ch]:

top+=1

bds[top]=fh[topfh]

topfh-=1

else:

break

topfh+=1

while topfh!=-1:

top+=1

bds[top]=fh[topfh]

topfh-=1

print("后缀表达式:","".join(bds[:top+1]))

最近更新