Logo

郎哥编程

保持程序的运行与while循环

2020-09-01 282

如何保持程序的运行?

前面编写的程序,有个问题。例如在计算三角形面积的程序中,运行程序后,输入三角形的底和高,程序计算出三角形的面积,程序就结束了。如果需要再次计算三角形的面积,就需要重新启动程序。

01.png

但在一些情况下,我们希望程序能够一直保持运行,直到用户选择退出程序。例如:我们经常使用的QQ、微信等程序,这些程序启动后一直保持运行状态,直到我们关闭它,程序才会退出。

02.png

在《嵌套条件结构》课程中,有个课后编程练习。要求编写一个用户登录程序:提示用户输入用户名,然后再提示用户输入登录密码。如果用户名是"admin"并且密码是“888888”,则提示用户登录成功,否则提示用户登录失败。

03.png

在这个编程练习中,用户登录成功或登录失败都会退出程序。现在我们对这个编程练习再增加一个需求:如果用户登录成功,程序退出。如果用户登录失败,要求用户重新输入用户名和登录密码,直至用户输入正确的用户名和登录密码。

要实现新增加的需求,就需要当用户输入错误的用户名或密码时,程序不能退出,要一直保持运行状态。

04.png

前面我们学习了for循环结构,for循环结构可以在一个整数序列范围内重复执行循环体内的语句,用for循环可以保持程序一直在运行状态吗?答案是否定的,因为无论这个整数序列范围有多大,它包含的数是有限的、可数的,因此for循环结构的循环次数也是可数的、有限的,它不能保持程序一直处于运行状态。

那么,还有没有其它循环结构体来使用呢?在前面的课程中我们已经提起过,Python提供了for循环和while循环两种循环结构体。我们先来认识while循环结构,然后再探讨while循环结构是否能实现让程序一直保持运行状态的需求。

05.png

认识while循环结构

要认识while循环,我们先来看一个编程案例。

06.png

程序功能非常简单,就是求1和10、2和10、3和10、4和10、5和10的乘积,并输出乘积结果。我们先使用以前学过的知识来编写这个程序。程序流程图如下:

07.png

上面的流程图是不是很繁琐?相同的操作重复执行了5次。如果要求输出从1至100分别乘以10的乘法表呢?那流程图岂不要重复画100次。不过别担心,现实情况没有这么恐怖,后面会讲述使用while循环结构来解决这个问题。

下面是根据前面的流程图编写的代码:

08.png

从上面的程序代码可以看出,程序先计算乘积,再输出乘积结果,先后重复了5次上述操作。如果要求程序输出自然数1至100分别乘以10的乘法表,就得需要重复100次这样的操作,写200条语句。这样既费时又费力。因此,我们需要有一种方法可以快速有效地执行重复性操作,for和while循环结构就是用来解决这类问题的。

前面已经介绍了for循环结构,本课程重点介绍while循环结构。

while循环结构的语法为:

09.png

其中,表达式是循环执行的条件,每次循环执行前,都要对表达式进行计算,表达式返回逻辑值,当表达式返回结果为真时则执行循环体,否则退出循环,如果表达式返回结果在循环开始时就为假,则不执行循环体,直接退出循环;循环体包含一条或多条语句。

单个的变量、逻辑值、数值也是表达式。Python规定,当表达式需要返回逻辑值时,非0的数值为真值,0值为假值。

10.png

了解了while循环结构,我们就可以用while循环结构来编写案例1的程序,使用while循环结构的流程图如下:

11.png

流程图用到了循环控制。其中,菱形符号为条件判断,用于判断循环条件是否满足,当num<=5时,执行循环体中的计算和输出语句,并在循环体中对num进行自加1操作。循环体执行完毕,进入下一轮循环,直至num大于5时退出循环,程序结束。

下面是根据使用while循环结构的流程图编写的代码:

12.png

使用while循环结构后,代码简洁多了。while关键字后面是一对小括号,关系表达式在小括号内,带while关键字的语句也称为条件语句,在条件语句后面是循环体的语句,循环体的语句要比条件语句缩进同等数量的空格,建议是四个英文空格。

13.png

使用while循环保持程序的运行

while每次循环前,都要先执行关系表达式,对条件进行判断,当条件为真时则执行循环体的语句,否则退出循环。如果我们让关系表达式返回的结果一直为真,那么while循环就会一直执行下去,程序也就一直处于运行状态。

14.png

不过这样会产生死循环的问题,while循环会一直执行。例如下面的代码就会产生死循环的问题:

15.png

在上面的代码中,因为变量num的值一直为1,num<=5返回的结果一直为真,循环条件永远满足,程序将会无休止地执行print语句,陷入死循环。程序陷入死循环的结果就是程序一直占用电脑CPU的资源,让电脑运行变得更慢,在极端情况下,电脑可能会出现死机现象。

16.png

要使上面的代码不进入无限循环,在循环体中加入修改循环变量num的语句即可。

17.png

上面的代码循环体将执行5次,因为每执行一次循环体,num的值就加1,当执行到第5次时,num的值为5,自增后变为6,进入下次循环时,不满足循环条件,循环退出。

从上面的讨论可以看出,要让程序一直保持运行状态,可以使用while循环语句,并设置while的循环条件一直为真,如下面的代码:

18.png

在上面的代码中,循环条件一直为真,因此循环体必须要包含退出循环的语句,否则程序就会陷入死循环了。

找到了解决要让程序一直保持运行状态的方法,就·可以编写前面改进的用户登录的程序了,并可以满足新增加的需求。

程序流程图如下:

19.png

案例代码

'''
title:保持程序的运行与while循环——编程案例01
Description: 改进的用户登录程序
author:编程训练营
date:2020.6.25
'''
# 用户登录程序
# 开始循环
while(True):
    # 要求用户输入登录名
    name = input("请输入登录名:")
    # 要求用户输入登录密码
    psw = input("请输入登录密码:")
    # 判断登录名是否正确
    if name == "admin":
        # 判断登录密码是否正确
        if psw == "888888":
            print("登录成功")
            break;
        else:
            print("登录密码输入不正确")
    else:
        print("登录名输入不正确")

代码使用了while循环结构,循环条件为逻辑值True,也就是循环条件一直满足,该循环结构是无限循环(死循环),程序也会一直运行下去。在循环条件一直满足的情况下,循环体内的语句必须有退出循环的语句。代码中的break语句就是退出循环的语句,break语句用于退出当前循环,后面的课程还会讲到break语句。

在循环结构体内又使用了嵌套条件结构,外层条件判断用户输入的用户名是否和程序设置的用户名一致,内层条件判断用户输入的登录密码是否和程序设置的登录密码一致。如果用户输入的用户名和登录密码,都和程序设置的用户名和登录密码一致,程序输出“登录成功”信息给用户,并使用break语句退出循环,程序结束。

如果用户输入的用户名和登录密码,和程序设置的用户名和登录密码不一致,程序输出用户名或登录密码输入错误信息,要求用户重新输入。

内容小结

同学们在编写程序时,如果要使用while循环结构,一定要注意循环条件的设置与改变,防止出现无限循环的情况(死循环)。在循环条件一直为真的情况下,循环体内的语句必须要有break语句,并且break语句在符合条件的情况下要能够执行,也就是程序能够在满足一定的条件下退出无限循环。

上机操作

小明将10000元钱存入银行,银行的年利率为10%,如一直不取出,问按照复利的计算方法,至少经过多少年小明才能拿到150000元。

提示:

第一年本金带利息的计算公式为:S 1=10000 * (1+0.1)

第二年本金带利息的计算公式为:S 2= S 1 * (1+0.1)

第三年本金带利息的计算公式为:S 3= S 2 * (1+0.1)

………

第n年本金带利息的计算公式为:S n= S(n-1) * (1+0.1)

根据上述公式可知,应用while结构可以求出n年后的应收本金和利息,循环条件为n年后的应收本金和利息小于150000元,当n年后的应收本金和利息大于150000时,该n就是应求的年数。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论