计算机编程导论本章主讲赵家刚第4章循环结构程序设计1-2Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论程序设计的3种基本结构(1)顺序结构(2)选择结构(3)循环结构顺序结构——是指程序流程按先后顺序执行,只有执行了前一步,才能执行后一步。例如火车在轨道上行驶,只有过了上一站点才能到达下一站点。选择结构——又称分支结构,是指程序流程可以分几条路径执行。例如在一个十字路口处,可以选择向东、南、西、北几个方向行走。循环结构——又称重复结构,是指程序流程重复执行某一段代码。例如万米跑,围着足球场跑道不停地跑,直到满足条件时(25圈)才停下来。1-3Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论语句A语句B顺序结构流程图条件判断语句A真语句B假选择结构流程图条件判断循环体真假循环结构流程图3种基本结构的流程图1-4Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论【问题4-1】用户输入若干个分数,求所有分数的平均分。每输入一个分数后询问是否继续输入下一个分数,回答“yes”就继续输入下一个分数,回答“no”就停止输入分数。分析:该问题需要输入若干分数并求和,这是一个重复的过程,应使用循环结构解决。循环次数事先不确定,需根据应答“yes”、“no”来决定循环是否继续。1-5Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论#ques4_1.pyendFlag=yessum=0.0count=0whileendFlag[0]=='y':x=input(请输入一个分数:)sum=sum+xcount=count+1endFlag=raw_input(继续输入吗(yesorno)?)print\n平均分是:,sum/count1-6Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.1循环结构设计问题【问题4-2】用户输入一个列表,求出列表中所有正偶数之和。分析:由于不知道用户输入的具体数据及个数,因此需要在循环结构中进行判断和累加。1-7Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论#ques4_2.pyli=input('请输入一个列表:')sum=0forxinli:ifx0andx%2==0:sum+=xprint'sum=',sum程序输入及运行结果:请输入一个列表:[2,3,4,-5,6,12]sum=24图4-1求列表的正偶数之和开始结束FalseTrue为sum赋初值0列表li中还有元素未取吗?将列表元素累加到sum中输入列表liFalseTrue取出的元素x是正偶数吗?输出sum1-8Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.2循环结构概述循环结构是一种重复执行的程序结构。实际应用中,常会碰到一些需要重复执行的步骤,如级数求和、统计报表等等。例如:(1)计算1+2+3+…+100,这是一个级数求和问题,需要重复执行100次,对100个数依次进行累加。(2)假设1个班级中有n名同学,统计男同学和女同学各有多少名。该问题的求解需要重复执行n次,对每1个同学依次进行判断,同时统计男同学和女同学的人数。1-9Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.2循环结构概述(3)给定2个整数,求它们的最大公约数和最小公倍数。例如:给定6和9,求最大公约数时,循环过程从6依次递减至1,当循环到3时,判断得6和9都能被3整除,于是终止循环,求得最大公约数是3.;求最小公倍数时,循环过程从9依次递增至54,当循环到18时,判断得18同时能被6和9整除,于是终止循环,求得最小公倍数是18。Python提供了两种基本的循环结构语句——while语句、for语句。1-10Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.3while语句while表达式:循环体表达式循环体真假while表达式:循环体else:else子句1-11Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论(1)while语句是一个条件循环语句,即首先计算表达式,根据表达式值的真、假来决定是否继续循环。(2)while语句的语法与if语句类似,要使用缩进来分隔子句。(3)while语句的条件表达式不需要用括号括起来,但是表达式后面必须有冒号。(4)使用while语句编程通常会遇到两种题型,一种是循环次数事先确定的问题;一种是循环次数事先不确定的问题。说明:1-12Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.3.1while语句解决不确定循环次数的问题【分析】该问题使用循环结构解决,由于不确定用户即将输入几个正整数,因此属于不确定循环次数的问题。【例4-1】编程从键盘输入若干正整数,求所有输入整数之和。当输入整数为负数时,结束该操作。x=0?将x累加到s中图4-3累加若干整数值的框图开始结束FalseTrue输入第一个整数x输入后续整数x输出s1-13Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论#Exp4_1.pyprint'请输入若干正整数进行求和操作,当输入负数时结束:'s=0x=input(请输入一个整数:)whilex=0:s=s+xx=input(请输入一个整数:)print'整数之和=',s程序:程序运行结果:请输入若干正整数进行求和操作,当输入负数时结束:请输入一个整数:10请输入一个整数:20请输入一个整数:301-14Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论【例4-2】编程从键盘输入若干个字符,一边输入一边输出,当输入“#”字符时终止该操作。【分析】(1)本题使用循环结构解决,每次循环从键盘输入一个字符,直到输入为“#”字符时停止循环。(2)由于输入的字符个数无法确定,因此循环次数不确定。是否1-15Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论a=raw_input('请输入字符,如果输入#号则结束输入操作:')whilea!='#':#判断输入的是否是井号print'您输入的字符是:',a#打印输入的字符#以下语句是再次输入一个新的字符a=raw_input('请输入字符,如果输入#号则结束输入操作:')else:print'输入结束'程序:提问:(1)循环结束后,变量a中的值是什么?(2)如果循环体中没有下面这条语句会怎么样?a=raw_input('请输入字符,如果输入#号则结束输入操作:')1-16Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.3.2while语句解决确定循环次数的问题确定循环次数的问题是指循环之前可以预知循环即将执行的次数,为了控制循环次数,通常在程序中设置一个计数变量,每次循环,该变量进行自增或自减操作,当变量值自增到大于设定的上限值或者自减到小于设定的下限值时,循环自动结束。1-17Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.3.2while语句解决确定循环次数的问题【例4-3】编程计算1+2+3+…+100的值。分析:本题使用循环结构解决,每循环一次累加一个整数值,整数的取值范围为1~100。由于整数的范围是确定的,因此循环次数也是确定的。1-18Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.3.2while语句解决确定循环次数的问题程序:#Exp4_3.pyi,s=1,0whilei=100:s=s+ii+=1print'1+2+3+...+100=',si=100?将i累加到s中图4-5从1累加到100的框图i、s赋初值1、0开始i自增1结束FalseTrue输出s框图:1-19Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.3.2while语句解决确定循环次数的问题分析:本题使用循环结构解决,每循环一次输出一个列表元素值,由于列表定义后,其长度是已知的,因此循环次数也是确定的。【例4-4】依次输出列表中每个元素的值。1-20Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论4.3.2while语句解决确定循环次数的问题程序:#Exp4_4.pya_list=['a','b','mpilgrim','z','example']a_len=len(a_list)i=0whileia_len:print'列表的第',i+1,'个元素是:',a_list[i]i+=1图4-6依次输出列表元素的框图创建列表a_list开始i自增1结束FalseTrue输出列表元素a_len,i赋初值i小于列表长度吗?1-21Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论练习:1.求1+3+5+…+992.求2*4*6*…*121-22Copyright©SWFU-CISD,2012.Allrightsreserved.计算机编程导论第6次上机作业:1.计算,参考值:S=1.71828211111*21*2*31*2*3*50S2.编程求斐波拉契数列的前20项,已知该数列的第一、二项分别是0、1,从第三项开始,每一项都是前两项之和。例如:0,1,1,2,3,5,8,13……3.求1~100之间所有的素数,并统计素数的个数。