CC++ & Algorithm

while循环

中等0
语言版本:C++
概述:条件成立就一直做,就像等红绿灯时绿灯亮就走。

条件成立就重复:while 循环详解

你有没有遇到过这样的情况:不知道要重复多少次,但知道“什么时候停下”?比如:

  • 你存零花钱,每天存5元,直到攒够200元买滑板。
  • 妈妈让你“一直写作业,直到写完为止”——你也不知道要写多久,但一旦写完就停。
  • 玩猜数字游戏,你一次一次地猜,直到猜中为止。

这些场景里,重复的次数不是固定的,而是取决于某个条件是否还成立。Python 里的 while 循环 就是专门解决这类问题的:只要条件为真,就一直执行循环体里的代码;条件变成假了,就停下来。

while 循环长什么样?

先看最基本的写法:

while 条件:          # 条件可以是任何结果为“真”或“假”的表达式
    要重复做的事      # 缩进的代码就是循环体

它就像马路上的一盏“条件红绿灯”:

  • 当条件为真(比如红灯亮)→ 你必须继续等待(执行循环体)。
  • 当条件为假(绿灯亮)→ 你可以走了(循环结束)。

生活中的 while 循环

例子1:存零花钱买滑板

假设你每天往储蓄罐里放5元,想知道什么时候能攒够200元。

total = 0          # 总金额,初始0元
goal = 200         # 目标金额,200元
day = 0            # 天数计数器

while total < goal:        # 只要总金额小于目标,就继续存
    total = total + 5      # 每天存5元
    day = day + 1          # 天数加1
    print(f"第{day}天,已存{total}元")

print(f"攒够了!花了{day}天。")

运行输出:

第1天,已存5元
第2天,已存10元
...
第40天,已存200元
攒够了!花了40天。

这里循环的条件是 total < goal,只要这个条件为真,就继续存钱。一旦 total 变成 200,条件变成假,循环停止。

例子2:排队等奶茶

你去奶茶店排队,前面还有 n 个人。你每等一个人就往前走一步,直到前面没人。

people_ahead = 5          # 前面有5个人
position = 1              # 你站在第1位,后面还有4个人

while people_ahead > 0:   # 只要前面还有人,就继续等
    print(f"还有{people_ahead}个人在我前面,继续等...")
    people_ahead = people_ahead - 1   # 走一个
    position = position + 1           # 你位置往前
    # 通常还要等一会儿,但这里用减1模拟

print("轮到我了!点单!")

和 for 循环的区别

特点for 循环while 循环
适用场景知道要循环多少次(比如从1数到10)不知道次数,只知道什么时候停
典型例子遍历列表、固定次数的计算猜数字、直到用户输入正确
条件基于一个序列(如range)基于一个布尔表达式

简单记忆:for 循环是“做X次”,while 循环是“做到某条件满足为止”。

经典例子:猜数字游戏(保留原文)

猜数字是 while 循环最经典的应用——你不知道要猜几次,直到猜中为止。

import random                 # 导入随机模块
secret = random.randint(1, 100)  # 生成1~100之间的随机整数
guess = 0                     # 初始化猜测值,和secret不同即可

while guess != secret:        # 当猜测不等于秘密数时,继续猜
    guess = int(input("猜一个1-100之间的数:"))
    if guess < secret:
        print("猜小了")
    elif guess > secret:
        print("猜大了")

print("恭喜你猜对了!")        # 一旦条件变成假(guess == secret),执行这句

关键点:

  • while guess != secret:只要“猜测不等于秘密”这个条件成立,就重复执行猜的动作。
  • 每次循环都会改变 guess 的值(通过输入),这样条件才有可能变成假。
  • 如果一直不改变条件(比如永远不输入、或者代码里漏了改变变量的语句),就会变成死循环。

容易犯的几个错误(中小学生常见)

错误1:忘记改变条件 → 死循环

count = 1
while count <= 5:
    print("我还在循环里")
    # 忘了写 count = count + 1

这个程序会永远打印“我还在循环里”,因为 count 永远是1,条件永远为真。必须每次循环中至少有一行代码能让条件最终变成假,比如让变量递增或递减。

错误2:条件写反

# 想循环直到用户输入 'yes'
answer = ""
while answer != "yes":   # 这个正确
    answer = input("请输入 yes 结束: ")

# 但如果写成 while answer == "yes": 那就永远不会执行循环体,
# 因为一开始 answer 是空字符串,不等于 yes。

错误3:死循环中忘记写 input 的冒号?不会,但要注意缩进

while True:
print("我缩进错了")   # 没有缩进,会报错

while 循环体必须缩进,通常用4个空格。

进阶技巧:用 break 提前跳出循环

有时你想立即退出循环,不管条件是否还成立。可以用 break

比如猜数字游戏中,可以加一个“放弃”选项:

import random
secret = random.randint(1, 100)

while True:                      # 条件永远为真,但用break退出
    guess = input("猜一个数(输入q退出):")
    if guess == 'q':
        print("放弃啦,正确答案是", secret)
        break                    # 立即跳出循环
    guess = int(guess)
    if guess < secret:
        print("小了")
    elif guess > secret:
        print("大了")
    else:
        print("猜对了!")
        break                    # 猜对也跳出

注意:break 只跳出它所在的那一层循环。如果在嵌套循环里,只能跳出最内层。

完整示例:计算圆周率(蒙特卡洛方法)趣味版

(高级一点,但能展示 while 的威力)

我们可以在一个正方形内随机丢“豆子”,落在四分之一圆内的豆子越多,就越接近 π/4。我们可以用 while 循环不断丢,直到达到一定精度。

import random
inside = 0           # 圆内的点数
total = 0            # 总点数
tries = 0            # 投掷次数
target_tries = 100000  # 目标投掷次数

while total < target_tries:   # 注意这里是 total < 目标,条件是次数不够
    x = random.random()      # 0~1之间的随机数
    y = random.random()
    total = total + 1
    if x*x + y*y <= 1:       # 判断是否在四分之一圆内
        inside = inside + 1

pi_approx = 4 * inside / total
print(f"投掷{total}次后估算π≈{pi_approx}")

这里 while 的条件是 total < target_tries,一旦达到10万次就停止。当然也可以改成“直到精度足够”,但需要更复杂的判断。

总结与相关指引

  • while 循环:条件成立就一直做,适用于未知次数的重复。
  • 一定要在循环体里改变影响条件的变量,否则会死循环。
  • 可以使用 break 提前结束循环。
  • 可以用 continue 跳过本次循环后面的代码,回到条件判断(但初学可以先用 break)。

学完 while 循环后,建议继续学习:

  • [for 循环](固定次数循环)
  • [break 和 continue](循环控制)
  • [布尔表达式](条件判断的基础)
  • [嵌套循环](循环里面套循环)

现在你可以用 while 循环写出更多好玩的程序了,比如:不断询问密码直到正确、计算指数增长、模拟游戏生命值变化等。记住:只要条件是“直到某件事发生”,就用 while!

例题精讲

1单选题

在Python中,while循环的条件表达式可以是什么?

A只能是布尔值(True或False)
B可以是任意表达式,其值会被自动转换为布尔值
C只能是比较表达式
D只能是整数表达式
2单选题

以下代码运行后,输出什么? i=0 while i<5: if i==3: break print(i) i+=1

A0 1 2 3
B0 1 2
C0 1 2 3 4
D0 1 2 4
3判断题

在Python中,while循环体内可以包含if语句。正确还是错误?

4填空题
以下代码计算n的阶乘,请填空。
n = 5
result = 1
while n > 0:
    ___
    n -= 1
print(result)
5填空题
以下代码不断读入整数并累加,直到总和大于等于100时停止,请填空。
total = 0
num = int(input())
while total < 100:
    total += num
    ___
print(total)