資源簡介 課時(shí)6 While循環(huán)語句及程序?qū)崿F(xiàn)課時(shí)目標(biāo)1.掌握while循環(huán)語句的語法格式,理解while循環(huán)的功能。2.熟練使用while循環(huán)語句解決實(shí)際問題。1.while循環(huán)的功能While循環(huán)在執(zhí)行時(shí),首先會(huì)判斷條件是否為真,如果條件為真,執(zhí)行一次循環(huán)體,再次判斷條件是否為真,如果仍為真,那么再執(zhí)行一次循環(huán)體,以此類推,直到條件為假時(shí)退出while語句。2.while循環(huán)語句格式while<條件>:<循環(huán)體>3.while循環(huán)適用場合(1)循環(huán)次數(shù)未知,但循環(huán)結(jié)束的條件已知。(2)循環(huán)條件有兩個(gè)或兩個(gè)以上。①在while循環(huán)前應(yīng)對(duì)變量賦初值。②循環(huán)變量的變化要在循環(huán)體內(nèi)通過賦值語句來實(shí)現(xiàn)。例1 輸入一個(gè)正整數(shù),輸出所有的質(zhì)因子。如24=2*2*2*3。實(shí)現(xiàn)上述功能的Python代碼如下:n=int(input("輸入一個(gè)正整數(shù):"))i=2while ① : if n %i==0: n=n/i print(i) else: ② (1)在程序劃線處填入合適的代碼。(2)按照上述算法,輸入60,依次輸出的質(zhì)因子是 。 答案 (1)①n>1或n!=1 ②i+=1 (2)2 2 3 5解析 最小的質(zhì)因數(shù)是2,如果能被2整除,則反復(fù)相除,當(dāng)不能被2整除時(shí),將i增加1,嘗試被3整除,如果還不能除通,往上增加到4,由于前面反復(fù)除2操作,因此不可能被不是質(zhì)數(shù)的數(shù)除通。當(dāng)相除的結(jié)果為1時(shí),終止循環(huán)。輸入60,可以被2除2次,被3除1次,被5除1次。變式訓(xùn)練1 工作人員手中有人民幣100、50、20、10和1元5個(gè)幣種,輸入一個(gè)金額,按最大票面優(yōu)先兌換的原則,輸出相應(yīng)的人民幣及張數(shù)。實(shí)現(xiàn)上述功能的Python代碼如下:je=int(input("請輸入金額!"))rmb=[100,50,20,10,1]i,t=0,0while 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個(gè)幣種的總的數(shù)量是 。 答案 (1)①je>=rmb[i] ②je=je-rmb[i]*t (2)10解析 當(dāng)所剩金額大于或等于當(dāng)前幣種時(shí),計(jì)算可以兌換的張數(shù)t,接著減去當(dāng)前幣種的金額,如果金額小于當(dāng)前金額時(shí),找到下一種較小的金額進(jìn)行嘗試,直到全部兌換完畢。輸入356元,可以換3張100元,1張50元和6張1元。例2 十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù):十進(jìn)制可以用按權(quán)展開相加的表達(dá)式來表示,如13D=1×23+1×22+0×21+1×20。若十進(jìn)制數(shù)大于k位上的權(quán)值,則k位上數(shù)為1,否則為0。設(shè)計(jì)的Python程序如下所示:n=int(input("輸入一個(gè)十進(jìn)制數(shù)"))ss=""k=0while 2**k k+=1whilen>0 and k>0: t=2**(k-1) if n>=t: ss=ss+"1" ① else: ss=ss+"0" ② print(ss)(1)加框處代碼有誤,請修正這個(gè)錯(cuò)誤。(2)請?jiān)诔绦騽澗€處填入合適的代碼。答案 (1)n>0 or k>0 (2)①n=n-t ②k-=1解析 變量k表示轉(zhuǎn)換成二進(jìn)制的長度,每次需減去k位上的權(quán)值t,若n大于等于t,表示該位上數(shù)為1,完成該位轉(zhuǎn)換,同時(shí)需減去該位上的可能權(quán)值。若n已經(jīng)為零,但k并沒有達(dá)到最低位0,例如12D,減去8減去4后,得到0,但只輸出2個(gè)1,此時(shí)k=2,還需輸出2個(gè)0。變式訓(xùn)練2 下列程序的功能是:計(jì)算表達(dá)式1×3+2×3+3×3+…100×3的值,并輸出計(jì)算結(jié)果。s=0i=1while i<=100: i+=1print(s)(1)剛退出循環(huán)時(shí),變量i的值是 。 (2)為了實(shí)現(xiàn)上述表達(dá)式的計(jì)算,程序中劃線處的語句為 。 答案 (1)101 (2)s=s+i*3或s+=i*3解析 本題主要考查的是while循環(huán)的程序?qū)崿F(xiàn)。(1)循環(huán)變量i的初值為1,步長為1,循環(huán)條件為i<=100,即當(dāng)i=101時(shí),循環(huán)結(jié)束。(2)根據(jù)表達(dá)式可知,劃線處語句的功能是將i*3的值進(jìn)行累加,從print(s)語句可知,累加和存放在變量s中,因此劃線處的語句為s=s+i*3,也可以寫為s+=i*3。例3 判斷一個(gè)字符串是否為回文串。如果一個(gè)字符串,從左到右讀和從右到左讀是完全一樣的,那么這個(gè)字符串稱為回文串。下面程序的功能是:輸入一個(gè)字符串,檢測是否為回文串。s=input("輸入一個(gè)字符串")i=0j=len(s)-1flag=Truewhile① : if s[i]==s[j]: i+=1 j-=1 else: ② print(flag)(1)請?jiān)诔绦騽澗€處填入合適的代碼。(2)上述程序的功能與語句print(s==s[::-1])功能 (填:是/否)一致。 答案 (1)①i解析 本題考查的是多條件循環(huán)。變量i和j分別表示首尾兩個(gè)位置,對(duì)首尾的字符依次比較,如果相等,分別后移和前移,如果不相等,表示不是回文,循環(huán)結(jié)束。s[::-1]表示將字符串s首尾互換,若兩者相等,表示是回文字符。變式訓(xùn)練3 用下列公式計(jì)算的π近似值,直到最后一項(xiàng)的絕對(duì)值小于10-8為止。提示:≈1-+-+-…實(shí)現(xiàn)上述功能的程序如下,請?jiān)诔绦騽澗€處填入合適的代碼。n=t=1s=0flag=1while① : s=s+t flag=-flag n=n+2 ② print("π=%f"%(4*s),"t=",t,"n=",n)運(yùn)行結(jié)果:π=3.141593 t=9.9999999e-09 n=100000001答案 ①abs(t)>=1e-8 ②t=flag*1.0/n或t=flag*1/n解析 本題主要考查的是while循環(huán)的靈活應(yīng)用。條件是最后一項(xiàng)的絕對(duì)值小于10-8,需要使用絕對(duì)值函數(shù)abs,10-8用科學(xué)計(jì)數(shù)法來表示為1e-8,因此①處代碼為abs(t)>=1e-8;用flag變量來表示正負(fù)符號(hào),每一項(xiàng)的值為實(shí)數(shù),用1.0/n來表示,因此②處代碼為t=flag*1.0/n。例4 有如下Python程序段:s=input("輸入字符串:")n=len(s)i,j=0,n-1result=""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-=1print(result)執(zhí)行該程序段,分別輸入下列選項(xiàng)中的字符串,輸出結(jié)果不為“555”的是 ( ) A."51234" B."12535" C."54321" D."55123"答案 B解析 本題考查字符串的操作。該程序段的作用是將字符串 s 中左半部分與右半部分按照從大到小的順序交替排列,生成一個(gè)新的字符串 result。輸入 s 字符串為 12535 時(shí),輸出結(jié)果為 55。 1.有如下Python程序段:n=int(input("請輸入一個(gè)正整數(shù):"))s=0;i=1while i if n%i==0: s=s+i i=i+1print(s)運(yùn)行程序,輸入18輸出s的值是 ( )A.5 B.21 C.39 D.6答案 B解析 本題考查循環(huán)結(jié)構(gòu)。把n的因子進(jìn)行相加。2.有如下Python程序段:m=int(input("輸入一個(gè)數(shù)字串"))s=""flag=Truewhile m>0: r=m%10 m=m∥10 if flag and r%2!=0: s=str(r)+s flag=not flagprint(flag,s)若輸入的值為“5201314”,執(zhí)行該程序段后,輸出的結(jié)果是 ( )A.False 1 B.True 1 C.False 2 D.True 4答案 A解析 本題考查循環(huán)控制結(jié)構(gòu)和邏輯變量運(yùn)用。語句r=m%10取出m的個(gè)位數(shù),語句m=m∥10去除m的個(gè)位數(shù),因此該循環(huán)是從后向前取出數(shù)字串的各個(gè)數(shù)字,當(dāng)條件flag and r%2!=0成立時(shí),把r變成字符并聯(lián)接入s中,語句flag=not flag的作用是把flag的值變?yōu)镕alse,該程序的功能是找到第一個(gè)奇數(shù)。3.有如下Python程序段:s="CixiStudent"f=[0]*26;t=s[4:];i=0while 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+=1for i in range(26): if f[i]==1: print(chr(i+ord('a')),end='')運(yùn)行以上程序段后,輸出的內(nèi)容為 ( )A.dentu B.Student C.tuden D.deintux答案 A解析 本題考查循環(huán)控制結(jié)構(gòu)。continue語句用來告訴python跳過當(dāng)前循環(huán),進(jìn)行下一個(gè)循環(huán)。列表t中的值為'Student',f列表中有26個(gè)元素,可以看成一個(gè)桶,當(dāng)某個(gè)字母出現(xiàn),ord(t[i])-ord('a')對(duì)應(yīng)的索引號(hào)的元素值為1,表示該字母出現(xiàn)過。將出現(xiàn)過的字母從小到大輸出。4.將一組數(shù)保存在列表a中,若a[0]=0,則在列表a中從左到右找到第一個(gè)大于零的元素,并與a[0]交換。用Python程序描述,下列選項(xiàng)中不可行的是 ( )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解析 本題考查循環(huán)結(jié)構(gòu)。D選項(xiàng)中變量i已經(jīng)是列表a中的元素,則最后進(jìn)行交換的并不是a[i],正確的交換語句為:a[0],i=i,a[0]。5.有如下Python程序段:s="akpboyogirlyygirlkp"s1=s+"###";boy=0;girl=0;i=0while 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執(zhí)行該程序段后,變量boy及girl的值分別為 ( )A.1 2 B.4 2 C.4 3 D.6 9答案 B解析 本題考查列表的枚舉。連續(xù)取出4個(gè)字符,若第1、2、3個(gè)字符中分別是b、o、y中一個(gè),則boy增加1。如i等于5時(shí),取出"yog",第2個(gè)字符是"o";取出"rly"、"lyy",第3個(gè)字符是"y"。6.有如下Python程序段:a=[3,4,2,5,6,7,7,1,2]m,c,i=1,1,1while i if a[i]>=a[i-1]: c+=1 m=max (m,c) else: c=1 i+=1print (c,m)則程序執(zhí)行后,c和m的值分別是 ( )A.1 5 B.1 4 C.2 5 D.2 4答案 C7.有如下Python程序段:count=0;i=1while i<100: if int(i**0.5)==i**0.5: count+=1 i+=1print(count)運(yùn)行程序后,輸出的結(jié)果是 ( )A.9 B.0 C.99 D.5答案 A8.對(duì)由小寫字母組成的長度相同的兩個(gè)字符串s1和s2進(jìn)行各字母數(shù)量檢測,如"abdac"與"aabcd"所含字母數(shù)量一致,與"aabcc"所含字母數(shù)量不一致。實(shí)現(xiàn)該功能的Python部分程序段如下:s1="";s2=""b=[0]*26for i in range (len(s1)) : x=ord(s1[i])-97;b[x]+=1 y=ord(s2[i])-97; (1) j=0while j<26: if (2) : break j+=1if j==26: print("所含字母數(shù)量一致")else: print("所含字母數(shù)量不一致")上述程序段中劃線處可選語句為:①b[y]+=1 ②b[y]-=1 ③b[j]!=0④b[j]==0則(1)(2)處語句依次應(yīng)為 ( )A.①③ B.②④ C.②③ D.①④答案 C9.有如下Python程序:a = [0] * 10 ; c = 0n = int(input("輸入n的值:"))while n > 0: a[n % 10] += 1 if a[n % 10] == 2: c += 1 n ∥= 10print(c)運(yùn)行該程序后,輸出結(jié)果為2,則輸入n的值可能為 ( )A.135553 B.234125C.202222 D.112233答案 A一、基礎(chǔ)鞏固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+=1print(s3)執(zhí)行該程序段后,輸出的內(nèi)容為 ( )A.oymp B.olymp C.olympic D.oympic答案 B2.有如下Python程序段:code="0123456789ABCDEF"numstr=input("請輸入一個(gè)二進(jìn)制整數(shù):")numlen=len(numstr)s=0;ss=""for i in range(numlen): x=int(numstr[i])*2**(numlen-i-1) s+=xt=swhile t>0: ss=code[t%16]+ss t=t∥16print(ss)運(yùn)行該程序段,輸入1100111,程序結(jié)果為 ( )A.110 B.103C.67 D.1100111答案 C3.有如Python下程序段:s1=[12,15,28]s2=[15,28,32]i=0while i<=len(s1)-1: if s1[i] not in s2: print(s1[i]) i=i+1以下說法正確的是 ( )A.該程序輸出結(jié)果為32B.該程序的算法是解析算法C.該程序輸出的結(jié)果為[12]D.該程序?qū)崿F(xiàn)的功能是得到s1中有但s2中沒有的元素答案 D4.有下面一段程序:a=[9,5,2,3,0,-9,5,0,7,-10]s,i=0,0while a[i]!=0 and i < len(a): s+=1 i+=1運(yùn)行該程序后s的值為 ( )A.4 B.5 C.8 D.10答案 A解析 本題考查循環(huán)結(jié)構(gòu)while語句,當(dāng)i位置上的元素值不為0且滿足i比列表a長度來的小的時(shí)候可以進(jìn)入循環(huán),此時(shí)s,i的值分別+1,不滿足任一條件時(shí)循環(huán)結(jié)束,可以看到列表中有元素0,此時(shí)i的值為4,因此結(jié)束時(shí)s的值也是4。5.小明用Python編寫了一個(gè)找最大值的程序,程序功能是:用戶輸入數(shù)字串,數(shù)據(jù)間用逗號(hào)分隔,最后以逗號(hào)結(jié)尾,程序執(zhí)行后輸出最大的數(shù)值。程序段如下,劃線處代碼正確的是 ( )s=input("請輸入數(shù)字串:")i=j=max=0c=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+1B.①i=j+1 ②j=j+1C.①j=j+1 ②i=i+1D.①j=i+1 ②i=i+1答案 B解析 本題考查循環(huán)結(jié)構(gòu)嵌套分支結(jié)構(gòu)找最值模型,i表示數(shù)字的左索引,j表示數(shù)字后逗號(hào)的索引值,t為逗號(hào)前完整的數(shù)字,當(dāng)找到比當(dāng)前最大值還要大的值時(shí),更新最大值并且更新左邊界和右邊界的值繼續(xù)往下找,因此答案為B。6.在一次抽獎(jiǎng)活動(dòng)中,需要在8人中隨機(jī)抽取3個(gè)幸運(yùn)獎(jiǎng),對(duì)應(yīng)的Python程序如下:import randomxm=["A","B","C","D","E","F","G","H"] #用字母代表人名hj=[""]*3bz=[False]*8i=0while i<=2: n=random.randint(0,7) #產(chǎn)生一個(gè)0-7之間的整數(shù)n print(hj)程序劃線處代碼合適的是 ( )A.if bz[n]==False: hj[i]=xm[n] bz[n]=True i+=1B.if bz[n]==True: hj[i]=xm[n] bz[n]=False i+=1C.if bz[i]==False: hj[n]=xm[i] bz[i]=True i+=1D.if bz[i]==True: hj[n]=xm[i] bz[i]=True i+=1答案 A解析 本題考查隨機(jī)函數(shù)的應(yīng)用。列表bz中有8個(gè)元素,其初值均為False,表示該索引號(hào)對(duì)應(yīng)的xm元素沒有抽到獎(jiǎng)。變量i表示第幾個(gè)幸運(yùn)觀眾,變量n表示幸運(yùn)觀眾的索引號(hào)。7.有如下Python程序段:import randoma=[-1]*5for i in range(len(a)): a[i]=random.randint(1,10) #產(chǎn)生一個(gè)[1,10]之間的整數(shù)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執(zhí)行該程序段后,變量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解析 本題考查隨機(jī)數(shù)應(yīng)用和順序查找。在循環(huán)體中,i的值為2或3,語句key=a[i]的功能是把a(bǔ)[i]的值保存到key中,同時(shí)可以騰出位置i,在他前面的數(shù)a[j],如果滿足key8.將有序數(shù)組 nums 中的重復(fù)項(xiàng)刪除,編寫的 Python 程序段如下:nums=1n=len(nums);i=1 (1) while i if nums[i] !=nums[i-1]: (2) k+=1 i+=1nums=nums[:k]上述程序段中方框處可選代碼為:①k=0 ② k=1 ③nums[k]=nums[i] ④nums[i-1]=nums[i] 則(1)、(2)處代碼依次為 ( )A.①③ B.①④ C.②③ D.②④答案 C解析 本題考查刪除重復(fù)項(xiàng)的代碼段理解。本題的思路是:從第二個(gè)字符開始遍歷有序字符串 s 的各個(gè)字符,若前后相鄰兩個(gè)字符不相等,把當(dāng)前字符重新賦值到字符串 s 中,此時(shí)的索引用 k 來表示,若前后兩個(gè)字符相等, 則跳過當(dāng)前字符,不組合。以["a","a","b","b","b","c"]為例,最終會(huì)得到["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()方法用于在列表末尾添加新的對(duì)象 i += 1print(max_list)執(zhí)行該程序段后,列表 max_list 的值為 ( )A.[1] B.[8] C.[5, 8] D.[5, 1, 8]答案 C10.有如下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+=1print(maxs)執(zhí)行該程序,當(dāng)輸入“p8579yt559h6”時(shí),輸出的結(jié)果為 ( )A.579 B.579y C.559h D.t559h答案 C二、能力提升11.學(xué)校舉辦“十佳歌手”比賽,經(jīng)初賽選拔,共有15位同學(xué)進(jìn)入決賽。現(xiàn)需制定一個(gè)決賽出場順序,即為每位進(jìn)入決賽的同學(xué)隨機(jī)分配一個(gè)出場序號(hào)。編寫的Python程序段如下:import random # 導(dǎo)入隨機(jī)模塊name=["張**","李**","王*","許*","林**","王**","陳*","洪**","鮑**","羅*","張*","吳**","方*","鄭*","章*"]seq={};a=[];i=0while i<=14: m=random.randint(1,15) #產(chǎn)生[1,15]范圍內(nèi)的隨機(jī)整數(shù) if m not in a: # ① a+=[m] seq[name[i]]=m i+=1 # ②print(seq) # ③運(yùn)行上述程序段后,下列說法正確的是 ( )A.列表a中的元素不會(huì)重復(fù)B.①處語句最多執(zhí)行15次C.②處語句縮進(jìn)應(yīng)與①處語句對(duì)齊,避免程序死循環(huán)D.③處語句縮進(jìn)應(yīng)與①處語句對(duì)齊,否則只輸出一個(gè)序號(hào)答案 A解析 本題考查循環(huán)語句、字典和隨機(jī)函數(shù)。當(dāng)數(shù)m不在列表a中時(shí),才會(huì)將數(shù)m放入列表中,因此列表a中的元素不會(huì)重復(fù)。變量m是隨機(jī)產(chǎn)生的整數(shù),則并不能保住m每次都不同,若是產(chǎn)生了重復(fù)的數(shù),則程序會(huì)再次進(jìn)入循環(huán),重新產(chǎn)生隨機(jī)數(shù),因此①處語句是最少執(zhí)行15次。若②處語句縮進(jìn)應(yīng)與①處語句對(duì)齊,則不論變量m是否為重復(fù)的數(shù),i的值都會(huì)加1,while循環(huán)一共循環(huán)15次,會(huì)造成部分同學(xué)沒有序號(hào)的情況。若③處語句縮進(jìn)應(yīng)與①處語句對(duì)齊,則每進(jìn)入一次循環(huán),都會(huì)輸出字典seq的值。而在原程序中,若產(chǎn)生了一個(gè)不重復(fù)的新序號(hào),則會(huì)將該序號(hào)與一位同學(xué)對(duì)應(yīng)起來形成字典中的鍵值對(duì)。因此最終輸出的字典中存放了所有同學(xué)與之對(duì)應(yīng)的序號(hào)。12.有如下程序段:import random #導(dǎo)入隨機(jī)數(shù)模塊n=random.randint(0,100) #產(chǎn)生0-100之間的隨機(jī)整數(shù),包含0和100m=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)+"*" breakprint(m,"=",s[0:len(s)-1])上述程序執(zhí)行后,輸出結(jié)果不可能的是 ( )A.67=67 B.34=2*17C.54=2*3*3*3 D.20=2*3*4答案 D13.有一組正整數(shù),要求對(duì)其中的奇偶數(shù)進(jìn)行交換。交換后偶數(shù)在前,奇數(shù)在后,并保持相對(duì)順序不變。a=[5,10,21,7,24,14,9,11,36,37]n=len(a);b=[0]*nnum=0;k=0while k <10: if ① : b[num]=a[k] num+=1 else: ② k+=1for j in range(n-num,n): ③ print(a)將加框處的代碼補(bǔ)充完整,正確的是 ( )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]答案 A14.奇偶校驗(yàn)是一種校驗(yàn)數(shù)據(jù)傳輸正確性的方法。其中奇校驗(yàn)方法:統(tǒng)計(jì)二進(jìn)制數(shù)據(jù)的數(shù)位中“1”的個(gè)數(shù),若個(gè)數(shù)為奇數(shù),則校驗(yàn)位值為0,否則校驗(yàn)位值為1。小李編寫了一個(gè)計(jì)算奇校驗(yàn)位的程序,功能如下:鍵盤輸入1~255十進(jìn)制待校驗(yàn)數(shù),輸出該數(shù)對(duì)應(yīng)的二進(jìn)制值及該數(shù)的校驗(yàn)位值。程序運(yùn)行界面如圖所示。請輸入待校驗(yàn)數(shù):2020轉(zhuǎn)換為二進(jìn)制數(shù)為:11111100100 校驗(yàn)位值為:0>>>實(shí)現(xiàn)上述功能的程序如下,請?jiān)诔绦騽澗€處填入合適的代碼。n=int(input("請輸入待校驗(yàn)數(shù):"))t=0s=""while n>0: a=n%2 ① t=t+a s=str(a)+s② print("轉(zhuǎn)換為二進(jìn)制數(shù)為:",s,"校驗(yàn)位值為:",1-v)答案 ①n=n∥2 ②v=t%2解析 本題的算法思想是將整數(shù)n轉(zhuǎn)化為二進(jìn)制數(shù),然后統(tǒng)計(jì)1的個(gè)數(shù),再對(duì)統(tǒng)計(jì)個(gè)數(shù)進(jìn)行校驗(yàn)。十進(jìn)制化二進(jìn)制的方法為除2取余,每得到一個(gè)余數(shù),則將余數(shù)累加在變量t中,商為n∥2,因此①處為n=n∥2;根據(jù)print語句可知,結(jié)果為1-v,即v為1時(shí)校驗(yàn)位值為0,v為0時(shí)校驗(yàn)位值為1,因此可推斷出②處語句為v=t%2。15.某次測試的答題結(jié)果存儲(chǔ)在asht.txt文件中,該文件每行記錄1個(gè)考生10道單選題的答案,每題有A、B、C、D四個(gè)選項(xiàng),空白的答案標(biāo)記為'K'。評(píng)分標(biāo)準(zhǔn):正確得3分,錯(cuò)誤得-1分,空白得0分。實(shí)現(xiàn)評(píng)分的Python程序如下。ANS='ACBBCDADBC' #ANS 為標(biāo)準(zhǔn)答案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+=1print(score)(1)若標(biāo)準(zhǔn)答案為:'ACBBCDADBC',則答案ACBBDDADKC'的得分為 。 (2)完善上述①②處代碼。答案 (1)23 (2)①line[j]==ANS[j]②score[i]-=1解析 本題考查順序查找算法。line表示asht.txt文件中每一條記錄,每條記錄有10道單選題答案。語句score.append(0)表示每讀取一條記錄,該列表增加一個(gè)值為0的元素,i表示score列表中最后一個(gè)元素的索引值。j初值為0,終值為len(ANS)-1,表示在標(biāo)準(zhǔn)答案中比對(duì)當(dāng)前記錄中答案,如果line[j]==ANS[j]表示當(dāng)前答案與標(biāo)準(zhǔn)答案一致,得3分,不正確將扣1分。16.分解質(zhì)因數(shù)是指一個(gè)整數(shù)可以寫成幾個(gè)質(zhì)數(shù)相乘的形式。現(xiàn)有如下Python程序段實(shí)現(xiàn)對(duì)一個(gè)整數(shù)(可以為負(fù)整數(shù))分解質(zhì)因數(shù),如輸入正整數(shù) 30,輸出結(jié)果為:30=2*3*5,輸入負(fù)整數(shù)-4,輸出結(jié)果為:-4=-1*2*2。t=int(input("輸入一個(gè)整數(shù):"))ans = str(t)+"="if t<0: t=-t ans += "-1*"i=2while t>1: while t%i==0: ans += str(i)+"*" ① i+=1print(② ) (1)當(dāng)輸入整數(shù)-56時(shí),輸出的結(jié)果為 。 (2)請?jiān)趧澗€處填入合適的代碼。答案 (1)-56=-1*2*2*2*7 (2)① t∥=i② ans[:-1] 或 ans[0:len(ans)-1]17.尼克斯徹定理:任何一個(gè)大于等于 1 的整數(shù)的立方等于一串連續(xù)奇數(shù)之和。如:33=7+9+11,編寫一個(gè)Python 程序驗(yàn)證尼克斯徹定理,程序運(yùn)行時(shí),輸入一個(gè)大于等于1的整數(shù),輸出驗(yàn)證結(jié)果如下圖所示:請輸入一個(gè)大于1的整數(shù):33**3=7+9+11(1)若輸入數(shù)字2,輸出的結(jié)果為 (2)完善劃線處的代碼。n=int(input("請輸入一個(gè)大于等于 1 的整數(shù):"))for i in range(1,n**3+1,2): sum1=0 t=i while sum1 ① t+=2 if sum1==n**3: breaks=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+218.如果集合a的任意一個(gè)元素都是集合b的元素,那么集合a稱為集合b的子集。例如集合a的元素依次為[1,3,5],集合b的元素依次為[1,2,3,4,5],集合a的任意一個(gè)元素都是集合b中的元素,所以集合a稱為集合b的子集。編寫Python程序,用于判斷集合a是否是集合b的子集,功能如下:程序運(yùn)行時(shí)隨機(jī)產(chǎn)生na個(gè)不重復(fù)的整數(shù)存儲(chǔ)在集合a中,隨機(jī)產(chǎn)生nb個(gè)不重復(fù)的整數(shù)存儲(chǔ)在集合b中。顯示判斷的結(jié)果,程序運(yùn)行界面如圖所示。[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 randomna=3;nb=10#隨機(jī)產(chǎn)生 na 個(gè)不重復(fù)的整數(shù)存儲(chǔ)在列表 a 中,隨機(jī)產(chǎn)生 nb 個(gè)不重復(fù)的整數(shù)存儲(chǔ)在列表 b 中,代碼略print(a);print(b)① i=0while ② : j=0 while j if ③ : break j+=1 if j==nb: flag=False i+=1if flag: print("a 是 b 的子集")else: print("a 不是b 的子集")答案 (1)A (2)①flag=True ②i19.下列程序統(tǒng)計(jì)字符串(由數(shù)字或字母組成)中同一字符連續(xù)出現(xiàn)最多的次數(shù),如果有多個(gè)字符連續(xù)出現(xiàn)次數(shù)并列最多,輸出第一個(gè)字符,例如程序運(yùn)行時(shí),輸入字符串:“aabb33ddddf88888q",輸出結(jié)果為:8出現(xiàn)的次數(shù)最多,最多共連續(xù)出現(xiàn)了5次Python程序如下:s=input("請輸入字符串:")c=0;m=0;dic={}maxlen=0;d=0while 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=0print(③ +"出現(xiàn)的次數(shù)最多") print("最多共連續(xù)出現(xiàn)了"+str(maxlen),"次")print("位于字符串的第",d+1,"位到第",d+maxlen+1 ,"位")(1)請?jiān)趧澗€處填入合適的代碼。(2)加框處的代碼還可以用 代替。 答案 (1)①break ②maxlen=m ③s[d] (2)dic[s[d]](共85張PPT)課時(shí)6 While循環(huán)語句及程序?qū)崿F(xiàn)第三章 算法的程序?qū)崿F(xiàn)1.掌握while循環(huán)語句的語法格式,理解while循環(huán)的功能。2.熟練使用while循環(huán)語句解決實(shí)際問題。目 錄CONTENTS知識(shí)梳理01例題精析02隨堂檢測03鞏固與提升04知識(shí)梳理11.while循環(huán)的功能While循環(huán)在執(zhí)行時(shí),首先會(huì)判斷條件是否為真,如果條件為真,執(zhí)行一次循環(huán)體,再次判斷條件是否為真,如果仍為真,那么再執(zhí)行一次循環(huán)體,以此類推,直到條件為假時(shí)退出while語句。2.while循環(huán)語句格式while<條件>:<循環(huán)體>3.while循環(huán)適用場合(1)循環(huán)次數(shù)未知,但循環(huán)結(jié)束的條件已知。(2)循環(huán)條件有兩個(gè)或兩個(gè)以上。①在while循環(huán)前應(yīng)對(duì)變量賦初值。②循環(huán)變量的變化要在循環(huán)體內(nèi)通過賦值語句來實(shí)現(xiàn)。例題精析2例1 輸入一個(gè)正整數(shù),輸出所有的質(zhì)因子。如24=2*2*2*3。實(shí)現(xiàn)上述功能的Python代碼如下:n=int(input("輸入一個(gè)正整數(shù):"))i=2while ① : if n %i==0: n=n/i print(i) else: ② (1)在程序劃線處填入合適的代碼。(2)按照上述算法,輸入60,依次輸出的質(zhì)因子是 。 答案 (1)①n>1或n!=1 ②i+=1 (2)2 2 3 5解析 最小的質(zhì)因數(shù)是2,如果能被2整除,則反復(fù)相除,當(dāng)不能被2整除時(shí),將i增加1,嘗試被3整除,如果還不能除通,往上增加到4,由于前面反復(fù)除2操作,因此不可能被不是質(zhì)數(shù)的數(shù)除通。當(dāng)相除的結(jié)果為1時(shí),終止循環(huán)。輸入60,可以被2除2次,被3除1次,被5除1次。變式訓(xùn)練1 工作人員手中有人民幣100、50、20、10和1元5個(gè)幣種,輸入一個(gè)金額,按最大票面優(yōu)先兌換的原則,輸出相應(yīng)的人民幣及張數(shù)。實(shí)現(xiàn)上述功能的Python代碼如下:je=int(input("請輸入金額!"))rmb=[100,50,20,10,1]i,t=0,0while 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個(gè)幣種的總的數(shù)量是 。 答案 (1)①je>=rmb[i] ②je=je-rmb[i]*t (2)10解析 當(dāng)所剩金額大于或等于當(dāng)前幣種時(shí),計(jì)算可以兌換的張數(shù)t,接著減去當(dāng)前幣種的金額,如果金額小于當(dāng)前金額時(shí),找到下一種較小的金額進(jìn)行嘗試,直到全部兌換完畢。輸入356元,可以換3張100元,1張50元和6張1元。例2 十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù):十進(jìn)制可以用按權(quán)展開相加的表達(dá)式來表示,如13D=1×23+1×22+0×21+1×20。若十進(jìn)制數(shù)大于k位上的權(quán)值,則k位上數(shù)為1,否則為0。設(shè)計(jì)的Python程序如下所示:n=int(input("輸入一個(gè)十進(jìn)制數(shù)"))ss=""k=0while 2**k k+=1 t=2**(k-1) if n>=t: ss=ss+"1" ① else: ss=ss+"0" ② print(ss)(1)加框處代碼有誤,請修正這個(gè)錯(cuò)誤。(2)請?jiān)诔绦騽澗€處填入合適的代碼。答案 (1)n>0 or k>0 (2)①n=n-t ②k-=1解析 變量k表示轉(zhuǎn)換成二進(jìn)制的長度,每次需減去k位上的權(quán)值t,若n大于等于t,表示該位上數(shù)為1,完成該位轉(zhuǎn)換,同時(shí)需減去該位上的可能權(quán)值。若n已經(jīng)為零,但k并沒有達(dá)到最低位0,例如12D,減去8減去4后,得到0,但只輸出2個(gè)1,此時(shí)k=2,還需輸出2個(gè)0。變式訓(xùn)練2 下列程序的功能是:計(jì)算表達(dá)式1×3+2×3+3×3+…100×3的值,并輸出計(jì)算結(jié)果。s=0i=1while i<=100: i+=1print(s)(1)剛退出循環(huán)時(shí),變量i的值是 。 (2)為了實(shí)現(xiàn)上述表達(dá)式的計(jì)算,程序中劃線處的語句為 。 答案 (1)101 (2)s=s+i*3或s+=i*3解析 本題主要考查的是while循環(huán)的程序?qū)崿F(xiàn)。(1)循環(huán)變量i的初值為1,步長為1,循環(huán)條件為i<=100,即當(dāng)i=101時(shí),循環(huán)結(jié)束。(2)根據(jù)表達(dá)式可知,劃線處語句的功能是將i*3的值進(jìn)行累加,從print(s)語句可知,累加和存放在變量s中,因此劃線處的語句為s=s+i*3,也可以寫為s+=i*3。例3 判斷一個(gè)字符串是否為回文串。如果一個(gè)字符串,從左到右讀和從右到左讀是完全一樣的,那么這個(gè)字符串稱為回文串。下面程序的功能是:輸入一個(gè)字符串,檢測是否為回文串。s=input("輸入一個(gè)字符串")i=0j=len(s)-1flag=Truewhile① : if s[i]==s[j]: i+=1 j-=1 else: ② print(flag)(1)請?jiān)诔绦騽澗€處填入合適的代碼。(2)上述程序的功能與語句print(s==s[::-1])功能 (填:是/否)一致。 答案 (1)①i解析 本題考查的是多條件循環(huán)。變量i和j分別表示首尾兩個(gè)位置,對(duì)首尾的字符依次比較,如果相等,分別后移和前移,如果不相等,表示不是回文,循環(huán)結(jié)束。s[::-1]表示將字符串s首尾互換,若兩者相等,表示是回文字符。 flag=-flag n=n+2 ② print("π=%f"%(4*s),"t=",t,"n=",n)運(yùn)行結(jié)果:π=3.141593 t=9.9999999e-09 n=100000001答案 ①abs(t)>=1e-8 ②t=flag*1.0/n或t=flag*1/n解析 本題主要考查的是while循環(huán)的靈活應(yīng)用。條件是最后一項(xiàng)的絕對(duì)值小于10-8,需要使用絕對(duì)值函數(shù)abs,10-8用科學(xué)計(jì)數(shù)法來表示為1e-8,因此①處代碼為abs(t)>=1e-8;用flag變量來表示正負(fù)符號(hào),每一項(xiàng)的值為實(shí)數(shù),用1.0/n來表示,因此②處代碼為t=flag*1.0/n。例4 有如下Python程序段:s=input("輸入字符串:")n=len(s)i,j=0,n-1result=""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-=1print(result)執(zhí)行該程序段,分別輸入下列選項(xiàng)中的字符串,輸出結(jié)果不為“555”的是( )A."51234" B."12535" C."54321“ D."55123"解析 本題考查字符串的操作。該程序段的作用是將字符串 s 中左半部分與右半部分按照從大到小的順序交替排列,生成一個(gè)新的字符串 result。輸入 s 字符串為 12535 時(shí),輸出結(jié)果為 55。B隨堂檢測31.有如下Python程序段:n=int(input("請輸入一個(gè)正整數(shù):"))s=0;i=1while i if n%i==0: s=s+i i=i+1print(s)運(yùn)行程序,輸入18輸出s的值是( )A.5 B.21 C.39 D.6B解析 本題考查循環(huán)結(jié)構(gòu)。把n的因子進(jìn)行相加。2.有如下Python程序段:m=int(input("輸入一個(gè)數(shù)字串"))s=""flag=Truewhile m>0: r=m%10 m=m∥10 if flag and r%2!=0: s=str(r)+s flag=not flagprint(flag,s)若輸入的值為“5201314”,執(zhí)行該程序段后,輸出的結(jié)果是 ( )A.False 1 B.True 1 C.False 2 D.True 4解析 本題考查循環(huán)控制結(jié)構(gòu)和邏輯變量運(yùn)用。語句r=m%10取出m的個(gè)位數(shù),語句m=m∥10去除m的個(gè)位數(shù),因此該循環(huán)是從后向前取出數(shù)字串的各個(gè)數(shù)字,當(dāng)條件flag and r%2!=0成立時(shí),把r變成字符并聯(lián)接入s中,語句flag=not flag的作用是把flag的值變?yōu)镕alse,該程序的功能是找到第一個(gè)奇數(shù)。A3.有如下Python程序段:s="CixiStudent"f=[0]*26;t=s[4:];i=0while 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+=1for i in range(26): if f[i]==1: print(chr(i+ord('a')),end='')A運(yùn)行以上程序段后,輸出的內(nèi)容為 ( )A.dentu B.Student C.tuden D.deintux解析 本題考查循環(huán)控制結(jié)構(gòu)。continue語句用來告訴python跳過當(dāng)前循環(huán),進(jìn)行下一個(gè)循環(huán)。列表t中的值為'Student',f列表中有26個(gè)元素,可以看成一個(gè)桶,當(dāng)某個(gè)字母出現(xiàn),ord(t[i])-ord('a')對(duì)應(yīng)的索引號(hào)的元素值為1,表示該字母出現(xiàn)過。將出現(xiàn)過的字母從小到大輸出。B.for i in range(5): if a [i]>0: break a[0],a[i]=a[i],a[0]DA.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]解析 本題考查循環(huán)結(jié)構(gòu)。D選項(xiàng)中變量i已經(jīng)是列表a中的元素,則最后進(jìn)行交換的并不是a[i],正確的交換語句為:a[0],i=i,a[0]。5.有如下Python程序段:s="akpboyogirlyygirlkp"s1=s+"###";boy=0;girl=0;i=0while 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+=1B執(zhí)行該程序段后,變量boy及girl的值分別為 ( )A.1 2 B.4 2 C.4 3 D.6 9解析 本題考查列表的枚舉。連續(xù)取出4個(gè)字符,若第1、2、3個(gè)字符中分別是b、o、y中一個(gè),則boy增加1。如i等于5時(shí),取出"yog",第2個(gè)字符是"o";取出"rly"、"lyy",第3個(gè)字符是"y"。6.有如下Python程序段:a=[3,4,2,5,6,7,7,1,2]m,c,i=1,1,1while i if a[i]>=a[i-1]: c+=1 m=max (m,c) else: c=1 i+=1print (c,m)則程序執(zhí)行后,c和m的值分別是( )A.1 5 B.1 4 C.2 5 D.2 4C7.有如下Python程序段:count=0;i=1while i<100: if int(i**0.5)==i**0.5: count+=1 i+=1print(count)運(yùn)行程序后,輸出的結(jié)果是( )A.9 B.0 C.99 D.5A8.對(duì)由小寫字母組成的長度相同的兩個(gè)字符串s1和s2進(jìn)行各字母數(shù)量檢測,如"abdac"與"aabcd"所含字母數(shù)量一致,與"aabcc"所含字母數(shù)量不一致。實(shí)現(xiàn)該功能的Python部分程序段如下:s1="";s2=""b=[0]*26for i in range (len(s1)) : x=ord(s1[i])-97;b[x]+=1 y=ord(s2[i])-97; (1) j=0while j<26: if (2) : break j+=1if j==26: print("所含字母數(shù)量一致")else: print("所含字母數(shù)量不一致")上述程序段中劃線處可選語句為:①b[y]+=1 ②b[y]-=1 ③b[j]!=0④b[j]==0則(1)(2)處語句依次應(yīng)為( )A.①③ B.②④ C.②③ D.①④C9.有如下Python程序:a = [0] * 10 ; c = 0n = int(input("輸入n的值:"))while n > 0: a[n % 10] += 1 if a[n % 10] == 2: c += 1 n ∥= 10print(c)運(yùn)行該程序后,輸出結(jié)果為2,則輸入n的值可能為 ( )A.135553 B.234125 C.202222 D.112233A4鞏固與提升基礎(chǔ)鞏固能力提升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+=1print(s3)執(zhí)行該程序段后,輸出的內(nèi)容為( )A.oymp B.olymp C.olympic D.oympicB2.有如下Python程序段:code="0123456789ABCDEF"numstr=input("請輸入一個(gè)二進(jìn)制整數(shù):")numlen=len(numstr)s=0;ss=""for i in range(numlen): x=int(numstr[i])*2**(numlen-i-1) s+=xt=swhile t>0: ss=code[t%16]+ss t=t∥16print(ss)運(yùn)行該程序段,輸入1100111,程序結(jié)果為( )A.110 B.103C.67 D.1100111C3.有如Python下程序段:s1=[12,15,28]s2=[15,28,32]i=0while i<=len(s1)-1: if s1[i] not in s2: print(s1[i]) i=i+1以下說法正確的是 ( )A.該程序輸出結(jié)果為32B.該程序的算法是解析算法C.該程序輸出的結(jié)果為[12]D.該程序?qū)崿F(xiàn)的功能是得到s1中有但s2中沒有的元素D4.有下面一段程序:a=[9,5,2,3,0,-9,5,0,7,-10]s,i=0,0while a[i]!=0 and i < len(a): s+=1 i+=1運(yùn)行該程序后s的值為( )A.4 B.5 C.8 D.10A解析 本題考查循環(huán)結(jié)構(gòu)while語句,當(dāng)i位置上的元素值不為0且滿足i比列表a長度來的小的時(shí)候可以進(jìn)入循環(huán),此時(shí)s,i的值分別+1,不滿足任一條件時(shí)循環(huán)結(jié)束,可以看到列表中有元素0,此時(shí)i的值為4,因此結(jié)束時(shí)s的值也是4。5.小明用Python編寫了一個(gè)找最大值的程序,程序功能是:用戶輸入數(shù)字串,數(shù)據(jù)間用逗號(hào)分隔,最后以逗號(hào)結(jié)尾,程序執(zhí)行后輸出最大的數(shù)值。程序段如下,劃線處代碼正確的是 ( )s=input("請輸入數(shù)字串:")i=j=max=0c=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+1B.①i=j+1 ②j=j+1C.①j=j+1 ②i=i+1D.①j=i+1 ②i=i+1解析 本題考查循環(huán)結(jié)構(gòu)嵌套分支結(jié)構(gòu)找最值模型,i表示數(shù)字的左索引,j表示數(shù)字后逗號(hào)的索引值,t為逗號(hào)前完整的數(shù)字,當(dāng)找到比當(dāng)前最大值還要大的值時(shí),更新最大值并且更新左邊界和右邊界的值繼續(xù)往下找,因此答案為B。6.在一次抽獎(jiǎng)活動(dòng)中,需要在8人中隨機(jī)抽取3個(gè)幸運(yùn)獎(jiǎng),對(duì)應(yīng)的Python程序如下:import randomxm=["A","B","C","D","E","F","G","H"] #用字母代表人名hj=[""]*3bz=[False]*8i=0while i<=2: n=random.randint(0,7) #產(chǎn)生一個(gè)0-7之間的整數(shù)n print(hj)程序劃線處代碼合適的是 ( )AA.if bz[n]==False: hj[i]=xm[n] bz[n]=True i+=1B.if bz[n]==True: hj[i]=xm[n] bz[n]=False i+=1C.if bz[i]==False: hj[n]=xm[i] bz[i]=True i+=1D.if bz[i]==True: hj[n]=xm[i] bz[i]=True i+=1解析 本題考查隨機(jī)函數(shù)的應(yīng)用。列表bz中有8個(gè)元素,其初值均為False,表示該索引號(hào)對(duì)應(yīng)的xm元素沒有抽到獎(jiǎng)。變量i表示第幾個(gè)幸運(yùn)觀眾,變量n表示幸運(yùn)觀眾的索引號(hào)。7.有如下Python程序段:import randoma=[-1]*5for i in range(len(a)): a[i]=random.randint(1,10) #產(chǎn)生一個(gè)[1,10]之間的整數(shù)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執(zhí)行該程序段后,變量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]解析 本題考查隨機(jī)數(shù)應(yīng)用和順序查找。在循環(huán)體中,i的值為2或3,語句key=a[i]的功能是把a(bǔ)[i]的值保存到key中,同時(shí)可以騰出位置i,在他前面的數(shù)a[j],如果滿足keyB上述程序段中方框處可選代碼為:①k=0 ② k=1 ③nums[k]=nums[i] ④nums[i-1]=nums[i] 則(1)、(2)處代碼依次為 ( )A.①③ B.①④ C.②③ D.②④解析 本題考查刪除重復(fù)項(xiàng)的代碼段理解。本題的思路是:從第二個(gè)字符開始遍歷有序字符串 s 的各個(gè)字符,若前后相鄰兩個(gè)字符不相等,把當(dāng)前字符重新賦值到字符串 s 中,此時(shí)的索引用 k 來表示,若前后兩個(gè)字符相等, 則跳過當(dāng)前字符,不組合。以["a","a","b","b","b","c"]為例,最終會(huì)得到["a","b","c"]。C9.有如下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()方法用于在列表末尾添加新的對(duì)象 i += 1print(max_list)執(zhí)行該程序段后,列表 max_list 的值為( )A.[1] B.[8] C.[5, 8] D.[5, 1, 8]C10.有如下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+=1print(maxs)執(zhí)行該程序,當(dāng)輸入“p8579yt559h6”時(shí),輸出的結(jié)果為( )A.579 B.579y C.559h D.t559hC11.學(xué)校舉辦“十佳歌手”比賽,經(jīng)初賽選拔,共有15位同學(xué)進(jìn)入決賽。現(xiàn)需制定一個(gè)決賽出場順序,即為每位進(jìn)入決賽的同學(xué)隨機(jī)分配一個(gè)出場序號(hào)。編寫的Python程序段如下:import random # 導(dǎo)入隨機(jī)模塊name=["張**","李**","王*","許*","林**","王**","陳*","洪**","鮑**","羅*","張*","吳**","方*","鄭*","章*"]seq={};a=[];i=0while i<=14: m=random.randint(1,15) #產(chǎn)生[1,15]范圍內(nèi)的隨機(jī)整數(shù) if m not in a: # ① a+=[m] seq[name[i]]=m i+=1 # ②print(seq) # ③運(yùn)行上述程序段后,下列說法正確的是( )A.列表a中的元素不會(huì)重復(fù)B.①處語句最多執(zhí)行15次C.②處語句縮進(jìn)應(yīng)與①處語句對(duì)齊,避免程序死循環(huán)D.③處語句縮進(jìn)應(yīng)與①處語句對(duì)齊,否則只輸出一個(gè)序號(hào)A解析 本題考查循環(huán)語句、字典和隨機(jī)函數(shù)。當(dāng)數(shù)m不在列表a中時(shí),才會(huì)將數(shù)m放入列表中,因此列表a中的元素不會(huì)重復(fù)。變量m是隨機(jī)產(chǎn)生的整數(shù),則并不能保住m每次都不同,若是產(chǎn)生了重復(fù)的數(shù),則程序會(huì)再次進(jìn)入循環(huán),重新產(chǎn)生隨機(jī)數(shù),因此①處語句是最少執(zhí)行15次。若②處語句縮進(jìn)應(yīng)與①處語句對(duì)齊,則不論變量m是否為重復(fù)的數(shù),i的值都會(huì)加1,while循環(huán)一共循環(huán)15次,會(huì)造成部分同學(xué)沒有序號(hào)的情況。若③處語句縮進(jìn)應(yīng)與①處語句對(duì)齊,則每進(jìn)入一次循環(huán),都會(huì)輸出字典seq的值。而在原程序中,若產(chǎn)生了一個(gè)不重復(fù)的新序號(hào),則會(huì)將該序號(hào)與一位同學(xué)對(duì)應(yīng)起來形成字典中的鍵值對(duì)。因此最終輸出的字典中存放了所有同學(xué)與之對(duì)應(yīng)的序號(hào)。12.有如下程序段:import random #導(dǎo)入隨機(jī)數(shù)模塊n=random.randint(0,100) #產(chǎn)生0-100之間的隨機(jī)整數(shù),包含0和100m=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)+"*" breakprint(m,"=",s[0:len(s)-1])DA14.奇偶校驗(yàn)是一種校驗(yàn)數(shù)據(jù)傳輸正確性的方法。其中奇校驗(yàn)方法:統(tǒng)計(jì)二進(jìn)制數(shù)據(jù)的數(shù)位中“1”的個(gè)數(shù),若個(gè)數(shù)為奇數(shù),則校驗(yàn)位值為0,否則校驗(yàn)位值為1。小李編寫了一個(gè)計(jì)算奇校驗(yàn)位的程序,功能如下:鍵盤輸入1~255十進(jìn)制待校驗(yàn)數(shù),輸出該數(shù)對(duì)應(yīng)的二進(jìn)制值及該數(shù)的校驗(yàn)位值。程序運(yùn)行界面如圖所示。實(shí)現(xiàn)上述功能的程序如下,請?jiān)诔绦騽澗€處填入合適的代碼。n=int(input("請輸入待校驗(yàn)數(shù):"))t=0s=""請輸入待校驗(yàn)數(shù):2020轉(zhuǎn)換為二進(jìn)制數(shù)為:11111100100 校驗(yàn)位值為:0>>> while n>0: a=n%2 ① t=t+a s=str(a)+s② print("轉(zhuǎn)換為二進(jìn)制數(shù)為:",s,"校驗(yàn)位值為:",1-v)答案 ①n=n∥2 ②v=t%2解析 本題的算法思想是將整數(shù)n轉(zhuǎn)化為二進(jìn)制數(shù),然后統(tǒng)計(jì)1的個(gè)數(shù),再對(duì)統(tǒng)計(jì)個(gè)數(shù)進(jìn)行校驗(yàn)。十進(jìn)制化二進(jìn)制的方法為除2取余,每得到一個(gè)余數(shù),則將余數(shù)累加在變量t中,商為n∥2,因此①處為n=n∥2;根據(jù)print語句可知,結(jié)果為1-v,即v為1時(shí)校驗(yàn)位值為0,v為0時(shí)校驗(yàn)位值為1,因此可推斷出②處語句為v=t%2。15.某次測試的答題結(jié)果存儲(chǔ)在asht.txt文件中,該文件每行記錄1個(gè)考生10道單選題的答案,每題有A、B、C、D四個(gè)選項(xiàng),空白的答案標(biāo)記為'K'。評(píng)分標(biāo)準(zhǔn):正確得3分,錯(cuò)誤得-1分,空白得0分。實(shí)現(xiàn)評(píng)分的Python程序如下。ANS='ACBBCDADBC' #ANS 為標(biāo)準(zhǔn)答案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+=1print(score)(1)若標(biāo)準(zhǔn)答案為:'ACBBCDADBC',則答案'ACBBDDADKC'的得分為 。 (2)完善上述①②處代碼。答案 (1)23 (2)①line[j]==ANS[j] ②score[i]-=1解析 本題考查順序查找算法。line表示asht.txt文件中每一條記錄,每條記錄有10道單選題答案。語句score.append(0)表示每讀取一條記錄,該列表增加一個(gè)值為0的元素,i表示score列表中最后一個(gè)元素的索引值。j初值為0,終值為len(ANS)-1,表示在標(biāo)準(zhǔn)答案中比對(duì)當(dāng)前記錄中答案,如果line[j]==ANS[j]表示當(dāng)前答案與標(biāo)準(zhǔn)答案一致,得3分,不正確將扣1分。16.分解質(zhì)因數(shù)是指一個(gè)整數(shù)可以寫成幾個(gè)質(zhì)數(shù)相乘的形式。現(xiàn)有如下Python程序段實(shí)現(xiàn)對(duì)一個(gè)整數(shù)(可以為負(fù)整數(shù))分解質(zhì)因數(shù),如輸入正整數(shù) 30,輸出結(jié)果為:30=2*3*5,輸入負(fù)整數(shù)-4,輸出結(jié)果為:-4=-1*2*2。t=int(input("輸入一個(gè)整數(shù):"))ans = str(t)+"="if t<0: t=-t ans += "-1*"i=2while t>1: while t%i==0: ans += str(i)+"*" ① i+=1print(② ) (1)當(dāng)輸入整數(shù)-56時(shí),輸出的結(jié)果為 。 (2)請?jiān)趧澗€處填入合適的代碼。答案 (1)-56=-1*2*2*2*7 (2)① t∥=i② ans[:-1] 或 ans[0:len(ans)-1]17.尼克斯徹定理:任何一個(gè)大于等于 1 的整數(shù)的立方等于一串連續(xù)奇數(shù)之和。如:33=7+9+11,編寫一個(gè)Python 程序驗(yàn)證尼克斯徹定理,程序運(yùn)行時(shí),輸入一個(gè)大于等于1的整數(shù),輸出驗(yàn)證結(jié)果如下圖所示:(1)若輸入數(shù)字2,輸出的結(jié)果為 。 (2)完善劃線處的代碼。n=int(input("請輸入一個(gè)大于等于 1 的整數(shù):"))for i in range(1,n**3+1,2):請輸入一個(gè)大于1的整數(shù):33**3=7+9+11 sum1=0 t=i while sum1 ① t+=2 if sum1==n**3: breaks=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+218.如果集合a的任意一個(gè)元素都是集合b的元素,那么集合a稱為集合b的子集。例如集合a的元素依次為[1,3,5],集合b的元素依次為[1,2,3,4,5],集合a的任意一個(gè)元素都是集合b中的元素,所以集合a稱為集合b的子集。編寫Python程序,用于判斷集合a是否是集合b的子集,功能如下:程序運(yùn)行時(shí)隨機(jī)產(chǎn)生na個(gè)不重復(fù)的整數(shù)存儲(chǔ)在集合a中,隨機(jī)產(chǎn)生nb個(gè)不重復(fù)的整數(shù)存儲(chǔ)在集合b中。顯示判斷的結(jié)果,程序運(yùn)行界面如圖所示。[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 randomna=3;nb=10#隨機(jī)產(chǎn)生 na 個(gè)不重復(fù)的整數(shù)存儲(chǔ)在列表 a 中,隨機(jī)產(chǎn)生 nb 個(gè)不重復(fù)的整數(shù)存儲(chǔ)在列表 b 中,代碼略print(a);print(b)① i=0while ② : j=0 while j if ③ : break j+=1 if j==nb: flag=False i+=1if flag: print("a 是 b 的子集")else: print("a 不是b 的子集")答案 (1)A (2)①flag=True ②i19.下列程序統(tǒng)計(jì)字符串(由數(shù)字或字母組成)中同一字符連續(xù)出現(xiàn)最多的次數(shù),如果有多個(gè)字符連續(xù)出現(xiàn)次數(shù)并列最多,輸出第一個(gè)字符,例如程序運(yùn)行時(shí),輸入字符串:“aabb33ddddf88888q",輸出結(jié)果為:8出現(xiàn)的次數(shù)最多,最多共連續(xù)出現(xiàn)了5次Python程序如下:s=input("請輸入字符串:")c=0;m=0;dic={}maxlen=0;d=0while 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=0print(③ +"出現(xiàn)的次數(shù)最多") print("最多共連續(xù)出現(xiàn)了"+str( maxlen ),"次")print("位于字符串的第",d+1,"位到第",d+maxlen+1 ,"位")(1)請?jiān)趧澗€處填入合適的代碼。(2)加框處的代碼還可以用 代替。 答案 (1)①break ②maxlen=m ③s[d] (2)dic[s[d]]課時(shí)6 While循環(huán)語句及程序?qū)崿F(xiàn)課時(shí)目標(biāo)1.掌握while循環(huán)語句的語法格式,理解while循環(huán)的功能。2.熟練使用while循環(huán)語句解決實(shí)際問題。1.while循環(huán)的功能While循環(huán)在執(zhí)行時(shí),首先會(huì)判斷條件是否為真,如果條件為真,執(zhí)行一次循環(huán)體,再次判斷條件是否為真,如果仍為真,那么再執(zhí)行一次循環(huán)體,以此類推,直到條件為假時(shí)退出while語句。2.while循環(huán)語句格式while〈條件〉:〈循環(huán)體〉3.while循環(huán)適用場合(1)循環(huán)次數(shù)未知,但循環(huán)結(jié)束的條件已知。(2)循環(huán)條件有兩個(gè)或兩個(gè)以上。①在while循環(huán)前應(yīng)對(duì)變量賦初值。②循環(huán)變量的變化要在循環(huán)體內(nèi)通過賦值語句來實(shí)現(xiàn)。例1 輸入一個(gè)正整數(shù),輸出所有的質(zhì)因子。如24=2*2*2*3。實(shí)現(xiàn)上述功能的Python代碼如下:n=int(input(″輸入一個(gè)正整數(shù):″))i=2while ①____________: if n % i==0:n=n/iprint(i)else:②____________(1)在程序劃線處填入合適的代碼。(2)按照上述算法,輸入60,依次輸出的質(zhì)因子是____________。聽課筆記: 變式訓(xùn)練1 工作人員手中有人民幣100、50、20、10和1元5個(gè)幣種,輸入一個(gè)金額,按最大票面優(yōu)先兌換的原則,輸出相應(yīng)的人民幣及張數(shù)。實(shí)現(xiàn)上述功能的Python代碼如下:je=int(input(″請輸入金額!″))rmb=[100,50,20,10,1]i,t=0,0while je>0: if①____________: t=j(luò)e∥rmb[i] ②____________ print(″兌換″+str(rmb[i])+″元″+str(t)+″張″) else: i+=1(1)在程序劃線處填入合適的代碼。(2)按照上述算法,輸入356,依次輸出人民幣100、50、20、10和1元5個(gè)幣種的總的數(shù)量是____________。例2 十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù):十進(jìn)制可以用按權(quán)展開相加的表達(dá)式來表示,如13D=1×23+1×22+0×21+1×20。若十進(jìn)制數(shù)大于k位上的權(quán)值,則k位上數(shù)為1,否則為0。設(shè)計(jì)的Python程序如下所示:n=int(input(″輸入一個(gè)十進(jìn)制數(shù)″))ss=″″k=0while 2**k k+=1while: t=2**(k-1) if n>=t:ss=ss+″1″①____________ else:ss=ss+″0″②____________print(ss)(1)加框處代碼有誤,請修正這個(gè)錯(cuò)誤。(2)請?jiān)诔绦騽澗€處填入合適的代碼。聽課筆記: 變式訓(xùn)練2 下列程序的功能是:計(jì)算表達(dá)式1×3+2×3+3×3+…100×3的值,并輸出計(jì)算結(jié)果。s=0i=1while i<=100: ____________ i+=1print(s)(1)剛退出循環(huán)時(shí),變量i的值是____________。(2)為了實(shí)現(xiàn)上述表達(dá)式的計(jì)算,程序中劃線處的語句為____________。例3 判斷一個(gè)字符串是否為回文串。如果一個(gè)字符串,從左到右讀和從右到左讀是完全一樣的,那么這個(gè)字符串稱為回文串。下面程序的功能是:輸入一個(gè)字符串,檢測是否為回文串。s=input(″輸入一個(gè)字符串″)i=0j=len(s)-1flag=Truewhile①____________: if s[i]==s[j]: i+=1 j-=1 else: ②____________print(flag)(1)請?jiān)诔绦騽澗€處填入合適的代碼。(2)上述程序的功能與語句print(s==s[::-1])功能________(填:是/否)一致。聽課筆記: 變式訓(xùn)練3 用下列公式計(jì)算的π近似值,直到最后一項(xiàng)的絕對(duì)值小于10-8為止。提示:≈1-+-+-…實(shí)現(xiàn)上述功能的程序如下,請?jiān)诔绦騽澗€處填入合適的代碼。n=t=1s=0flag=1while①____________: s=s+t flag=-flag n=n+2 ②____________print(″π=%f″%(4*s),″t=″,t,″n=″,n)運(yùn)行結(jié)果:π=3.141593 t=9.9999999e-09 n=100000001例4 有如下Python程序段:s=input(″輸入字符串:″)n=len(s)i,j=0,n-1result=″″while i=n∥2: if s[i]>s[j]: result+=s[i]; j-=1 elif s[i] result+=s[j]; i+=1else: i+=1;j-=1print(result)執(zhí)行該程序段,分別輸入下列選項(xiàng)中的字符串,輸出結(jié)果不為“555”的是( )A.″51234″ B.″12535″C.″54321″ D.″55123″聽課筆記: 1.有如下Python程序段:n=int(input("請輸入一個(gè)正整數(shù):"))s=0;i=1while i if n%i==0: s=s+i i=i+1print(s)運(yùn)行程序,輸入18輸出s的值是 ( )A.5 B.21 C.39 D.62.有如下Python程序段:m=int(input("輸入一個(gè)數(shù)字串"))s=""flag=Truewhile m>0: r=m%10 m=m∥10 if flag and r%2!=0: s=str(r)+s flag=not flagprint(flag,s)若輸入的值為“5201314”,執(zhí)行該程序段后,輸出的結(jié)果是 ( )A.False 1 B.True 1 C.False 2 D.True 43.有如下Python程序段:s="CixiStudent"f=[0]*26;t=s[4:];i=0while 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+=1for i in range(26): if f[i]==1: print(chr(i+ord('a')),end='')運(yùn)行以上程序段后,輸出的內(nèi)容為 ( )A.dentu B.Student C.tuden D.deintux4.將一組數(shù)保存在列表a中,若a[0]=0,則在列表a中從左到右找到第一個(gè)大于零的元素,并與a[0]交換。用Python程序描述,下列選項(xiàng)中不可行的是 ( )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=0while 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執(zhí)行該程序段后,變量boy及girl的值分別為 ( )A.1 2 B.4 2 C.4 3 D.6 96.有如下Python程序段:a=[3,4,2,5,6,7,7,1,2]m,c,i=1,1,1while i if a[i]>=a[i-1]: c+=1 m=max (m,c) else: c=1 i+=1print (c,m)則程序執(zhí)行后,c和m的值分別是 ( )A.1 5 B.1 4 C.2 5 D.2 47.有如下Python程序段:count=0;i=1while i<100: if int(i**0.5)==i**0.5: count+=1 i+=1print(count)運(yùn)行程序后,輸出的結(jié)果是 ( )A.9 B.0 C.99 D.58.對(duì)由小寫字母組成的長度相同的兩個(gè)字符串s1和s2進(jìn)行各字母數(shù)量檢測,如"abdac"與"aabcd"所含字母數(shù)量一致,與"aabcc"所含字母數(shù)量不一致。實(shí)現(xiàn)該功能的Python部分程序段如下:s1="";s2=""b=[0]*26for i in range (len(s1)) : x=ord(s1[i])-97;b[x]+=1 y=ord(s2[i])-97; (1) j=0while j<26: if (2) : break j+=1if j==26: print("所含字母數(shù)量一致")else: print("所含字母數(shù)量不一致")上述程序段中劃線處可選語句為:①b[y]+=1 ②b[y]-=1 ③b[j]!=0④b[j]==0則(1)(2)處語句依次應(yīng)為 ( )A.①③ B.②④ C.②③ D.①④9.有如下Python程序:a = [0] * 10 ; c = 0n = int(input("輸入n的值:"))while n > 0: a[n % 10] += 1 if a[n % 10] == 2: c += 1 n ∥= 10print(c)運(yùn)行該程序后,輸出結(jié)果為2,則輸入n的值可能為 ( )A.135553 B.234125C.202222 D.112233 展開更多...... 收起↑ 資源列表 課時(shí)6 While循環(huán)語句及程序?qū)崿F(xiàn) 學(xué)案 浙教版(2019)必修1.doc 課時(shí)6 While循環(huán)語句及程序?qū)崿F(xiàn) 教案 浙教版(2019)必修1.doc 課時(shí)6 While循環(huán)語句及程序?qū)崿F(xiàn) 課件(共85張ppt)浙教版(2019)必修1.pptx 縮略圖、資源來源于二一教育資源庫