Python语言程序设计第五章循环结构程序设计课件.ppt
Python语言程序设计,第5章 循环结构程序设计,循环结构程序设计,5.1 while语句(当型循环)5.2 for语句结构5.3循环的嵌套5.4 循环控制语句5.5 循环结构程序举例,循环结构的基本类型,当型循环while, for,循环结构程序设计,循环结构程序设计的应用场合:当某个条件满足时,需要多次反复进行同样工作。,例如:,1、求实数x的10次方,2、求数列1,2,i, 的前n项和,3、判断一个整数是否是素数,5.1 while语句(当型循环),特点:先判断,再执行while 语句的语法格式:,注意: 循环体可能一次也不执行。 循环体可为任意类型语句。 退出while循环的情况: exp不成立 循环体内遇break, return, exit等。,while exp: 循环体,在while语句中使用else子句,Python可以在循环语句中使用else子句,即构成了while.else循环结构。,while exp: 循环体else: 语句,while.else循环结构,例如:count=int(input()while count5:print(count,”is less than 5”) count=count+1else:print(count,”is not less than 5”),程序运行结果88 is not less than 5,例:求,1)问题分析:,sum,n=0,1,开始,sum = 1+2+100 100个数,循环语句:循环变量初始化:循环控制条件:循环体:循环变量的修改:,n1,n=100,sum+=n,n=n+1,例:求,sum,n=0,1 while n=100: sum=sum+nn=n+1 printf(1+2+3+.+100=,sum),循环语句四要素:循环(控制)变量初始化循环控制条件循环体(关键是找规律)循环变量的修改,运行结果:1+2+3.+100=5050,while语句,对于while语句的用法,要注意以下几点:(1)如果while后面表达式的值一开始就为假,则循环体一次也不执行。(2)循环体中的语句可以任意类型的语句。(3)遇到下列情况,退出while循环: A 表达式不成立 B 循环体内遇到break、return语句。,例:从键盘输入若干个数,求所有正数之和。当输入负数时,程序结束。,开始,循环语句四要素:循环变量初始化:循环控制条件:循环体:循环变量的修改:,输入x的值x=0 sum=sum+x 输入x的值,例: 从键盘输入若干个数, 求所有正数之和。当输入0或负数时,程序结束,sum=0 x=input(“请输入正整数:)while x=0:sum=sum+xx=input(“请输入正整数:) printf(sum=, sum),例题:输入一个正整数x,如果x满足0 x99999,则输出x是几位数并输出x个位上的数字。,x=int(input(“Please input x :”); if x=0 and x0: i=i/10 n=n+1 a=x%10 print(“%d是%d位数,它的个位上数字是”%(x, n,a) else: print(“输入错误!”),5.1 while语句说明,while 语句之前必须预先设置判断的初始条件 防止“死循环”的发生 在循环体中必须有使循环趋向结束的操作,即 在循环体中要有能让逻辑表达式值改变的语句 正确使用缩进 当循环体中含多条语句时,需用缩进这些多条语句,而且缩进一定要符合逻辑关系 在循环体中,语句的先后位置必须符合逻辑 否则会影响运算结果。,5.2 for语句 结构,1. for语句一般形式:,for 目标变量 in 序列对象: 循环体语句,说明: for语句的首行定义了目标变量和遍历的序列对象,后面是需要重复执行的语句块。语句块中的语句要向右缩进,且缩进量要一致。,注意:(1)for语句是通过遍历任意序列的元素来建立循环的。(2)for 语句也支持一个可选的else块,一般格式如下:for 目标变量 in序列对象: 语句块else: 语句,2. range 对象在for循环中的应用,range函数返回的是可迭代对象,range()函数的一般格式为: range(start,end,step) rang ()函数共有三个参数,start和step是可选的,start表示开始,默认值为0,end表示结束,step表示每次跳跃的间距,默认值为1。函数的功能是从一个start参数的值开始,到end参数的值结束的数字序列。,传递一个参数的range()函数: for i in range(5):print(i),传递两个参数的range()函数: for i in range(2,4):print(i),传递三个参数的range()函数: for i in range(2,20,3):print(i),range(),例 用for循环求,sum=0for i in range(101):sum=sum+iprint(“1+2+3+.+100”,sum),m=int(input(“请输入要判断的正整数m”))flag=1for i in range(2,m):if m%i=0:flag=0i=m if flag=1: print(“%d 是素数”%m)else: print(“%d不是素数”%m),例 判断m是否为素数。,例:已知四位数3025具有特殊性质:它的前两位数字30与后两位数字25之和是55,而55的平方正好等于其本身3025。编程列举出具有该性质的四位数。,rint(“满足条件的四位数分别是:”) for i in range(1000,10000): a=i/100b=i%100if (a+b)* *2=i:print(i),rint(“满足条件的数分别是:”)count=0for i in range(1,100):if i%7=0 and i%11!=0 or i%11=0 and i%7!=0: print(i ,end=” ”) count=coun+1 if count%10=0:print(“ ”),例 求出1到100能被7或11整除但不能被7和11同时整除的所有整数并将它们输出。每行10个。,5.3 循环嵌套,循环的嵌套,又称多层循环,应用于多个变量同时变化的情况。,说明:1. 外层循环可包含两个以上内循环 2. 嵌套的循环的执行流程,5.3 循环嵌套,注意:while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。,外循环执行了6次 内循环执行10次 循环正常结束时, 内循环执行了 106=60次,for i in range (6): for j in range (10): ,5.3 循环嵌套,循环语句while和for可以相互嵌套。在使用循环嵌套时,应注意以下几个问题:(1)外层循环和内层循环控制变量不能同名,以免造成混乱。(2)循环嵌套的缩进在逻辑上一定要注意,以保证逻辑上的重要性。(3)循环嵌套不能交叉,即在一个循环体内必须完整地包含另一个循环,如图5.10所示的循环嵌套都是合法的嵌套形式。,循环嵌套在使用中的重点内容能够正确判断内层循环体的范围能够正确判断内层循环体的执行次数注意内层循环的初值设定能正确处理内层循环与外层循环变量的关系,5.3 循环嵌套,例:输出九九表,输出格式如下:,for i in range (1,10,1):for j in range(1,i+1,1): print(“%d*%d=%2d ”%(j,i,i*j),end=” ”)print(“”),例:找出所有的三位数,要求它的各位数字的立方和正好等于这个三位数。例如:153=13+53+33就是这样的数。,for i in range(1,10): for j in range(0,10): for k in range(0,10): if i*3+j*3+k*3=i*100+j*10+k: print(%d%d%d%(i,j,k),程序运行结果:153370371407,例:求100200之间的全部素数。,rint(100200之间的素数有:)for m in range(100,200): flag=1 for i in range(2,m): if m%i=0: flag=0 i=m if flag=1: print(m,end= ),5.4 循环控制语句,有时候我们需要在循环体中提前跳出循环,或者在某种条件满足时,不执行循环体中的某些语句而立即从头开始新的一轮循环,这时就要用到循环控制语句break、continue和pass语句。,一般格式break功能 break语句用在循环体内,迫使所在循环立即终止,即跳出所在循环体,继续执行循环结构后面的语句。,(1) break语句,分析:找出m与n中较小的一个,则最大公约数必在1与较小整数的范围内。使用for语句,循环变量i从较小整数变化到1。一旦循环控制变量i同时能被m与n整除,则i就是最大公约数,然后使用break语句强制退出循环。,求两个整数m与n的最大公约数。,m,n=eval(input(请输入两个整数:)if mn: min=melse: min=nfor i in range(min,1,-1): if m%i=0 and n%i=0: print(最大公约数是:,i) break,一般格式continue功能 在循环语句中强行提前结束本次循环, 而不是终止循环。,(2) continue语句,例 求1100之间的全部奇数之和。,程序如下:x=y=0while True: x+=1 if x%2=0:continue elif x100:break else:y+=x print(y=,y),程序运行结果:y= 2500,(3)pass语句,ass语句是一个空语句,它不做任何操作,代表一个空操作,在特别的时候用来保证格式或是语义的完整性。例如下面的循环语句:for i in range(5): pass该语句的确会循环5次,但是除了循环本身之外,它什么也没做。,例:pass语句应用:逐个输出“Python”字符串中的字符。,for letter in Python: if letter = o: pass print(This is pass block) print(Current Letter :, letter)print(End!),程序运行结果:Current Letter : PCurrent Letter : yCurrent Letter : tCurrent Letter : hThis is pass blockCurrent Letter : oCurrent Letter : nEnd!,5.5 循环结构程序举例 例:利用下面的公式求的近似值,要求累加到最后一项小于10-6为止。,程序如下:import maths=1n=1.0t=1.0pi=0while math.fabs(t)=1e-6: pi=pi+t n=n+2 s=-s t=s/npi=pi*4print(PI=%f%pi),程序运行结果:PI=3.141591,例:“百钱百鸡”问题。公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡、母鸡、小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱?分析:显然这是一个组合问题,也可以看作是解不定方程的问题,采用列举的方法实现。令i、j、k分别表示公鸡、母鸡和小鸡的数目。,方法一令i、j、k的列举范围分别为:i:120(公鸡最多能买20只)j:133(母鸡最多能买33只)k:1100(小鸡最多能买100只)可以采用三重循环逐个搜索。程序如下:for i in range(1,21): for j in range(1,34): for k in range(1,101): if i+j+k=100 and i*5+j*3+k/3=100: print(公鸡:%d只,母鸡:%d只,小鸡:%d只%(i,j,k),程序运行结果:公鸡:4只,母鸡:18只,小鸡:78只公鸡:8只,母鸡:11只,小鸡:81只公鸡:12只,母鸡:4只,小鸡:84只在程序中,循环体被执行了2033100=66000次。,方法二令i、j、k的列举范围分别为(保证每种鸡至少买一只):i:118(公鸡最多能买18只)j:131(母鸡最多能买31只)k:100-i-k(当公鸡和小鸡数量确定后,小鸡的数量可计算得到)可以采用两重循环逐个搜索。程序如下:for i in range(1,19): for j in range(1,32): k=100-i-j if i+j+k=100 and i*5+j*3+k/3=100: print(公鸡:%d只,母鸡:%d只,小鸡:%d只%(i,j,k)在程序中,循环体被执行了1881=558次。,方法三从题意可得到下列方程组:由方程组可得到式子7i+4j=100。由于i和j至少为1,因此可知i最大为13,j最大为23。方法二的两重循环可改进为以下程序: for i in range(1,14): for j in range(1,24): k=100-i-j if i+j+k=100 and i*5+j*3+k/3=100: print(公鸡:%d只,母鸡:%d只,小鸡:%d只%(i,j,k)该程序的循环体被执行了1424=336次。,方法四 由方法三中的式7i+4j=100可得:j=(100-7i)/4。观察7i+4j=100,4j同100都是4的倍数,因此i一定也是4的倍数。有了这些条件,程序实现时只需要对i进行逐个搜索即可,i的搜索范围为113。采用单层循环进行逐个搜索。程序如下:for i in range(1,14): j=(100-7*i)/4 k=100-i-j if i%4=0: print(公鸡:%d只,母鸡:%d只,小鸡:%d只%(i,j,k)该算法程序只循环了13次。,