文档描述
语言程序设计基础教程3.13.1控制结构概述控制结构概述3.1.1处理模式【例3-1】生活中的处理现象。生活中很多例子表现出“顺序”、“选择”或“循环”的特征。语言程序设计基础教程3.1.23.1.2算法的结构化表示算法的结构化表示1.传统流程图语言程序设计基础教程3.1.23.1.2算法的结构化表示算法的结构化表示图 3 3例3-1的传统流程图表示语言程序设计基础教程3.1.23.1.2算法的结构化表示算法的结构化表示2.N-S流程图图 3 4 N-S流程图表示的三种处理模式语言程序设计基础教程3.1.23.1.2算法的结构化表示算法的结构化表示图图 3 3 5 5 例例3-13-1的的N-SN-S流程图流程图表示表示语言程序设计基础教程3.1.33.1.3算法的语言表示算法的语言表示【例3-4】任意输入两个整数到变量x、y中,将x、y中的数据交换并输出。图 3 6 例3-4的N-S流程图表示语言程序设计基础教程3.1.3算法的语言表示#liti3-4-1.pyx,y=eval(input(任意输入两个整数(用逗号间隔):)x,y=y,x#交换x、y的值print(x=0,y=1.format(x,y)#liti3-4-2.pyx,y=eval(input(任意输入两个整数(用逗号间隔):)t=x#用变量t来交换x、y的值x=yy=tprint(x=0,y=1.format(x,y)语言程序设计基础教程3.23.2选择结构选择结构选择结构也称为分支结构,用于实现根据条件处理不同的问题。选择结构可分为单分支、双分支、多分支以及嵌套的分支结构等类型。语言程序设计基础教程3.2.13.2.1双分支结构双分支结构双分支结构是一种最常见的分支结构,N-S结构流程图如图3-7所示:图 3 7双分支结构N-S流程图语言程序设计基础教程3.2.13.2.1双分支结构双分支结构对应的Python语句为:if:语句块1else:语句块2if和else后面的冒号(:)不能少,语句块1和语句块2两个分支都要有一致的缩进当条件为真时,执行语句块1,之后结束if语句当条件为假时,执行语句块2,之后结束if语句语言程序设计基础教程3.2.1双分支结构【例【例3-53-5】输入成绩】输入成绩gradegrade,分两种情况考虑,低于,分两种情况考虑,低于6060输出输出“不合格不合格”,6060以上输出以上输出“合格合格”。#liti3-5-1.pygrade=eval(input(输入成绩:)if grade60:print(不合格)else:print(合格)程序运行如下:输入成绩:80合格再次运行该程序:输入成绩:50不合格语言程序设计基础教程3.2.13.2.1双分支结构双分支结构Python提供了一个三元条件运算符,语法为:if else 当条件为真时,该三元表达式的值取表达式1的值,否则取表达式2的值。其实在此处的if else 不是用于表示选择结构语句,而是作为一种特殊的三元运算符,用于构造一种特殊的表达式。语言程序设计基础教程3.2.1双分支结构 例3-5用三元运算符也可如下表示:#liti3-5-2.pygrade=eval(input(输入成绩:)print(不合格 if grade60 else 合格)程序运行如下:输入成绩:80合格再次运行该程序:输入成绩:50不合格语言程序设计基础教程3.2.23.2.2单分支结构单分支结构单分支结构是一种特殊的选择结构,流程图如下:图 3 8单分支结构N-S流程图语言程序设计基础教程3.2.23.2.2单分支结构单分支结构对应的Python语句为:if:语句块if后面的冒号(:)不能少,语句块要有缩进当条件为真时,执行语句块,之后结束if语句语言程序设计基础教程3.2.2单分支结构#liti3-6.pygrade=eval(input(输入成绩:)if 0=grade60:print(差)if 60=grade70:print(中)if 70=grade80:print(良)if 80=grade=100:print(优)程序运行如下:输入成绩:50差【例【例3-63-6】输入成绩】输入成绩gradegrade,对成绩分四种情况考虑,若成绩在,对成绩分四种情况考虑,若成绩在0,60)0,60),输出,输出“差差”;成绩在成绩在60,70)60,70),输出,输出“中中”;成绩在;成绩在70,80)70,80),输出,输出“良良”;成绩在;成绩在80,10080,100,输,输出出“优优”。语言程序设计基础教程3.2.33.2.3多分支结构多分支结构 多分支结构的语法格式如下:if:语句块1elif:语句块2elif:语句块n-1else:语句块n多分支结构的N-S图语言程序设计基础教程3.2.3多分支结构#liti3-7-1.pygrade=eval(input(输入成绩:)if 0=grade60:print(差)elif 60=grade70:print(中)elif 70=grade80:print(良)elif 80=grade【例【例3-73-7】输入成绩输入成绩gradegrade,对成绩分四种情况考虑,若成绩在,对成绩分四种情况考虑,若成绩在0,60)0,60),输出,输出“差差”;成绩在成绩在60,70)60,70),输出,输出“中中”;成绩在;成绩在70,80)70,80),输出,输出“良良”;成绩在;成绩在80,10080,100,输,输出出“优优”。语言程序设计基础教程3.2.3多分支结构#liti3-7-2.pygrade=eval(input(输入成绩:)if 0=grade60:print(差)elif grade70:print(中)elif grade80:print(良)else:print(优)输入成绩:-5中输入成绩:10差输入成绩:65中输入成绩:75输入成绩:100优输入成绩:120优【例【例3-73-7】方法二方法二。语言程序设计基础教程3.2.3多分支结构#liti3-7-3.pygrade=eval(input(输入成绩:)if grade100:print(数据输入有误)elif grade60:print(差)elif grade70:print(中)elif grade80:print(良)else:print(优)输入成绩:-5数据输入有误输入成绩:10差输入成绩:65中输入成绩:75输入成绩:100优输入成绩:120数据输入有误【例【例3-73-7】方法三方法三增加一个条件对边界数据进行判断,使得程序更健壮!语言程序设计基础教程3.2.4嵌套分支结构if:if:语句块2 else:语句块3 else:if:语句块4 else:语句块5 嵌套的分支结构N-S图语言程序设计基础教程3.2.4嵌套分支结构#liti3-8-1.pygrade=eval(input(输入成绩:)if 0=grade=100:if grade60:print(差)elif grade70:print(中)elif grade80:print(良)else:print(优)else:print(成绩错误)程序运行如下:输入成绩:-5成绩错误输入成绩:110成绩错误输入成绩:88优【例【例3-83-8】对例】对例3-73-7用嵌套的分支结构实现既强健又简洁的程序用嵌套的分支结构实现既强健又简洁的程序语言程序设计基础教程3.2.4嵌套分支结构#liti3-8-2.py grade=eval(input(输入成绩:)if 0=grade=100:if grade60:print(差)else:if grade70:print(中)else:if grade80:print(良)else:print(优)else:print(成绩错误)程序运行如下:输入成绩:-5成绩错误输入成绩:110成绩错误输入成绩:88优【例【例3-83-8】方法二方法二语言程序设计基础教程3.2.5选择结构综合举例#liti3-9-1.pya=int(input(a=)b=int(input(b=)c=int(input(c=)if ab:a,b=b,aif ac:a,c=c,aif bc and a+cb and b+ca:if a=b=c:print(等边三角形)elif a=b or a=c or b=c:print(等腰三角形)elif a*2+b*2=c*2 or a*2+c*2=b*2 or b*2+c*2=a*2:print(直角三角形)else:print(普通三角形)else:print(不能构成三角形)#liti3-11-2.pya,b,c=sorted(eval(input(输入三条边(逗号间隔):)if a+bc:if a=c:print(等边三角形)elif a=b or b=c:print(等腰三角形)elif a*2+b*2=c*2:print(直角三角形)else:print(普通三角形)else:print(不能构成三角形)【例【例3-113-11】输入三角形的三条边,判断其构成的是等边三角形、等腰三角形、直角】输入三角形的三条边,判断其构成的是等边三角形、等腰三角形、直角三角形,或普通三角形。三角形,或普通三角形。语言程序设计基础教程3.33.3循环控制结构循环控制结构循环即往复回旋,指事物周而复始地运动或变化。在程序设计中,通过循环,可以使一组语句重复执行多次。在Python语言中通过for或while可以实现循环控制。语言程序设计基础教程3.3.1while循环语句 在Python中,while循环语句的语法格式如下:while 循环条件:循环体语句 while循环语句的执行过程是:计算循环条件,若条件为真,则转步骤执行;否则结束循环。执行循环体语句,执行完后转步骤继续执行。图 3 11 while 执行流程图语言程序设计基础教程3.3.1while循环语句#liti3-12.pysum=0i=2while i100:sum+=i i=i+2print(2+4+.+%d=%d%(i-2,sum)在本例中请读者思考下面3个问题:while后面的循环条件能否改为i=100?在print输出中,为什么用i-2,而不是i?在程序liti3-12.py中使用循环变量i,从2遍历到98,如果要让循环变量i从98开始遍历到2,上述程序应如何修改?【例【例3-123-12】用用whilewhile循环语句,编程求循环语句,编程求100100以内(不包括以内(不包括100100)的偶数和。)的偶数和。语言程序设计基础教程3.3.1while循环语句#liti3-13.pyrate=2.75bal=10000year=0while bal20000:year=year+1 bal=bal+bal*rate/100print(year=%d,bal=%.2f%(year,bal)【例【例3-133-13】小明现有】小明现有1000010000元可以进行理财,准备存入银行。目前银行三年以上的定期年利元可以进行理财,准备存入银行。目前银行三年以上的定期年利率是率是2.75%2.75%,假设利率不变,可以利滚利,问至少存多少年后小明的账户余额可以翻倍?,假设利率不变,可以利滚利,问至少存多少年后小明的账户余额可以翻倍?语言程序设计基础教程3.3.13.3.1whilewhile循环语句循环语句 使用while循环语句设计程序,需要注意以下事项:在进入循环前要给循环控制变量赋初值,如例3-12中的i和例3-13中的bal。一般来说,循环变量的初值是循环开始的值,循环条件是用循环变量与终值进行比较。在循环体内至少要有一条语句能够改变循环变量的值,使之趋向循环结束条件,否则,循环将永远不会结束,把永远不会结束的循环称之为“死循环”。在格式上,循环条件后面一定要有冒号“:”,循环体语句一定要进行缩格,循环结束后的第一条语句一定要与while对齐,否则程序运行时会出错。语言程序设计基础教程3.3.23.3.2forfor循环语句循环语句 Python中的for循环语句用于遍历可迭代对象中的每一元素,并根据当前访问的元素做数据处理,其语法格式如下:for 变量 in 可迭代对象:循环体语句 for循环语句的执行过程是:依次取可迭代对象中的每一个元素的值,如果有,取出赋给变量,执行循环体语句,否则循环结束。语言程序设计基础教程3.3.23.3.2forfor循环语句循环语句for循环语句的执行过程可用图3-14表示语言程序设计基础教程3.3.2for循环语句#liti3-14.pysum=0for i in range(2,100,2):sum+=iprint(2+4+.+%d=%d%(i,sum)程序运行结果为:2+4+.+98=2450#liti3-12.pysum=0i=2while i100:sum+=i i=i+2print(2+4+.+%d=%d%(i-2,sum)程序运行结果为:2+4+.+98=2450【例【例3-143-14】分别分别用用forfor和和whilewhile循环循环语句,编程求语句,编程求100100以内(不包括以内(不包括100100)的偶数和。)的偶数和。语言程序设计基础教程3.3.2for循环语句#liti3-15.pyprint(华氏温度t摄氏温度)for F in range(0,101,10):C=5/9*(F-32)print(%dtt%0.2f%(F,C)华氏温度摄氏温度0-17.7810-12.2220-6.6730-1.11404.445010.006015.567021.118026.679032.2210037.78【例【例3-153-15】已知华氏温度与摄氏温度之间的转换关系是:】已知华氏温度与摄氏温度之间的转换关系是:C=(5/9)C=(5/9)*(F-32)(F-32)其中其中F F为华氏温为华氏温度,度,C C为摄氏温度。编写程序,分别显示华氏温度为摄氏温度。编写程序,分别显示华氏温度0,10,200,10,20,.,100100与摄氏温度的对照表。与摄氏温度的对照表。语言程序设计基础教程3.3.2for循环语句程序代码如下:#liti3-16.pylist1=Python,C+,Basic,Javafor ls in list1:#遍历列表list1中的每一个元素 print(ls)程序运行结果为:PythonC+BasicJava【例【例3-163-16】已知】已知list1=list1=Python,CPython,C+,+,Basic,JavaBasic,Java,用,用forfor循环实现,一行循环实现,一行输出一个元素。输出一个元素。语言程序设计基础教程3.3.23.3.2forfor循环语句循环语句 使用for循环语句设计程序,需要注意以下事项:可迭代对象可以是列表、元组、字符串、集合和字典等序列数据,也可以是range等可迭代函数。如果是字典,每次遍历时获取的是元素的键,通过键可以再获取元素的值。在格式上,for后面一定要有冒号“:”,循环体语句一定要进行缩格,循环结束后的第一条语句要与for对齐,否则程序运行时会出错。语言程序设计基础教程3.3.33.3.3breakbreak语句语句break语句用于跳出for循环或while循环,转到循环后的第一条语句去执行。如果break用在多重循环中,则break语句只能跳出它所在的本层循环。其语法格式为:break语言程序设计基础教程3.3.3break语句【例3-17】从键盘输入一个正整数n,判断n是否是素数。素数是指只能被1和它本身整除的数。可以使用反证法,用变量i遍历2.n-1,若n能被某个i整除,则说明n不是素数,提前结束循环,此时i一定小于n,输出“不是素数”,否则输出“是素数”。#liti3-17.pyn=int(input(请输入一个正整数:)for i in range(2,n+1):if n%i=0:#如果n能被i整除 break#说明n不是素数,跳出循环,此时i小于nif in:print(%d不是素数!%n)else:print(%d是素数!%n)语言程序设计基础教程3.3.4continue语句 continue语句用于结束本次循环并开始下一次循环,对于多重循环情况,continue语句作用于它所在的本层循环。【例3-18】先阅读下列程序代码。程序代码如下:#liti3-18.py sum=0 while True:n=eval(input(请输入一个整数(输入0结束程序):)if n=0:break if n%3!=0:continue sum+=nprint(sum=%d%sum)语言程序设计基础教程3.3.53.3.5elseelse语句语句在Python语言中,for循环和while循环可以有else分支语句。当for循环已经遍历完可迭代对象中的所有元素或while循环的条件为False时,就会执行else分支中的语句。也是就说,在for循环或while循环中,只要不是执行到break语句而退出循环的,如果有else语句,就要执行else分支语句块。语言程序设计基础教程3.3.5else语句 带else分支的for循环的语法格式如下:for 变量 in 可迭代对象:循环体语句else:分支语句块 带else分支的while循环的语法格式如下:while 循环条件:循环体语句else:分支语句块语言程序设计基础教程3.3.5else语句#liti3-19.pyn=int(input(请输入一个正整数:)for i in range(2,n):if n%i=0:print(%d不是素数!%n)breakelse:print(%d是素数!%n)程序运行结果如下:请输入一个整数:1616不是素数!再运行一次:请输入一个整数:3737是素数!【例【例3-193-19】从键盘输入一个正整数,判断该数是否是素数。用带】从键盘输入一个正整数,判断该数是否是素数。用带elseelse分支的语句改分支的语句改写例写例3-173-17中的程序代码。中的程序代码。语言程序设计基础教程3.3.63.3.6多重循环结构多重循环结构在循环程序设计中,如果一个循环完全包含在另一个循环里面则称之为循环嵌套,也称多重循环。for循环和while循环可以相互嵌套,利用循环嵌套,可以实现更复杂的程序设计。语言程序设计基础教程3.3.63.3.6多重循环结构多重循环结构#liti3-20-3.pyfor i in range(1,10):for j in range(1,10):print(%d*%d=%d%(i,j,i*j),end=t)#在每个制表位上输出一个等式,不换行 print()#输完了一行9个等式后换行语言程序设计基础教程3.3.63.3.6多重循环结构多重循环结构 上述程序运行后的结果为:1*1=1 1*2=21*3=31*4=41*5=51*6=61*7=71*8=81*9=92*1=2 2*2=42*3=62*4=82*5=10 2*6=12 2*7=14 2*8=16 2*9=183*1=3 3*2=63*3=93*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=274*1=4 4*2=84*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=365*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=456*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=547*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=638*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=729*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81语言程序设计基础教程3.3.63.3.6多重循环结构多重循环结构 该九九乘法表是沿对角线对称的,如果只需要输出沿对角线以下的乘法等式,即要输出如下的九九乘法表,程序应如何修改,请读者自行完成。1*1=12*1=2 2*2=43*1=3 3*2=63*3=94*1=4 4*2=84*3=124*4=165*1=5 5*2=105*3=155*4=205*5=256*1=6 6*2=126*3=186*4=246*5=306*6=367*1=7 7*2=147*3=217*4=287*5=357*6=427*7=498*1=8 8*2=168*3=248*4=328*5=408*6=488*7=568*8=649*1=9 9*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81语言程序设计基础教程3.3.6多重循环结构【例3-21】编程,已知primelist=,求100到200之间(包括100,不包括200)的所有素数,并把素数添加到列表primelist中去,输出该列表及列表的和。在例3-19中,已经知道了如何判断一个数是素数了,现在要判断100到200之间所有数是否是素数,只要在判断素数的代码外面再加上一层循环即可。上述程序的运行结果为:101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199sum=3167#liti3-21.pyprimelist=n=100while n200:for i in range(2,n):if n%i=0:break#跳出循环,转到n=n+1执行 else:primelist.append(n)#是素数,添加到列表 n=n+1print(primelist)print(sum=%d%sum(primelist)语言程序设计基础教程3.3.73.3.7循环结构综合举例循环结构综合举例利用循环结构来解决实际问题,常采用两种方法,一是迭代法,另一是穷举法。语言程序设计基础教程1.1.迭代法迭代法迭代法也称辗转法,是一种不断用变量的原值递推新值的过程。类似数列中的通项。迭代算法是用计算机解决问题的一种基本方法,它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组语句进行重复执行,在每次执行这组语句时,都从变量的原值推出它的一个新值。利用迭代算法解决问题,需要做好以下三个方面的工作:确定迭代变量;建立迭代关系式;对迭代过程进行控制;语言程序设计基础教程1.1.迭代法迭代法迭代过程的控制又通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。语言程序设计基础教程1.1.迭代法迭代法语言程序设计基础教程1.迭代法程序代码如下:#liti3-22.pyscore=450r=0.001day=0while score=640:day=day+1 score=score*(1+r)print(%d days late,score=%.1f%(day,score)程序运行结果为:353 days late,score=640.4语言程序设计基础教程2.2.枚举法枚举法枚举法,又称穷举法。是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性的没有办法的办法。采用枚举算法解题的基本思路:确定枚举对象、枚举范围和判定条件;枚举可能的解,验证是否是问题的解。语言程序设计基础教程2.枚举法#liti3-23.pyprint(CocktHentChicken)for i in range(1,20):for j in range(1,33):k=
展开阅读全文