第四章 基本控制结构的程序设计
相关研究表明三种基本程序结构可以写出所有的程序,它们是: 顺序结构 分支结构 循环结构
4.1用Python实现顺序结构 程序的入口从a开始,自顶向下,依次执行A代码块,B代码块,最后执行到b,那么a和b就是一种顺序结构的程序。而A代码块,B代码块放的是什么内容呢?它们的内容可以继续是一个顺序结构,又或者是分支、选择结构。这也叫做程序的嵌套,正是因为嵌套的存在,使得程序的执行顺序,可以灵活变化,从而实现不同的功能。 A B a b
【例1】:温度转换 问题分析和算法可以参考第二章的例2,温度华氏和摄氏温度两者对应关系是F=(9/5)C+32。 程序代码: celsius = int(input('请输入一个摄氏温度 : ')) fahrenheit=(9/5)* celsius + 32 print('华氏温度:') print(fahrenheit) 执行结果: >>> 请输入一个摄氏温度 : 33 华氏温度: 91.4
4.2用Python实现分情况决策程序 简单分支 双分支 分支嵌套 多分支
4.2.1Python简单分支 【例2】:在Python的IDLE环境下创建一个名为if_statement.py的程序,代码如下所示: 条件 成立 B 【例2】:在Python的IDLE环境下创建一个名为if_statement.py的程序,代码如下所示: numA=3 numB=4 if numA <= numB: print ("numB是比较大的数")
4.2.2Python双分支 A 条件 成立 B C 【例3】:在Python的IDLE环境下创建一个名为if_else_statement.py的程序,代码如下所示: numA=3 numB=4 if numA <= numB: print ("numB是比较大的数") else: print ("numA是比较大的数")
4.2.3Python分支嵌套 【例4】求三个数的最大值。 numA=3 numB=4 numC=5 if numA <= numB: if numC<numB: print ("numB是最大的数") else: print ("numC是最大的数") if numC<numA: print ("numA是最大的数")
4.2.4多分支结构 【例5】:在Python的IDLE环境下创建一个名为if_elif_else_statement.py的程序,利用多分支结构,求解三个数的最大值。代码如下所示: numA=3 numB=4 numC=5 if numA>=numB and numA>=numC: print("numA是最大值") elif numB>=numC and numB>=numA: print("numB是最大值") else: print("numC是最大值")
4.3用Python实现循环结构结构程序 请大家探讨如何求出1+2+3+4+……+100的结果? 在算法中,把这种从某处开始,按照一定条件,反复执行某一处理步骤的过程,叫做循环结构。它是可以循环执行某些语句的结构,能够在一定程度上减少程序的复杂性。它由循环条件和循环体组成,但存在一个上述结构都没有的安全隐患,那就是死循环。
在python中,提供了两种经常用到的循环结构: For结构 While结构
4.3.1Python的for循环语句 这种循环结构的语法如下: for迭代变量 in 序列或者迭代器 循环体 else: 表达式
4.3.1Python的for循环语句 【例6】:设计一个元组,并用循环结构依次显示其中的内容。在Python的IDLE环境下创建一个名为for_statement.py的程序,代码如下所示: generals = [ "李元霸", "宇文成都", "秦琼", "程咬金", "单雄信" ] print ("-- 武将列表 --") for x in generals: print ("武将姓名:",x) 上述代码输出结果如下: >>> -- 武将列表 -- 武将姓名: 李元霸 武将姓名: 宇文成都 武将姓名: 秦琼 武将姓名: 程咬金 武将姓名: 单雄信 讨论如何循环显示一个字符串呢?
【例7】检测字符串是否全是数字 输入一个字符串,用循环结构判断它的每一个字符是否为数字,若不是则输出“该字符串包含非数字字符”。 思考:如何对【例1】的“摄氏温度转换为华氏温度”输入数据进行判定,若输入的不是数字和小数点则提示“输入错误”
4.3.2Python的range()函数 如果需要遍历一个数字序列,可以使用Python中内建的函数range()。语法如下: range( start,end,step =1) range()会返回一个包含所有k的列表,这里start<=k<end,从start到end,k每次递增step。step不可以为零,否则将发生错误。需要注意的是start和end组成了半开区间,列表里的k取不到end。
4.3.2Python的range()函数 请说出下面几个序列所对应的内容: range(5) [2,5,8,11,14,17] [3,4,5,6] range(5) [0,1,2,3,4]
【例8】利用for range对鸡兔同笼问题进行求解 思维目标:穷举法思维
4.3.3Python的while循环结构 从该流程图可以看出: (1)只有一个入口。 条件 成立 B 不成立 C A 从该流程图可以看出: (1)只有一个入口。 (2)只有一个出口。(请注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。) (3)结构内的每一部分都有机会被执行到。 (4)结构内不存在“死循环”(无终止的循环)。
4.3.3Python的while循环结构 【例9】求解银行存款利息问题 已知银行存款利率为1.9%,编写程序计算并输出需要存多少年,10000的存款本金才会连本带利翻一番 。
这显然是一个迭代问题,而且是以年为单位,本金在发生变化,而这样的循环究竟要循环多少次呢?显然是这个问题要求解的结果,对于不知道循环次数的问题,使用while是非常方便的 本实例可以用如下代码实现: cunkuan = 10000 #本金10000元 years=0 while cunkuan<20000: years+=1 cunkuan=cunkuan*(1+0.019) print(str(years)+"年以后,存款会翻番") 程序运行结果如下: >>> 37年以后,存款会翻番
请大家讨论什么时候使用while,什么时候使用for方便?
4.3.4 break、continue和pass语句 与break语句不同,当continue语句在循环结构中执行时,并不会退出循环结构,而是立即结束本次循环,重新开始下一轮循环,也就是说,跳过循环体中在continue语句之后的所有语句,继续下一轮循环。 循环体可以包含一个语句,也可以包含多个语句,但是却不可以没有任何语句。如果只是想让程序循环一定次数,但是循环过程什么也不做的话, 使用pass语句,它不执行任何操作。
4.3.4Python的break、continue和pass语句 mylist = ["zope","Python","perl","Linux"] for technic in mylist: if technic == "perl": break else: print (technic) 答案为:zope Python
4.3.5循环结构应用 输出星号(*) 约瑟夫环
4.3.5循环结构应用------输出星号(*) 将一个星号(*)按照一定的规律输出,组成三角形、菱形等图形,是学习循环结构经常用到的应用案例。
4.3.5循环结构应用------输出星号(*) 解题思路: 双重循环 行数为i,每行星号的数量或者空格的数量为j for i in range(1,11): s="" for j in range(0,10-i): s +=" " for j in range(0,2*i-1): s +="*" print (s) for i in range(1,11): s="" for j in range(0,i): s +="*" print (s)
4.3.5* 循环结构应用------约瑟夫环 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,这个问题也被称为约瑟夫环问题。
4.3.5*循环结构应用------约瑟夫环 一共有三十个人,从1-30依次编号。每个人开始报数,报到9的人自动出列,当有人出列后,从后一个人开始重新从1报数,以此类推。求出列的前十五个人的号码: 思路分析:该题目选择合适的数据结构很重要,为了使得出列的人不再重复报数,专门使用一个list数据结构存储出列的人,每个人报数前,先到该list中查找是否已出列来,如果出列不报数,否则报数。
4.3.5*循环结构应用------约瑟夫环 list=[x for x in range(1,31)] for x in list: print(x) print("被剔除:") del_number=-1 for i in range(1,15): #生成编号 j=0; k=del_number+1 while j<9: if(k==len(list)): k=0 if(list[k]!=-1): j=j+1 k=k+1 del_number = k-1 print(list[del_number]) list[del_number]=-1 #用-1标记被踢出的位置
实验内容 4.7.2 实验范例 1,3 4.7.3 实验内容(1),(2),(3),(5),(8)-(11)
4.4字符串数据操作 在第3章中,已经介绍了Python的数据类型,其中字符串数据类型,又称为文本类型,它在Python中使用频率很高,本节利用前面讲述的控制结构,专门介绍下针对这种数据类型的操作。
4.4.1字符串和List数据的相互转换 【例4-4-1】某字符串mystr存储了一个学生的兴趣爱好所有兴趣爱好,代码如下: 如何能快速的知道该生有多少项爱好?已知该生的兴趣爱好之间是用顿号进行分割的。 mystr="篮球、足球、兵乓球、羽毛球、电子游戏、看书、旅游、电影、音乐" li=mystr.split('、') print("该生的爱好有"+str(len(li))+"项")
4.4.1字符串和List数据的相互转换 【例4-4-2】:某字符串mystr存储的内容是一串数字“0122202341020303”,现在要求把该数奇数位置上的数字用‘-’代替。 程序代码如下: mystr="0122202341020303" print(mystr+"\n") li=list(mystr) for i in range(1,len(li),2): li[i]='-' mystr="".join(li) print(mystr)
4.4.2字符查找 如果需要在某个字符串中查找特定的字符,即可以通过对字符串进行遍历,又可以通过字符串的函数处理。 【例4-4-3】:在一个输入的字符串中查找是否有字符“梦”存在。 while True: str=input("请输入一个字符串(quit退出)\n") if(str=="quit"): break else: findok=False for mychar in str: if mychar=="梦": findok=True if findok: print("找到字符梦") print("没找到字符梦")
4.4.3字符串遍历 上个实例介绍了字符串遍历,但是for 字符 in 字符串这种类型的遍历是一种无序的遍历,即这种遍历只强调了字符有没有包含在字符串中,但是字符在字符串的哪个位置是无所谓的。接下来就介绍下字符串的有序遍历。 【例4-4-4】:输入任何一个数字,如果数字中的每位数字之和(最高位除外),等于最高位上的数,则输出找到了,否则输出找不到。 while True: sum=0 str=input("请输入一个数字(quit退出)\n") if(str=="quit"): break else: for i in range(1,len(str)): sum=sum+int(str[i]) if sum==int(str[0]): print("找到了") print("找不到")
4.4.4字符串截取 【例4-4-5】输入一个产品编码,识别其是否在市以及出厂日期 已知某个产品的编码是2320060214-345,该编码信息如下: 第1位为1表示该商品在市,为2表示该商品退市; 第2位表示商品的类别; 第3~10位表示商品的出厂日期; 第12~14位表示商品的编号;
源代码 while True: mystr=input("请输入一个产品编码(quit退出)\n") if(mystr=="quit"): break else: if mystr[0]=="1": print("商品在市,") print("商品退市,") myyear=mystr[2:6]+"年" mymonth=mystr[6:8]+"月" myday=mystr[8:10]+"日" print("商品的出厂日期是"+myyear+mymonth+myday)
实验内容 4.7.3 实验内容 (4),(6),(7) 4.6 习题与思考 4-8