第三章 课时6 While循环语句及程序实现 教案 浙教版(2019)必修1(课件 学案 教案三份打包)

资源下载
  1. 二一教育资源

第三章 课时6 While循环语句及程序实现 教案 浙教版(2019)必修1(课件 学案 教案三份打包)

资源简介

课时6 While循环语句及程序实现
课时目标
1.掌握while循环语句的语法格式,理解while循环的功能。2.熟练使用while循环语句解决实际问题。
1.while循环的功能
While循环在执行时,首先会判断条件是否为真,如果条件为真,执行一次循环体,再次判断条件是否为真,如果仍为真,那么再执行一次循环体,以此类推,直到条件为假时退出while语句。
2.while循环语句格式
while<条件>:
<循环体>
3.while循环适用场合
(1)循环次数未知,但循环结束的条件已知。
(2)循环条件有两个或两个以上。
①在while循环前应对变量赋初值。
②循环变量的变化要在循环体内通过赋值语句来实现。
例1 输入一个正整数,输出所有的质因子。如24=2*2*2*3。实现上述功能的Python代码如下:
n=int(input("输入一个正整数:"))
i=2
while ①      :
  if n %i==0:
   n=n/i
   print(i)
 else:
  ②     
(1)在程序划线处填入合适的代码。
(2)按照上述算法,输入60,依次输出的质因子是      。
答案 (1)①n>1或n!=1 ②i+=1 (2)2 2 3 5
解析 最小的质因数是2,如果能被2整除,则反复相除,当不能被2整除时,将i增加1,尝试被3整除,如果还不能除通,往上增加到4,由于前面反复除2操作,因此不可能被不是质数的数除通。当相除的结果为1时,终止循环。输入60,可以被2除2次,被3除1次,被5除1次。
变式训练1 工作人员手中有人民币100、50、20、10和1元5个币种,输入一个金额,按最大票面优先兑换的原则,输出相应的人民币及张数。实现上述功能的Python代码如下:
je=int(input("请输入金额!"))
rmb=[100,50,20,10,1]
i,t=0,0
while je>0:
  if①      :
    t=je∥rmb[i]
    ②     
    print("兑换"+str(rmb[i])+"元"+str(t)+"张")
  else:
    i+=1
(1)在程序划线处填入合适的代码。
(2)按照上述算法,输入356,依次输出人民币100、50、20、10和1元5个币种的总的数量是      。
答案 (1)①je>=rmb[i] ②je=je-rmb[i]*t (2)10
解析 当所剩金额大于或等于当前币种时,计算可以兑换的张数t,接着减去当前币种的金额,如果金额小于当前金额时,找到下一种较小的金额进行尝试,直到全部兑换完毕。输入356元,可以换3张100元,1张50元和6张1元。
例2 十进制数转换成二进制数:十进制可以用按权展开相加的表达式来表示,如13D=1×23+1×22+0×21+1×20。若十进制数大于k位上的权值,则k位上数为1,否则为0。设计的Python程序如下所示:
n=int(input("输入一个十进制数"))
ss=""
k=0
while 2**k  k+=1
whilen>0 and k>0:
  t=2**(k-1)
  if n>=t:
    ss=ss+"1"
    ①     
  else:
    ss=ss+"0"
    ②     
print(ss)
(1)加框处代码有误,请修正这个错误。
(2)请在程序划线处填入合适的代码。
答案 (1)n>0 or k>0 (2)①n=n-t ②k-=1
解析 变量k表示转换成二进制的长度,每次需减去k位上的权值t,若n大于等于t,表示该位上数为1,完成该位转换,同时需减去该位上的可能权值。若n已经为零,但k并没有达到最低位0,例如12D,减去8减去4后,得到0,但只输出2个1,此时k=2,还需输出2个0。
变式训练2 下列程序的功能是:计算表达式1×3+2×3+3×3+…100×3的值,并输出计算结果。
s=0
i=1
while i<=100:
       
  i+=1
print(s)
(1)刚退出循环时,变量i的值是      。
(2)为了实现上述表达式的计算,程序中划线处的语句为      。
答案 (1)101 (2)s=s+i*3或s+=i*3
解析 本题主要考查的是while循环的程序实现。(1)循环变量i的初值为1,步长为1,循环条件为i<=100,即当i=101时,循环结束。(2)根据表达式可知,划线处语句的功能是将i*3的值进行累加,从print(s)语句可知,累加和存放在变量s中,因此划线处的语句为s=s+i*3,也可以写为s+=i*3。
例3 判断一个字符串是否为回文串。如果一个字符串,从左到右读和从右到左读是完全一样的,那么这个字符串称为回文串。下面程序的功能是:输入一个字符串,检测是否为回文串。
s=input("输入一个字符串")
i=0
j=len(s)-1
flag=True
while①      :
if s[i]==s[j]:
     i+=1
     j-=1
  else:
     ②     
print(flag)
(1)请在程序划线处填入合适的代码。
(2)上述程序的功能与语句print(s==s[::-1])功能    (填:是/否)一致。
答案 (1)①i解析 本题考查的是多条件循环。变量i和j分别表示首尾两个位置,对首尾的字符依次比较,如果相等,分别后移和前移,如果不相等,表示不是回文,循环结束。s[::-1]表示将字符串s首尾互换,若两者相等,表示是回文字符。
变式训练3 用下列公式计算的π近似值,直到最后一项的绝对值小于10-8为止。
提示:≈1-+-+-…
实现上述功能的程序如下,请在程序划线处填入合适的代码。
n=t=1
s=0
flag=1
while①      :
  s=s+t
  flag=-flag
  n=n+2
  ②     
print("π=%f"%(4*s),"t=",t,"n=",n)
运行结果:π=3.141593 t=9.9999999e-09 n=100000001
答案 ①abs(t)>=1e-8 ②t=flag*1.0/n或t=flag*1/n
解析 本题主要考查的是while循环的灵活应用。条件是最后一项的绝对值小于10-8,需要使用绝对值函数abs,10-8用科学计数法来表示为1e-8,因此①处代码为abs(t)>=1e-8;用flag变量来表示正负符号,每一项的值为实数,用1.0/n来表示,因此②处代码为t=flag*1.0/n。
例4 有如下Python程序段:
s=input("输入字符串:")
n=len(s)
i,j=0,n-1
result=""
while i=n∥2:
  if s[i]>s[j]:
    result+=s[i]; j-=1
  elif s[i]    result+=s[j]; i+=1
  else:
    i+=1;j-=1
print(result)
执行该程序段,分别输入下列选项中的字符串,输出结果不为“555”的是 (  )
                
A."51234" B."12535" C."54321" D."55123"
答案 B
解析 本题考查字符串的操作。该程序段的作用是将字符串 s 中左半部分与右半部分按照从大到小的顺序交替排列,生成一个新的字符串 result。输入 s 字符串为 12535 时,输出结果为 55。
                
1.有如下Python程序段:
n=int(input("请输入一个正整数:"))
s=0;i=1
while i  if n%i==0:
    s=s+i
  i=i+1
print(s)
运行程序,输入18输出s的值是 (  )
A.5 B.21 C.39 D.6
答案 B
解析 本题考查循环结构。把n的因子进行相加。
2.有如下Python程序段:
m=int(input("输入一个数字串"))
s=""
flag=True
while m>0:
  r=m%10
  m=m∥10
  if flag and r%2!=0:
    s=str(r)+s
    flag=not flag
print(flag,s)
若输入的值为“5201314”,执行该程序段后,输出的结果是 (  )
A.False 1 B.True 1 C.False 2 D.True 4
答案 A
解析 本题考查循环控制结构和逻辑变量运用。语句r=m%10取出m的个位数,语句m=m∥10去除m的个位数,因此该循环是从后向前取出数字串的各个数字,当条件flag and r%2!=0成立时,把r变成字符并联接入s中,语句flag=not flag的作用是把flag的值变为False,该程序的功能是找到第一个奇数。
3.有如下Python程序段:
s="CixiStudent"
f=[0]*26;t=s[4:];i=0
while i  if 'A'<=t[i]<="Z":
    i+=1
    continue
  elif 'a'<=t[i]<="z" and f[ord(t[i])-ord('a')]==0:
    f[ord(t[i])-ord('a')]=1
  i+=1
for i in range(26):
  if f[i]==1:
    print(chr(i+ord('a')),end='')
运行以上程序段后,输出的内容为 (  )
A.dentu B.Student C.tuden D.deintux
答案 A
解析 本题考查循环控制结构。continue语句用来告诉python跳过当前循环,进行下一个循环。列表t中的值为'Student',f列表中有26个元素,可以看成一个桶,当某个字母出现,ord(t[i])-ord('a')对应的索引号的元素值为1,表示该字母出现过。将出现过的字母从小到大输出。
4.将一组数保存在列表a中,若a[0]=0,则在列表a中从左到右找到第一个大于零的元素,并与a[0]交换。用Python程序描述,下列选项中不可行的是 (  )
A.i=0
 while a[i]==0:
   i+=1
 a[0],a[i]=a[i],a[0]
B.for i in range(5):
  if a [i]>0:
    break
 a[0],a[i]=a[i],a[0]
C.i=0
 while True:
   if a[i]>0:
     break
   i+=1
 a[0],a[i]=a[i],a[0]
D.for i in a:
   if i>0:
    break
 a[0],a[i]=a[i],a[0]
答案 D
解析 本题考查循环结构。D选项中变量i已经是列表a中的元素,则最后进行交换的并不是a[i],正确的交换语句为:a[0],i=i,a[0]。
5.有如下Python程序段:
s="akpboyogirlyygirlkp"
s1=s+"###";boy=0;girl=0;i=0
while i  a=s1[i];b=s1[i+1];c=s1[i+2];d=s1[i+3]
  if a=="b" or b=="o" or c=="y":
    boy=boy+1
  if a=="g" or b=="i" or c=="r" or d=="1":
    girl=girl+1
  i+=1
执行该程序段后,变量boy及girl的值分别为 (  )
A.1 2 B.4 2 C.4 3 D.6 9
答案 B
解析 本题考查列表的枚举。连续取出4个字符,若第1、2、3个字符中分别是b、o、y中一个,则boy增加1。如i等于5时,取出"yog",第2个字符是"o";取出"rly"、"lyy",第3个字符是"y"。
6.有如下Python程序段:
a=[3,4,2,5,6,7,7,1,2]
m,c,i=1,1,1
while i  if a[i]>=a[i-1]:
    c+=1
    m=max (m,c)
  else:
    c=1
  i+=1
print (c,m)
则程序执行后,c和m的值分别是 (  )
A.1 5 B.1 4 C.2 5 D.2 4
答案 C
7.有如下Python程序段:
count=0;i=1
while i<100:
  if int(i**0.5)==i**0.5:
    count+=1
  i+=1
print(count)
运行程序后,输出的结果是 (  )
A.9 B.0 C.99 D.5
答案 A
8.对由小写字母组成的长度相同的两个字符串s1和s2进行各字母数量检测,如"abdac"与"aabcd"所含字母数量一致,与"aabcc"所含字母数量不一致。实现该功能的Python部分程序段如下:
s1="";s2=""
b=[0]*26
for i in range (len(s1)) :
  x=ord(s1[i])-97;b[x]+=1
  y=ord(s2[i])-97; (1) 
j=0
while j<26:
  if  (2) :
    break
  j+=1
if j==26:
  print("所含字母数量一致")
else:
  print("所含字母数量不一致")
上述程序段中划线处可选语句为:
①b[y]+=1 ②b[y]-=1 ③b[j]!=0
④b[j]==0
则(1)(2)处语句依次应为 (  )
A.①③ B.②④ C.②③ D.①④
答案 C
9.有如下Python程序:
a = [0] * 10 ; c = 0
n = int(input("输入n的值:"))
while n > 0:
  a[n % 10] += 1
  if a[n % 10] == 2:
    c += 1
  n ∥= 10
print(c)
运行该程序后,输出结果为2,则输入n的值可能为 (  )
A.135553 B.234125
C.202222 D.112233
答案 A
一、基础巩固
1.有如下Python程序段:
s1='blgr';s2='bollymgpric'
i=0;j=0;s3=''
while i<=len(s1)-1 and j<=len(s2)-1:
  if s1[i]==s2[j]:
    i+=1
  else:
    s3=s3+s2[j]
  j+=1
print(s3)
执行该程序段后,输出的内容为 (  )
A.oymp B.olymp C.olympic D.oympic
答案 B
2.有如下Python程序段:
code="0123456789ABCDEF"
numstr=input("请输入一个二进制整数:")
numlen=len(numstr)
s=0;ss=""
for i in range(numlen):
  x=int(numstr[i])*2**(numlen-i-1)
  s+=x
t=s
while t>0:
  ss=code[t%16]+ss
  t=t∥16
print(ss)
运行该程序段,输入1100111,程序结果为 (  )
A.110 B.103
C.67 D.1100111
答案 C
3.有如Python下程序段:
s1=[12,15,28]
s2=[15,28,32]
i=0
while i<=len(s1)-1:
  if s1[i] not in s2:
    print(s1[i])
  i=i+1
以下说法正确的是 (  )
A.该程序输出结果为32
B.该程序的算法是解析算法
C.该程序输出的结果为[12]
D.该程序实现的功能是得到s1中有但s2中没有的元素
答案 D
4.有下面一段程序:
a=[9,5,2,3,0,-9,5,0,7,-10]
s,i=0,0
while a[i]!=0 and i < len(a):
  s+=1
  i+=1
运行该程序后s的值为 (  )
A.4 B.5 C.8 D.10
答案 A
解析 本题考查循环结构while语句,当i位置上的元素值不为0且满足i比列表a长度来的小的时候可以进入循环,此时s,i的值分别+1,不满足任一条件时循环结束,可以看到列表中有元素0,此时i的值为4,因此结束时s的值也是4。
5.小明用Python编写了一个找最大值的程序,程序功能是:用户输入数字串,数据间用逗号分隔,最后以逗号结尾,程序执行后输出最大的数值。程序段如下,划线处代码正确的是 (  )
s=input("请输入数字串:")
i=j=max=0
c=t=""
while j  c=s[j]
  if c==",":
    t=s[i:j]
    if int(t)>max:
      max=int(t)
    ① 
  ② 
print(max)
A.①i=i+1 ②j=j+1
B.①i=j+1 ②j=j+1
C.①j=j+1 ②i=i+1
D.①j=i+1 ②i=i+1
答案 B
解析 本题考查循环结构嵌套分支结构找最值模型,i表示数字的左索引,j表示数字后逗号的索引值,t为逗号前完整的数字,当找到比当前最大值还要大的值时,更新最大值并且更新左边界和右边界的值继续往下找,因此答案为B。
6.在一次抽奖活动中,需要在8人中随机抽取3个幸运奖,对应的Python程序如下:
import random
xm=["A","B","C","D","E","F","G","H"]
             #用字母代表人名
hj=[""]*3
bz=[False]*8
i=0
while i<=2:
  n=random.randint(0,7) #产生一个0-7之间的整数n
    
print(hj)
程序划线处代码合适的是 (  )
A.if bz[n]==False:
  hj[i]=xm[n]
  bz[n]=True
  i+=1
B.if bz[n]==True:
  hj[i]=xm[n]
  bz[n]=False
  i+=1
C.if bz[i]==False:
  hj[n]=xm[i]
  bz[i]=True
  i+=1
D.if bz[i]==True:
  hj[n]=xm[i]
  bz[i]=True
  i+=1
答案 A
解析 本题考查随机函数的应用。列表bz中有8个元素,其初值均为False,表示该索引号对应的xm元素没有抽到奖。变量i表示第几个幸运观众,变量n表示幸运观众的索引号。
7.有如下Python程序段:
import random
a=[-1]*5
for i in range(len(a)):
  a[i]=random.randint(1,10) #产生一个[1,10]之间的整数
for i in range(2,4):
  key=a[i]
  j=i-1
  while j>=1 and key    a[j+1]=a[j]
    j-=1
  a[j+1]=key
执行该程序段后,变量a可能的值为 (  )
A.[1,0,3,6,7] B.[3,2,6,7,1]
C.[1,3,2,5,7] D.[3,5,6,2,7]
答案 B
解析 本题考查随机数应用和顺序查找。在循环体中,i的值为2或3,语句key=a[i]的功能是把a[i]的值保存到key中,同时可以腾出位置i,在他前面的数a[j],如果满足key8.将有序数组 nums 中的重复项删除,编写的 Python 程序段如下:
nums=1
n=len(nums);i=1  
  (1)  
while i  if nums[i] !=nums[i-1]:
       (2)  
    k+=1
  i+=1
nums=nums[:k]
上述程序段中方框处可选代码为:①k=0 ② k=1 ③nums[k]=nums[i] ④nums[i-1]=nums[i] 则(1)、(2)处代码依次为 (  )
A.①③ B.①④ C.②③ D.②④
答案 C
解析 本题考查删除重复项的代码段理解。本题的思路是:从第二个字符开始遍历有序字符串 s 的各个字符,若前后相邻两个字符不相等,把当前字符重新赋值到字符串 s 中,此时的索引用 k 来表示,若前后两个字符相等, 则跳过当前字符,不组合。以["a","a","b","b","b","c"]为例,最终会得到["a","b","c"]。
9.有如下Python程序:
a = [1, 5, 3, 2, 1, 4, 5, 8, 4, 3]
i = 1;max_list = []
while i <= len(a)-2:
  if a[i-1] < a[i] and a[i] > a[i+1]:
    max_list.append(a[i]) #append()方法用于在列表末尾添加新的对象
  i += 1
print(max_list)
执行该程序段后,列表 max_list 的值为 (  )
A.[1] B.[8] C.[5, 8] D.[5, 1, 8]
答案 C
10.有如下Python程序段:
s=input("请输入字符串:")
i=0;j=1;t=0;s1="";maxs=""
while i  if s[i]<=s[i+1]:
    j+=1
    s1=s[t:t+j]
    if len(maxs)<=len(s1):
      maxs=s1
  else:
    s1=""
    t=i+1
    j=1
  i+=1
print(maxs)
执行该程序,当输入“p8579yt559h6”时,输出的结果为 (  )
A.579 B.579y C.559h D.t559h
答案 C
二、能力提升
11.学校举办“十佳歌手”比赛,经初赛选拔,共有15位同学进入决赛。现需制定一个决赛出场顺序,即为每位进入决赛的同学随机分配一个出场序号。编写的Python程序段如下:
import random # 导入随机模块
name=["张**","李**","王*","许*","林**","王**","陈*","洪**","鲍**","罗*","张*","吴**","方*","郑*","章*"]
seq={};a=[];i=0
while i<=14:
  m=random.randint(1,15) #产生[1,15]范围内的随机整数
  if m not in a: # ①
    a+=[m]
    seq[name[i]]=m
    i+=1 # ②
print(seq) # ③
运行上述程序段后,下列说法正确的是 (  )
A.列表a中的元素不会重复
B.①处语句最多执行15次
C.②处语句缩进应与①处语句对齐,避免程序死循环
D.③处语句缩进应与①处语句对齐,否则只输出一个序号
答案 A
解析 本题考查循环语句、字典和随机函数。当数m不在列表a中时,才会将数m放入列表中,因此列表a中的元素不会重复。变量m是随机产生的整数,则并不能保住m每次都不同,若是产生了重复的数,则程序会再次进入循环,重新产生随机数,因此①处语句是最少执行15次。若②处语句缩进应与①处语句对齐,则不论变量m是否为重复的数,i的值都会加1,while循环一共循环15次,会造成部分同学没有序号的情况。若③处语句缩进应与①处语句对齐,则每进入一次循环,都会输出字典seq的值。而在原程序中,若产生了一个不重复的新序号,则会将该序号与一位同学对应起来形成字典中的键值对。因此最终输出的字典中存放了所有同学与之对应的序号。
12.有如下程序段:
import random #导入随机数模块
n=random.randint(0,100) #产生0-100之间的随机整数,包含0和100
m=n;k=0;s=""
while n!=1:
  for i in range(2,n+1):
    if n%i==0:
      k=i
      n=n∥k
      s=s+str(k)+"*"
      break
print(m,"=",s[0:len(s)-1])
上述程序执行后,输出结果不可能的是 (  )
A.67=67 B.34=2*17
C.54=2*3*3*3 D.20=2*3*4
答案 D
13.有一组正整数,要求对其中的奇偶数进行交换。交换后偶数在前,奇数在后,并保持相对顺序不变。
a=[5,10,21,7,24,14,9,11,36,37]
n=len(a);b=[0]*n
num=0;k=0
while k <10:
  if    ①   :
    b[num]=a[k]
    num+=1
  else:
      ②  
  k+=1
for j in range(n-num,n):
     ③  
print(a)
将加框处的代码补充完整,正确的是 (  )
A.①a[k]%2==1 ②a[k-num]=a[k] ③a[j]=b[j-n+num]
B.①a[k]%2==0 ②b[k-num]=a[k] ③a[j]=b[j+num]
C.①a[k]%2==0 ②a[k-num]=a[k] ③a[j]=b[j+num]
D.①a[k]%2==1 ②b[k-num]=a[k] ③a[j]=b[j-n+num]
答案 A
14.奇偶校验是一种校验数据传输正确性的方法。其中奇校验方法:统计二进制数据的数位中“1”的个数,若个数为奇数,则校验位值为0,否则校验位值为1。小李编写了一个计算奇校验位的程序,功能如下:键盘输入1~255十进制待校验数,输出该数对应的二进制值及该数的校验位值。程序运行界面如图所示。
请输入待校验数:2020转换为二进制数为:11111100100 校验位值为:0>>>
实现上述功能的程序如下,请在程序划线处填入合适的代码。
n=int(input("请输入待校验数:"))
t=0
s=""
while n>0:
 a=n%2
 ①     
 t=t+a
 s=str(a)+s
②     
print("转换为二进制数为:",s,"校验位值为:",1-v)
答案 ①n=n∥2 ②v=t%2
解析 本题的算法思想是将整数n转化为二进制数,然后统计1的个数,再对统计个数进行校验。十进制化二进制的方法为除2取余,每得到一个余数,则将余数累加在变量t中,商为n∥2,因此①处为n=n∥2;根据print语句可知,结果为1-v,即v为1时校验位值为0,v为0时校验位值为1,因此可推断出②处语句为v=t%2。
15.某次测试的答题结果存储在asht.txt文件中,该文件每行记录1个考生10道单选题的答案,每题有A、B、C、D四个选项,空白的答案标记为'K'。评分标准:正确得3分,错误得-1分,空白得0分。实现评分的Python程序如下。
ANS='ACBBCDADBC' #ANS 为标准答案
score=[]
for line in open('asht.txt','r'):
  score.append(0)
  i=len(score)-1
  j=0
  while j    if①      :
      score[i]+=3
    elif line[j]!='K':
      ②     
    j+=1
print(score)
(1)若标准答案为:'ACBBCDADBC',则答案ACBBDDADKC'的得分为    。
(2)完善上述①②处代码。
答案 (1)23 (2)①line[j]==ANS[j]
②score[i]-=1
解析 本题考查顺序查找算法。line表示asht.txt文件中每一条记录,每条记录有10道单选题答案。语句score.append(0)表示每读取一条记录,该列表增加一个值为0的元素,i表示score列表中最后一个元素的索引值。j初值为0,终值为len(ANS)-1,表示在标准答案中比对当前记录中答案,如果line[j]==ANS[j]表示当前答案与标准答案一致,得3分,不正确将扣1分。
16.分解质因数是指一个整数可以写成几个质数相乘的形式。现有如下Python程序段实现对一个整数(可以为负整数)分解质因数,如输入正整数 30,输出结果为:30=2*3*5,输入负整数-4,输出结果为:-4=-1*2*2。
t=int(input("输入一个整数:"))
ans = str(t)+"="
if t<0:
  t=-t
  ans += "-1*"
i=2
while t>1:
  while t%i==0:
    ans += str(i)+"*"
    ①   
  i+=1
print(②     )
(1)当输入整数-56时,输出的结果为        。
(2)请在划线处填入合适的代码。
答案 (1)-56=-1*2*2*2*7 (2)① t∥=i② ans[:-1] 或 ans[0:len(ans)-1]
17.尼克斯彻定理:任何一个大于等于 1 的整数的立方等于一串连续奇数之和。如:33=7+9+11,编写一个Python 程序验证尼克斯彻定理,程序运行时,输入一个大于等于1的整数,输出验证结果如下图所示:
请输入一个大于1的整数:33**3=7+9+11
(1)若输入数字2,输出的结果为    
(2)完善划线处的代码。
n=int(input("请输入一个大于等于 1 的整数:"))
for i in range(1,n**3+1,2):
  sum1=0
  t=i
  while sum1    ①   
    t+=2
  if sum1==n**3:
    break
s=str(n)+"**"+str(3)+"="
while sum1>0:
  sum1-=i
  if ②    :
    s+=str(i)
  else:
    s+=str(i)+"+"
    i=③   
print(s)
答案 (1)2**3=3+5 (2)①sum1+=t
②sum1==0 ③i+2
18.如果集合a的任意一个元素都是集合b的元素,那么集合a称为集合b的子集。例如集合a的元素依次为[1,3,5],集合b的元素依次为[1,2,3,4,5],集合a的任意一个元素都是集合b中的元素,所以集合a称为集合b的子集。编写Python程序,用于判断集合a是否是集合b的子集,功能如下:程序运行时随机产生na个不重复的整数存储在集合a中,随机产生nb个不重复的整数存储在集合b中。显示判断的结果,程序运行界面如图所示。
[2,8,18][5,14,19,10,12,18,4,2,7,17]a不是b的子集
(1)集合a中元素为[3,6,7],集合b中元素为[6,19,7,13,2,10,3],集合a是否为集合b的子集    (填字母。A.是 B.否)
(2)完善划线处代码。
import random
na=3;nb=10
#随机产生 na 个不重复的整数存储在列表 a 中,随机产生 nb 个不重复的整数存储在列表 b 中,代码略
print(a);print(b)
①   
i=0
while ②    :
  j=0
  while j    if ③    :
      break
    j+=1
  if j==nb:
    flag=False
  i+=1
if flag:
  print("a 是 b 的子集")
else:
  print("a 不是b 的子集")
答案 (1)A (2)①flag=True ②i19.下列程序统计字符串(由数字或字母组成)中同一字符连续出现最多的次数,如果有多个字符连续出现次数并列最多,输出第一个字符,例如程序运行时,输入字符串:“aabb33ddddf88888q",输出结果为:8出现的次数最多,最多共连续出现了5次
Python程序如下:
s=input("请输入字符串:")
c=0;m=0;dic={}
maxlen=0;d=0
while c+1<=len(s):
  if s[c] not in dic:
    dic[s[c]]=1
  while s[c]==s[c+m]:
    m+=1
    if c+m==len(s):
      ①   
  if m>maxlen:
    dic[s[c]]=m
    d=c
    ②   
  c+=m
  m=0
print(③     +"出现的次数最多")
print("最多共连续出现了"+str(maxlen),"次")
print("位于字符串的第",d+1,"位到第",d+maxlen+1 ,"位")
(1)请在划线处填入合适的代码。
(2)加框处的代码还可以用    代替。
答案 (1)①break ②maxlen=m ③s[d] (2)dic[s[d]](共85张PPT)
课时6 While循环语句及程序实现
第三章 算法的程序实现
1.掌握while循环语句的语法格式,理解while循环的功能。
2.熟练使用while循环语句解决实际问题。
目 录
CONTENTS
知识梳理
01
例题精析
02
随堂检测
03
巩固与提升
04
知识梳理
1
1.while循环的功能
While循环在执行时,首先会判断条件是否为真,如果条件为真,执行一次循环体,再次判断条件是否为真,如果仍为真,那么再执行一次循环体,以此类推,直到条件为假时退出while语句。
2.while循环语句格式
while<条件>:
<循环体>
3.while循环适用场合
(1)循环次数未知,但循环结束的条件已知。
(2)循环条件有两个或两个以上。
①在while循环前应对变量赋初值。
②循环变量的变化要在循环体内通过赋值语句来实现。
例题精析
2
例1 输入一个正整数,输出所有的质因子。如24=2*2*2*3。实现上述功能的Python代码如下:
n=int(input("输入一个正整数:"))
i=2
while ①      :
  if n %i==0:
   n=n/i
   print(i)
 else:
  ②     
(1)在程序划线处填入合适的代码。
(2)按照上述算法,输入60,依次输出的质因子是      。
答案 (1)①n>1或n!=1 ②i+=1 (2)2 2 3 5
解析 最小的质因数是2,如果能被2整除,则反复相除,当不能被2整除时,将i增加1,尝试被3整除,如果还不能除通,往上增加到4,由于前面反复除2操作,因此不可能被不是质数的数除通。当相除的结果为1时,终止循环。输入60,可以被2除2次,被3除1次,被5除1次。
变式训练1 工作人员手中有人民币100、50、20、10和1元5个币种,输入一个金额,按最大票面优先兑换的原则,输出相应的人民币及张数。实现上述功能的Python代码如下:
je=int(input("请输入金额!"))
rmb=[100,50,20,10,1]
i,t=0,0
while je>0:
  if①      :
D
    t=je∥rmb[i]
    ②     
    print("兑换"+str(rmb[i])+"元"+str(t)+"张")
  else:
    i+=1
(1)在程序划线处填入合适的代码。
(2)按照上述算法,输入356,依次输出人民币100、50、20、10和1元5个币种的总的数量是      。
答案 (1)①je>=rmb[i] ②je=je-rmb[i]*t (2)10
解析 当所剩金额大于或等于当前币种时,计算可以兑换的张数t,接着减去当前币种的金额,如果金额小于当前金额时,找到下一种较小的金额进行尝试,直到全部兑换完毕。输入356元,可以换3张100元,1张50元和6张1元。
例2 十进制数转换成二进制数:十进制可以用按权展开相加的表达式来表示,如13D=1×23+1×22+0×21+1×20。若十进制数大于k位上的权值,则k位上数为1,否则为0。设计的Python程序如下所示:
n=int(input("输入一个十进制数"))
ss=""
k=0
while 2**k  k+=1
  t=2**(k-1)
  if n>=t:
    ss=ss+"1"
    ①     
  else:
    ss=ss+"0"
    ②     
print(ss)
(1)加框处代码有误,请修正这个错误。
(2)请在程序划线处填入合适的代码。
答案 (1)n>0 or k>0 (2)①n=n-t ②k-=1
解析 变量k表示转换成二进制的长度,每次需减去k位上的权值t,若n大于等于t,表示该位上数为1,完成该位转换,同时需减去该位上的可能权值。若n已经为零,但k并没有达到最低位0,例如12D,减去8减去4后,得到0,但只输出2个1,此时k=2,还需输出2个0。
变式训练2 下列程序的功能是:计算表达式1×3+2×3+3×3+…100×3的值,并输出计算结果。
s=0
i=1
while i<=100:
       
  i+=1
print(s)
(1)刚退出循环时,变量i的值是      。
(2)为了实现上述表达式的计算,程序中划线处的语句为      。
答案 (1)101 (2)s=s+i*3或s+=i*3
解析 本题主要考查的是while循环的程序实现。(1)循环变量i的初值为1,步长为1,循环条件为i<=100,即当i=101时,循环结束。(2)根据表达式可知,划线处语句的功能是将i*3的值进行累加,从print(s)语句可知,累加和存放在变量s中,因此划线处的语句为s=s+i*3,也可以写为s+=i*3。
例3 判断一个字符串是否为回文串。如果一个字符串,从左到右读和从右到左读是完全一样的,那么这个字符串称为回文串。下面程序的功能是:输入一个字符串,检测是否为回文串。
s=input("输入一个字符串")
i=0
j=len(s)-1
flag=True
while①      :
if s[i]==s[j]:
     i+=1
     j-=1
  else:
     ②     
print(flag)
(1)请在程序划线处填入合适的代码。
(2)上述程序的功能与语句print(s==s[::-1])功能    (填:是/否)一致。
答案 (1)①i解析 本题考查的是多条件循环。变量i和j分别表示首尾两个位置,对首尾的字符依次比较,如果相等,分别后移和前移,如果不相等,表示不是回文,循环结束。s[::-1]表示将字符串s首尾互换,若两者相等,表示是回文字符。
  flag=-flag
  n=n+2
  ②     
print("π=%f"%(4*s),"t=",t,"n=",n)
运行结果:
π=3.141593 t=9.9999999e-09 n=100000001
答案 ①abs(t)>=1e-8 ②t=flag*1.0/n或t=flag*1/n
解析 本题主要考查的是while循环的灵活应用。条件是最后一项的绝对值小于10-8,需要使用绝对值函数abs,10-8用科学计数法来表示为1e-8,因此①处代码为abs(t)>=1e-8;用flag变量来表示正负符号,每一项的值为实数,用1.0/n来表示,因此②处代码为t=flag*1.0/n。
例4 有如下Python程序段:
s=input("输入字符串:")
n=len(s)
i,j=0,n-1
result=""
while i=n∥2:
  if s[i]>s[j]:
    result+=s[i]; j-=1
  elif s[i]    result+=s[j]; i+=1
  else:
    i+=1;j-=1
print(result)
执行该程序段,分别输入下列选项中的字符串,输出结果不为“555”的是(  )
A."51234" B."12535" C."54321“ D."55123"
解析 本题考查字符串的操作。该程序段的作用是将字符串 s 中左半部分与右半部分按照从大到小的顺序交替排列,生成一个新的字符串 result。输入 s 字符串为 12535 时,输出结果为 55。
B
随堂检测
3
1.有如下Python程序段:
n=int(input("请输入一个正整数:"))
s=0;i=1
while i  if n%i==0:
    s=s+i
  i=i+1
print(s)
运行程序,输入18输出s的值是(  )
A.5 B.21 C.39 D.6
B
解析 本题考查循环结构。把n的因子进行相加。
2.有如下Python程序段:
m=int(input("输入一个数字串"))
s=""
flag=True
while m>0:
  r=m%10
  m=m∥10
  if flag and r%2!=0:
    s=str(r)+s
    flag=not flag
print(flag,s)
若输入的值为“5201314”,执行该程序段后,输出的结果是 (  )
A.False 1 B.True 1 C.False 2 D.True 4
解析 本题考查循环控制结构和逻辑变量运用。语句r=m%10取出m的个位数,语句m=m∥10去除m的个位数,因此该循环是从后向前取出数字串的各个数字,当条件flag and r%2!=0成立时,把r变成字符并联接入s中,语句flag=not flag的作用是把flag的值变为False,该程序的功能是找到第一个奇数。
A
3.有如下Python程序段:
s="CixiStudent"
f=[0]*26;t=s[4:];i=0
while i  if 'A'<=t[i]<="Z":
    i+=1
    continue
  elif 'a'<=t[i]<="z" and f[ord(t[i])-ord('a')]==0:
    f[ord(t[i])-ord('a')]=1
  i+=1
for i in range(26):
  if f[i]==1:
    print(chr(i+ord('a')),end='')
A
运行以上程序段后,输出的内容为 (  )
A.dentu B.Student C.tuden D.deintux
解析 本题考查循环控制结构。continue语句用来告诉python跳过当前循环,进行下一个循环。列表t中的值为'Student',f列表中有26个元素,可以看成一个桶,当某个字母出现,ord(t[i])-ord('a')对应的索引号的元素值为1,表示该字母出现过。将出现过的字母从小到大输出。
B.for i in range(5):
  if a [i]>0:
    break
 a[0],a[i]=a[i],a[0]
D
A.i=0
 while a[i]==0:
   i+=1
 a[0],a[i]=a[i],a[0]
C.i=0
 while True:
   if a[i]>0:
     break
   i+=1
 a[0],a[i]=a[i],a[0]
D.for i in a:
   if i>0:
    break
 a[0],a[i]=a[i],a[0]
解析 本题考查循环结构。D选项中变量i已经是列表a中的元素,则最后进行交换的并不是a[i],正确的交换语句为:a[0],i=i,a[0]。
5.有如下Python程序段:
s="akpboyogirlyygirlkp"
s1=s+"###";boy=0;girl=0;i=0
while i  a=s1[i];b=s1[i+1];c=s1[i+2];d=s1[i+3]
  if a=="b" or b=="o" or c=="y":
    boy=boy+1
  if a=="g" or b=="i" or c=="r" or d=="1":
    girl=girl+1
  i+=1
B
执行该程序段后,变量boy及girl的值分别为 (  )
A.1 2 B.4 2 C.4 3 D.6 9
解析 本题考查列表的枚举。连续取出4个字符,若第1、2、3个字符中分别是b、o、y中一个,则boy增加1。如i等于5时,取出"yog",第2个字符是"o";取出"rly"、"lyy",第3个字符是"y"。
6.有如下Python程序段:
a=[3,4,2,5,6,7,7,1,2]
m,c,i=1,1,1
while i  if a[i]>=a[i-1]:
    c+=1
    m=max (m,c)
  else:
    c=1
  i+=1
print (c,m)
则程序执行后,c和m的值分别是(  )
A.1 5 B.1 4 C.2 5 D.2 4
C
7.有如下Python程序段:
count=0;i=1
while i<100:
  if int(i**0.5)==i**0.5:
    count+=1
  i+=1
print(count)
运行程序后,输出的结果是(  )
A.9 B.0 C.99 D.5
A
8.对由小写字母组成的长度相同的两个字符串s1和s2进行各字母数量检测,如"abdac"与"aabcd"所含字母数量一致,与"aabcc"所含字母数量不一致。实现该功能的Python部分程序段如下:
s1="";s2=""
b=[0]*26
for i in range (len(s1)) :
  x=ord(s1[i])-97;b[x]+=1
  y=ord(s2[i])-97; (1) 
j=0
while j<26:
  if  (2) :
    break
  j+=1
if j==26:
  print("所含字母数量一致")
else:
  print("所含字母数量不一致")
上述程序段中划线处可选语句为:
①b[y]+=1 ②b[y]-=1 ③b[j]!=0
④b[j]==0
则(1)(2)处语句依次应为(  )
A.①③ B.②④ C.②③ D.①④
C
9.有如下Python程序:
a = [0] * 10 ; c = 0
n = int(input("输入n的值:"))
while n > 0:
  a[n % 10] += 1
  if a[n % 10] == 2:
    c += 1
  n ∥= 10
print(c)
运行该程序后,输出结果为2,则输入n的值可能为 (  )
A.135553 B.234125 C.202222 D.112233
A
4
巩固与提升
基础巩固
能力提升
1.有如下Python程序段:
s1='blgr';s2='bollymgpric'
i=0;j=0;s3=''
while i<=len(s1)-1 and j<=len(s2)-1:
  if s1[i]==s2[j]:
    i+=1
  else:
    s3=s3+s2[j]
  j+=1
print(s3)
执行该程序段后,输出的内容为(  )
A.oymp B.olymp C.olympic D.oympic
B
2.有如下Python程序段:
code="0123456789ABCDEF"
numstr=input("请输入一个二进制整数:")
numlen=len(numstr)
s=0;ss=""
for i in range(numlen):
  x=int(numstr[i])*2**(numlen-i-1)
  s+=x
t=s
while t>0:
  ss=code[t%16]+ss
  t=t∥16
print(ss)
运行该程序段,输入1100111,程序结果为(  )
A.110 B.103
C.67 D.1100111
C
3.有如Python下程序段:
s1=[12,15,28]
s2=[15,28,32]
i=0
while i<=len(s1)-1:
  if s1[i] not in s2:
    print(s1[i])
  i=i+1
以下说法正确的是 (  )
A.该程序输出结果为32
B.该程序的算法是解析算法
C.该程序输出的结果为[12]
D.该程序实现的功能是得到s1中有但s2中没有的元素
D
4.有下面一段程序:
a=[9,5,2,3,0,-9,5,0,7,-10]
s,i=0,0
while a[i]!=0 and i < len(a):
  s+=1
  i+=1
运行该程序后s的值为(  )
A.4 B.5 C.8 D.10
A
解析 本题考查循环结构while语句,当i位置上的元素值不为0且满足i比列表a长度来的小的时候可以进入循环,此时s,i的值分别+1,不满足任一条件时循环结束,可以看到列表中有元素0,此时i的值为4,因此结束时s的值也是4。
5.小明用Python编写了一个找最大值的程序,程序功能是:用户输入数字串,数据间用逗号分隔,最后以逗号结尾,程序执行后输出最大的数值。程序段如下,划线处代码正确的是 (  )
s=input("请输入数字串:")
i=j=max=0
c=t=""
while j  c=s[j]
  if c==",":
    t=s[i:j]
B
    if int(t)>max:
      max=int(t)
    ① 
  ② 
print(max)
A.①i=i+1 ②j=j+1
B.①i=j+1 ②j=j+1
C.①j=j+1 ②i=i+1
D.①j=i+1 ②i=i+1
解析 本题考查循环结构嵌套分支结构找最值模型,i表示数字的左索引,j表示数字后逗号的索引值,t为逗号前完整的数字,当找到比当前最大值还要大的值时,更新最大值并且更新左边界和右边界的值继续往下找,因此答案为B。
6.在一次抽奖活动中,需要在8人中随机抽取3个幸运奖,对应的Python程序如下:
import random
xm=["A","B","C","D","E","F","G","H"]
             #用字母代表人名
hj=[""]*3
bz=[False]*8
i=0
while i<=2:
  n=random.randint(0,7) #产生一个0-7之间的整数n
    
print(hj)
程序划线处代码合适的是 (  )
A
A.if bz[n]==False:
  hj[i]=xm[n]
  bz[n]=True
  i+=1
B.if bz[n]==True:
  hj[i]=xm[n]
  bz[n]=False
  i+=1
C.if bz[i]==False:
  hj[n]=xm[i]
  bz[i]=True
  i+=1
D.if bz[i]==True:
  hj[n]=xm[i]
  bz[i]=True
  i+=1
解析 本题考查随机函数的应用。列表bz中有8个元素,其初值均为False,表示该索引号对应的xm元素没有抽到奖。变量i表示第几个幸运观众,变量n表示幸运观众的索引号。
7.有如下Python程序段:
import random
a=[-1]*5
for i in range(len(a)):
  a[i]=random.randint(1,10) #产生一个[1,10]之间的整数
for i in range(2,4):
  key=a[i]
  j=i-1
  while j>=1 and key    a[j+1]=a[j]
    j-=1
  a[j+1]=key
执行该程序段后,变量a可能的值为 (  )
A.[1,0,3,6,7] B.[3,2,6,7,1]
C.[1,3,2,5,7] D.[3,5,6,2,7]
解析 本题考查随机数应用和顺序查找。在循环体中,i的值为2或3,语句key=a[i]的功能是把a[i]的值保存到key中,同时可以腾出位置i,在他前面的数a[j],如果满足keyB
上述程序段中方框处可选代码为:①k=0 ② k=1 ③nums[k]=nums[i] ④nums[i-1]=nums[i] 则(1)、(2)处代码依次为 (  )
A.①③ B.①④ C.②③ D.②④
解析 本题考查删除重复项的代码段理解。本题的思路是:从第二个字符开始遍历有序字符串 s 的各个字符,若前后相邻两个字符不相等,把当前字符重新赋值到字符串 s 中,此时的索引用 k 来表示,若前后两个字符相等, 则跳过当前字符,不组合。以["a","a","b","b","b","c"]为例,最终会得到["a","b","c"]。
C
9.有如下Python程序:
a = [1, 5, 3, 2, 1, 4, 5, 8, 4, 3]
i = 1;max_list = []
while i <= len(a)-2:
  if a[i-1] < a[i] and a[i] > a[i+1]:
    max_list.append(a[i]) #append()方法用于在列表末尾添加新的对象
  i += 1
print(max_list)
执行该程序段后,列表 max_list 的值为(  )
A.[1] B.[8] C.[5, 8] D.[5, 1, 8]
C
10.有如下Python程序段:
s=input("请输入字符串:")
i=0;j=1;t=0;s1="";maxs=""
while i  if s[i]<=s[i+1]:
    j+=1
    s1=s[t:t+j]
    if len(maxs)<=len(s1):
      maxs=s1
  else:
    s1=""
    t=i+1
    j=1
  i+=1
print(maxs)
执行该程序,当输入“p8579yt559h6”时,输出的结果为(  )
A.579 B.579y C.559h D.t559h
C
11.学校举办“十佳歌手”比赛,经初赛选拔,共有15位同学进入决赛。现需制定一个决赛出场顺序,即为每位进入决赛的同学随机分配一个出场序号。编写的Python程序段如下:
import random # 导入随机模块
name=["张**","李**","王*","许*","林**","王**","陈*","洪**","鲍**","罗*","张*","吴**","方*","郑*","章*"]
seq={};a=[];i=0
while i<=14:
  m=random.randint(1,15) #产生[1,15]范围内的随机整数
  if m not in a: # ①
    a+=[m]
    seq[name[i]]=m
    i+=1 # ②
print(seq) # ③
运行上述程序段后,下列说法正确的是(  )
A.列表a中的元素不会重复
B.①处语句最多执行15次
C.②处语句缩进应与①处语句对齐,避免程序死循环
D.③处语句缩进应与①处语句对齐,否则只输出一个序号
A
解析 本题考查循环语句、字典和随机函数。当数m不在列表a中时,才会将数m放入列表中,因此列表a中的元素不会重复。变量m是随机产生的整数,则并不能保住m每次都不同,若是产生了重复的数,则程序会再次进入循环,重新产生随机数,因此①处语句是最少执行15次。若②处语句缩进应与①处语句对齐,则不论变量m是否为重复的数,i的值都会加1,while循环一共循环15次,会造成部分同学没有序号的情况。若③处语句缩进应与①处语句对齐,则每进入一次循环,都会输出字典seq的值。而在原程序中,若产生了一个不重复的新序号,则会将该序号与一位同学对应起来形成字典中的键值对。因此最终输出的字典中存放了所有同学与之对应的序号。
12.有如下程序段:
import random #导入随机数模块
n=random.randint(0,100) #产生0-100之间的随机整数,包含0和100
m=n;k=0;s=""
while n!=1:
  for i in range(2,n+1):
    if n%i==0:
      k=i
      n=n∥k
      s=s+str(k)+"*"
      break
print(m,"=",s[0:len(s)-1])
D
A
14.奇偶校验是一种校验数据传输正确性的方法。其中奇校验方法:统计二进制数据的数位中“1”的个数,若个数为奇数,则校验位值为0,否则校验位值为1。小李编写了一个计算奇校验位的程序,功能如下:键盘输入1~255十进制待校验数,输出该数对应的二进制值及该数的校验位值。程序运行界面如图所示。
实现上述功能的程序如下,请在程序划线处填入合适的代码。
n=int(input("请输入待校验数:"))
t=0
s=""
请输入待校验数:2020
转换为二进制数为:11111100100 校验位值为:0
>>>
while n>0:
 a=n%2
 ①     
 t=t+a
 s=str(a)+s
②     
print("转换为二进制数为:",s,"校验位值为:",1-v)
答案 ①n=n∥2 ②v=t%2
解析 本题的算法思想是将整数n转化为二进制数,然后统计1的个数,再对统计个数进行校验。十进制化二进制的方法为除2取余,每得到一个余数,则将余数累加在变量t中,商为n∥2,因此①处为n=n∥2;根据print语句可知,结果为1-v,即v为1时校验位值为0,v为0时校验位值为1,因此可推断出②处语句为v=t%2。
15.某次测试的答题结果存储在asht.txt文件中,该文件每行记录1个考生10道单选题的答案,每题有A、B、C、D四个选项,空白的答案标记为'K'。评分标准:正确得3分,错误得-1分,空白得0分。实现评分的Python程序如下。
ANS='ACBBCDADBC' #ANS 为标准答案
score=[]
for line in open('asht.txt','r'):
  score.append(0)
  i=len(score)-1
  j=0
  while j    if①      :
      score[i]+=3
    elif line[j]!='K':
      ②     
    j+=1
print(score)
(1)若标准答案为:'ACBBCDADBC',则答案
'ACBBDDADKC'的得分为    。
(2)完善上述①②处代码。
答案 (1)23 (2)①line[j]==ANS[j] ②score[i]-=1
解析 本题考查顺序查找算法。line表示asht.txt文件中每一条记录,每条记录有10道单选题答案。语句score.append(0)表示每读取一条记录,该列表增加一个值为0的元素,i表示score列表中最后一个元素的索引值。j初值为0,终值为len(ANS)-1,表示在标准答案中比对当前记录中答案,如果line[j]==ANS[j]表示当前答案与标准答案一致,得3分,不正确将扣1分。
16.分解质因数是指一个整数可以写成几个质数相乘的形式。现有如下Python程序段实现对一个整数(可以为负整数)分解质因数,如输入正整数 30,输出结果为:30=2*3*5,输入负整数-4,输出结果为:-4=-1*2*2。
t=int(input("输入一个整数:"))
ans = str(t)+"="
if t<0:
  t=-t
  ans += "-1*"
i=2
while t>1:
  while t%i==0:
    ans += str(i)+"*"
    ①   
  i+=1
print(②     )
(1)当输入整数-56时,输出的结果为        。
(2)请在划线处填入合适的代码。
答案 (1)-56=-1*2*2*2*7 (2)① t∥=i② ans[:-1] 或 ans[0:len(ans)-1]
17.尼克斯彻定理:任何一个大于等于 1 的整数的立方等于一串连续奇数之和。如:33=7+9+11,编写一个Python 程序验证尼克斯彻定理,程序运行时,输入一个大于等于1的整数,输出验证结果如下图所示:
(1)若输入数字2,输出的结果为     。
(2)完善划线处的代码。
n=int(input("请输入一个大于等于 1 的整数:"))
for i in range(1,n**3+1,2):
请输入一个大于1的整数:3
3**3=7+9+11
  sum1=0
  t=i
  while sum1    ①   
    t+=2
  if sum1==n**3:
    break
s=str(n)+"**"+str(3)+"="
while sum1>0:
  sum1-=i
  if ②    :
    s+=str(i)
  else:
    s+=str(i)+"+"
    i=③   
print(s)
答案 (1)2**3=3+5 (2)①sum1+=t ②sum1==0 ③i+2
18.如果集合a的任意一个元素都是集合b的元素,那么集合a称为集合b的子集。例如集合a的元素依次为[1,3,5],集合b的元素依次为[1,2,3,4,5],集合a的任意一个元素都是集合b中的元素,所以集合a称为集合b的子集。编写Python程序,用于判断集合a是否是集合b的子集,功能如下:程序运行时随机产生na个不重复的整数存储在集合a中,随机产生nb个不重复的整数存储在集合b中。显示判断的结果,程序运行界面如图所示。
[2,8,18]
[5,14,19,10,12,18,4,2,7,17]
a不是b的子集
(1)集合a中元素为[3,6,7],集合b中元素为[6,19,7,13,2,10,3],集合a是否为集合b的子集    (填字母。A.是 B.否) 。
(2)完善划线处代码。
import random
na=3;nb=10
#随机产生 na 个不重复的整数存储在列表 a 中,随机产生 nb 个不重复的整数存储在列表 b 中,代码略
print(a);print(b)
①   
i=0
while ②    :
  j=0
  while j    if ③    :
      break
    j+=1
  if j==nb:
    flag=False
  i+=1
if flag:
  print("a 是 b 的子集")
else:
  print("a 不是b 的子集")
答案 (1)A (2)①flag=True ②i19.下列程序统计字符串(由数字或字母组成)中同一字符连续出现最多的次数,如果有多个字符连续出现次数并列最多,输出第一个字符,例如程序运行时,输入字符串:“aabb33ddddf88888q",输出结果为:8出现的次数最多,最多共连续出现了5次
Python程序如下:
s=input("请输入字符串:")
c=0;m=0;dic={}
maxlen=0;d=0
while c+1<=len(s):
  if s[c] not in dic:
    dic[s[c]]=1
  while s[c]==s[c+m]:
    m+=1
    if c+m==len(s):
      ①   
  if m>maxlen:
    dic[s[c]]=m
    d=c
    ②   
  c+=m
  m=0
print(③     +"出现的次数最多")
print("最多共连续出现了"+str( maxlen ),"次")
print("位于字符串的第",d+1,"位到第",d+maxlen+1 ,"位")
(1)请在划线处填入合适的代码。
(2)加框处的代码还可以用    代替。
答案 (1)①break ②maxlen=m ③s[d] (2)dic[s[d]]课时6 While循环语句及程序实现
课时目标
1.掌握while循环语句的语法格式,理解while循环的功能。2.熟练使用while循环语句解决实际问题。
1.while循环的功能
While循环在执行时,首先会判断条件是否为真,如果条件为真,执行一次循环体,再次判断条件是否为真,如果仍为真,那么再执行一次循环体,以此类推,直到条件为假时退出while语句。
2.while循环语句格式
while〈条件〉:
〈循环体〉
3.while循环适用场合
(1)循环次数未知,但循环结束的条件已知。
(2)循环条件有两个或两个以上。
①在while循环前应对变量赋初值。
②循环变量的变化要在循环体内通过赋值语句来实现。
例1 输入一个正整数,输出所有的质因子。如24=2*2*2*3。实现上述功能的Python代码如下:
n=int(input(″输入一个正整数:″))
i=2
while ①____________:
 if n % i==0:
n=n/i
print(i)
else:
②____________
(1)在程序划线处填入合适的代码。
(2)按照上述算法,输入60,依次输出的质因子是____________。
听课笔记:                                    
                                    
                                    
                                    
                                    
                                    
变式训练1 工作人员手中有人民币100、50、20、10和1元5个币种,输入一个金额,按最大票面优先兑换的原则,输出相应的人民币及张数。实现上述功能的Python代码如下:
je=int(input(″请输入金额!″))
rmb=[100,50,20,10,1]
i,t=0,0
while je>0:
  if①____________:
   t=je∥rmb[i]
   ②____________
   print(″兑换″+str(rmb[i])+″元″+str(t)+″张″)
 else:
   i+=1
(1)在程序划线处填入合适的代码。
(2)按照上述算法,输入356,依次输出人民币100、50、20、10和1元5个币种的总的数量是____________。
例2 十进制数转换成二进制数:十进制可以用按权展开相加的表达式来表示,如13D=1×23+1×22+0×21+1×20。若十进制数大于k位上的权值,则k位上数为1,否则为0。设计的Python程序如下所示:
n=int(input(″输入一个十进制数″))
ss=″″
k=0
while 2**k k+=1
while:
 t=2**(k-1)
 if n>=t:
ss=ss+″1″
①____________
 else:
ss=ss+″0″
②____________
print(ss)
(1)加框处代码有误,请修正这个错误。
(2)请在程序划线处填入合适的代码。
听课笔记:                                    
                                    
                                    
变式训练2 下列程序的功能是:计算表达式1×3+2×3+3×3+…100×3的值,并输出计算结果。
s=0
i=1
while i<=100:
  ____________
  i+=1
print(s)
(1)刚退出循环时,变量i的值是____________。
(2)为了实现上述表达式的计算,程序中划线处的语句为____________。
例3 判断一个字符串是否为回文串。如果一个字符串,从左到右读和从右到左读是完全一样的,那么这个字符串称为回文串。下面程序的功能是:输入一个字符串,检测是否为回文串。
s=input(″输入一个字符串″)
i=0
j=len(s)-1
flag=True
while①____________:
  if s[i]==s[j]:
     i+=1
     j-=1
  else:
    ②____________
print(flag)
(1)请在程序划线处填入合适的代码。
(2)上述程序的功能与语句print(s==s[::-1])功能________(填:是/否)一致。
听课笔记:                                    
                                    
                                    
变式训练3 用下列公式计算的π近似值,直到最后一项的绝对值小于10-8为止。
提示:≈1-+-+-…
实现上述功能的程序如下,请在程序划线处填入合适的代码。
n=t=1
s=0
flag=1
while①____________:
  s=s+t
  flag=-flag
  n=n+2
  ②____________
print(″π=%f″%(4*s),″t=″,t,″n=″,n)
运行结果:π=3.141593 t=9.9999999e-09 n=100000001
例4 有如下Python程序段:
s=input(″输入字符串:″)
n=len(s)
i,j=0,n-1
result=″″
while i=n∥2:
  if s[i]>s[j]:
   result+=s[i]; j-=1
  elif s[i]   result+=s[j]; i+=1
else:
   i+=1;j-=1
print(result)
执行该程序段,分别输入下列选项中的字符串,输出结果不为“555”的是(  )
A.″51234″ B.″12535″
C.″54321″ D.″55123″
听课笔记:                                    
                                    
                                    
                                    
1.有如下Python程序段:
n=int(input("请输入一个正整数:"))
s=0;i=1
while i  if n%i==0:
    s=s+i
  i=i+1
print(s)
运行程序,输入18输出s的值是 (  )
A.5 B.21 C.39 D.6
2.有如下Python程序段:
m=int(input("输入一个数字串"))
s=""
flag=True
while m>0:
  r=m%10
  m=m∥10
  if flag and r%2!=0:
    s=str(r)+s
    flag=not flag
print(flag,s)
若输入的值为“5201314”,执行该程序段后,输出的结果是 (  )
A.False 1 B.True 1 C.False 2 D.True 4
3.有如下Python程序段:
s="CixiStudent"
f=[0]*26;t=s[4:];i=0
while i  if 'A'<=t[i]<="Z":
    i+=1
    continue
  elif 'a'<=t[i]<="z" and f[ord(t[i])-ord('a')]==0:
    f[ord(t[i])-ord('a')]=1
  i+=1
for i in range(26):
  if f[i]==1:
    print(chr(i+ord('a')),end='')
运行以上程序段后,输出的内容为 (  )
A.dentu B.Student C.tuden D.deintux
4.将一组数保存在列表a中,若a[0]=0,则在列表a中从左到右找到第一个大于零的元素,并与a[0]交换。用Python程序描述,下列选项中不可行的是 (  )
A.i=0
 while a[i]==0:
   i+=1
 a[0],a[i]=a[i],a[0]
B.for i in range(5):
  if a [i]>0:
    break
 a[0],a[i]=a[i],a[0]
C.i=0
 while True:
   if a[i]>0:
     break
   i+=1
 a[0],a[i]=a[i],a[0]
D.for i in a:
   if i>0:
    break
 a[0],a[i]=a[i],a[0]
5.有如下Python程序段:
s="akpboyogirlyygirlkp"
s1=s+"###";boy=0;girl=0;i=0
while i  a=s1[i];b=s1[i+1];c=s1[i+2];d=s1[i+3]
  if a=="b" or b=="o" or c=="y":
    boy=boy+1
  if a=="g" or b=="i" or c=="r" or d=="1":
    girl=girl+1
  i+=1
执行该程序段后,变量boy及girl的值分别为 (  )
A.1 2 B.4 2 C.4 3 D.6 9
6.有如下Python程序段:
a=[3,4,2,5,6,7,7,1,2]
m,c,i=1,1,1
while i  if a[i]>=a[i-1]:
    c+=1
    m=max (m,c)
  else:
    c=1
  i+=1
print (c,m)
则程序执行后,c和m的值分别是 (  )
A.1 5 B.1 4 C.2 5 D.2 4
7.有如下Python程序段:
count=0;i=1
while i<100:
  if int(i**0.5)==i**0.5:
    count+=1
  i+=1
print(count)
运行程序后,输出的结果是 (  )
A.9 B.0 C.99 D.5
8.对由小写字母组成的长度相同的两个字符串s1和s2进行各字母数量检测,如"abdac"与"aabcd"所含字母数量一致,与"aabcc"所含字母数量不一致。实现该功能的Python部分程序段如下:
s1="";s2=""
b=[0]*26
for i in range (len(s1)) :
  x=ord(s1[i])-97;b[x]+=1
  y=ord(s2[i])-97; (1) 
j=0
while j<26:
  if  (2) :
    break
  j+=1
if j==26:
  print("所含字母数量一致")
else:
  print("所含字母数量不一致")
上述程序段中划线处可选语句为:
①b[y]+=1 ②b[y]-=1 ③b[j]!=0
④b[j]==0
则(1)(2)处语句依次应为 (  )
A.①③ B.②④ C.②③ D.①④
9.有如下Python程序:
a = [0] * 10 ; c = 0
n = int(input("输入n的值:"))
while n > 0:
  a[n % 10] += 1
  if a[n % 10] == 2:
    c += 1
  n ∥= 10
print(c)
运行该程序后,输出结果为2,则输入n的值可能为 (  )
A.135553 B.234125
C.202222 D.112233

展开更多......

收起↑

资源列表