高一上册信息技术 周而复始的循环-条件循环 逐字稿-5,415字
师:各位同学,上节课我们学过一种循环——计数循环。通过计数循环,我们帮小怪兽解决了吃多少颗药后身高计算的问题。这节课,小怪兽又遇到难题了,同学们有信心帮它解决吗?
生:有!
师:很好,我们看看小怪兽今天碰到什么难题。小怪兽现在身高155厘米,它的目标是长到170厘米,但不知道该买多少颗特效增高药。同学们能帮它解决这个问题吗?我们想想,用之前学的计数循环能不能解决?根据计数循环基本语句格式,for后面的循环变量in列表用来确定循环次数,语句块描述循环体。在这道题里,我们能提前知道循环次数吗?
生:好像不行。
师:对,知道循环次数就知道小怪兽该买多少颗药了,这正是我们要求解的结果。所以,计数循环解决不了这个问题。有同学问,既然计数循环只是循环的一种,那循环还有没有其他格式能帮小怪兽解决问题呢?今天我们就来学习一种新的循环结构——条件循环。我们看看条件循环的基本语句格式,条件循环的关键字是while,计数循环的关键字是什么?
生:for。
师:非常好。while后面紧跟着关系表达式,之后用冒号,再后面跟随语句或语句组,这就是循环体部分。我们来看while循环的程序流程图。当关系表达式满足时,我们执行循环体;当关系表达式不满足时,就退出循环。在while循环中,我们不需要提前知道什么?
生:循环次数。
师:对,只需要知道循环需要满足什么条件。但要注意,在while的循环体里一定要包含循环变量的变化,使关系表达式能从成立到不成立转变,不然程序就会陷入无限循环。现在我们看看刚刚的问题,用条件循环能不能解决?想想,既然可以不知道次数,那要满足什么条件?
生:小怪兽身高要达到170厘米。
师:所以我们可以把控制条件设定为身高小于等于170厘米时,就继续吃药。条件是不是length要小于等于170 ,循环体就是不断吃药。那循环执行多少次,是不是就知道小怪兽要吃多少颗药了?思路有了,我们能不能画出流程图?大家试试,看看和老师的一不一样。注意,在控制条件里,循环体多了一句话,count = count + 1,为什么呢?
生:因为要计算循环次数,也就是小怪兽要吃多少颗药。
师:对,条件循环不是计数循环,里面没有变量能计算循环次数。为了知道循环次数,我们需要一个额外的计数器来计算,所以会多这么一条语句。我们看整体流程图,首先要对变量进行初始化,这里面要用到哪些变量?
生:length,初始值155。
师:还有呢?既然要用count记录循环次数,是不是还要把计数器清零?这是初始化操作,然后是循环变量,里面包含两条语句。我们把流程图与程序一一对应。看看循环控制条件while length小于等于170,注意,这里用到了括号,这是while循环和for循环不一样的地方。for循环里,循环控制条件不用括号括起来,while循环里要用括号把循环控制条件括起来,冒号之后是循环体,注意缩进是必须的。老师问大家,循环体里面包含几条语句?
生:两条。
师:对,第一条是身高不断增长,第二条记录循环次数。现在看了这个程序,同学们能告诉老师,小怪兽需要吃多少颗药才能长到170厘米吗?
生:第一眼看不出来。
师:那运行一下程序看看。运行结果出来了,小怪兽需要吃7颗药才能长到170厘米。这个程序到底怎么运行的呢?我们用流程图,一步一步细化,看看整个程序的执行过程,帮助理解条件循环。最开始,身高155厘米,计数器为0 ,155小于等于170,控制条件成立,循环体语句执行,length = 155×(1 + 0.015) ,count = 0 + 1 。这时,length = 157.325 ,count = 1,这是第一轮循环后的值。第二轮循环,157.325与170相比,满足条件,循环继续。length = 157.325×1.015 = 159.68 ,count = 1 + 1 = 2 。第三轮循环,159.68与170相比满足条件,执行循环体,length = 159.68×1.015 = 162.08 ,count = 2 + 1 = 3 。依此类推,到第六次循环结束,length = 169.48 ,count = 6 。169.48与170比较,小于等于170,进入第七次循环,length = 172.02 ,count = 6 + 1 = 7 。第七轮循环过后,进入第八轮循环,172.02与170相比,条件不成立,退出循环,程序结束。所以,小怪兽吃7颗药就能长到170厘米。通过这个讲解,大家对条件循环是不是有了更深理解?编写条件循环有三处关键点,大家要注意。首先是考虑循环执行的条件,像length小于等于170,这个条件得能由真变假。如果条件一直为真,比如while 1,循环就会变成无限循环。第二个要考虑什么?
生:需要执行的部分。
师:对,在需要执行的部分里,一定要有能使循环控制条件由真变假的变量增长。在这道题里,length不断增长,就能使length小于等于170这个条件由真变假,让循环结束。第三,条件循环不记录循环次数,如果想知道循环次数,必须借助第三方变量统计,比如这里用count记录循环次数。这是编写条件循环要注意的三个方面。现在同学们有信心编写条件循环吗?小怪兽现在身高150厘米,特效增高药的药科增长率为0.02 ,我们想知道吃几颗药后,小怪兽能达到200厘米的目标,和刚刚的题目很相似,同学们试试编写一下。
(同学们编写程序)
师:都编完了,同学们能正常运行吗?
生:能。
师:好,我们说一下结果。有同学已经得到正确结果了。但老师看到一位同学的程序和结果,他得出小怪兽吃一颗药就能长到200厘米,显然这个结果不对,小怪兽吃一颗药肯定长不到200厘米。老师把他的程序拿出来,大家帮看看哪里出问题了。
生:看不出来。
师:老师一眼也看不出来。在平常编写程序时,经常会遇到这种情况,程序很难一次编写成功,会碰到很多错误。今天老师教大家一种调试程序的方法,用PDB库,也叫PDB Python调试器。PDB Python调试器是个比较简单的调试工具,常用的操作有三个。第一是查看变量,比如在这道程序里,可以查看身高、吃药颗数(记录循环次数)这些变量的值。第二,变量c表示继续运行,变量q代表结束调试,退出测试程序。我们用PDP Python调试器看看怎么找到程序的错误点。使用PDB调试器,要在程序首行加入PDB库,让程序识别PCQ这些命令。有了库之后怎么调试呢?我们希望程序能一步一步看每步执行过程,所以加一句话PDB set chance ,这相当于给程序设了个小阀门,程序运行到这就停止,我们可以看看这一小段有没有错误。输入继续执行命令后,程序就执行下一条语句,在程序设计里,这种设置小阀门的动作叫设置断点。在循环结构里,为清楚看到循环每次运行步骤,一般把断点设置在循环结构语句组的最后语句。设置完断点,用PDB调试器调试程序,看看结果。老师写了三次调试结果。第一轮循环后进入断点,在PDB库,用p查看count和length的值,此时第一轮循环结束,count = 1 ,length = 153.0 。输入c命令,程序继续执行,进入第二轮循环,执行到断点又暂停,再看变量值,count = 1 ,length = 156.06 。继续执行c命令,执行下一轮循环,执行到断点程序又停止,这时count = 1 ,length = 159.18 。大家看,length的值在不断增长,说明循环不会陷入无限循环,但count的值不能正确记录循环次数。第一轮循环count = 1 ,第二轮循环count按道理应该是2 ,但还是1 。程序问题出在哪?