循环结构

官方信息技术老师·12 页·深入(追求细节与边界)·0 次浏览·3 天前
边界陷阱跳出语义循环等价终止条件

循环结构

看清 for/while/do-while 的边界差异与跳出时机

按 空格/→ 演示下一步

1 / 12 页

全部页面点击任意一页,跳回舞台从这页播放

边界陷阱跳出语义循环等价终止条件

循环结构

看清 for/while/do-while 的边界差异与跳出时机

1第 1 页 · 循环结构

循环结构思维启发

上一页我们认识了循环长什么样,但更值得问的是:为什么编程语言要专门发明「循环」这个工具?答案藏在人类的本能里——重复是痛苦的,但结果是有用的。

自动化重复本能
人最讨厌做一模一样的事,循环把这个负担完全交给机器
不变式思维
每一轮循环里,什么必须保持不变——这是循环正确的核心证据
终止条件即边界
循环不是无限跑的,停止的那一刻定义了它能解决什么问题
迭代变量即推进器
每轮变化的那个量,决定了你离终点还有多远
可嵌套可组合
循环套循环是处理多维问题的标准武器
工厂流水线对应 →循环结构思维

每个工位做一件事,零件流过去到末端就是成品;工人不决定何时停,是传送带的计数信号决定

2第 2 页 · 循环结构思维启发

常用的三种循环语句

有了循环思维,还得落到具体语句。次数已知、未知、至少要执行一次——三种场景对应三种循环,怎么选才稳?

for 循环
计数明确:初始化、条件、迭代三件套集中在一行,循环次数已知时最清晰
while 循环
条件驱动:每次执行前先判断,条件一开始为假就一次都不执行
do-while 循环
先执行后判断:循环体至少跑一遍,再根据条件决定是否继续
选用思路
先问两个问题——次数确定吗?是否必须至少执行一次?答案直接指向该用哪个
跑步训练安排对应 →三种循环语句

计划跑10圈=for,跑到累了就停=while,至少先跑1圈再决定要不要继续=do-while

3第 3 页 · 常用的三种循环语句

循环嵌套

你已经能用 for 打印一排星星了。要打印 5×5 的方阵、遍历一个二维表格、枚举所有坐标对——单层循环已经不够用了。该让循环套循环上场。

嵌套定义
一个循环体内部再写一个完整的循环结构
执行节奏
外层每走一次,内层要完整跑完所有轮次
典型场景
二维数据、矩阵、表格、坐标枚举、排列组合
复杂度叠加
两层各 n 次总执行 n² 次,规模放大需警惕
楼栋号与房间号对应 →外层循环与内层循环

找 3 栋 502:外层先定位楼号,内层再遍历房间号

4第 4 页 · 循环嵌套

异常出口语句

你在长队里找人,找到后直接走人——不会再排下去。点名时发现有人请假,跳过他继续点下一个。这些「提前改变节奏」的操作,对应循环里的两个异常出口:break 和 continue。

break
立即终止当前循环,后续所有轮次都不再执行,程序从循环之后的代码继续
continue
提前结束本轮迭代,跳过本轮剩余语句,直接进入下一轮的条件判断
作用层级
默认只跳出当前所在的那一层循环;多层嵌套需配合标签或标志变量
典型用途
break 用于搜索命中后提前退出;continue 用于按条件过滤、跳过不合格项
流水线质检对应 →break / continue

发现严重缺陷,break 像整条线紧急停工;小瑕疵,continue 像本件返工,下一件接着过

5第 5 页 · 异常出口语句

循环结构趣味编程

我们已经熟练掌握了 for、while 和 break/continue 这些工具——接下来把它们组合起来,去解决一些有趣的问题:打印漂亮的图案、算复杂的数学、做个小游戏。循环的乐趣,恰恰藏在这些组合里。

趣味编程
把循环用到画图、游戏、数学等好玩的问题上,重在组合思路
图案生成
双层 for 嵌套:外层管行、内层管列,画出金字塔与空心菱形
数学经典
阶乘累乘、斐波那契递推、辗转相除求最大公约数
互动游戏
猜数字限 5 次机会,循环内嵌 if 判断与 break 跳出
边界陷阱
≤ 写成 <、起始值差一,导致结果少一行或多算一个元素
乐高搭金字塔对应 →双层循环画三角形

外层循环像搭一层新台阶,内层在这一层摆对应数量的方块

n!=1×2×3××nn! = 1 \times 2 \times 3 \times \cdots \times n
6第 6 页 · 循环结构趣味编程

循环结构常见问题解析

前面学了三种循环语句和异常出口,但写循环时总有几个坑反复出现:要么多跑一圈,要么根本停不下来。这一页专门拆解循环结构最常见的问题。

边界条件错误
多一或少一,常见于 < 与 <= 选错,或初始值与终止值差 1
死循环
循环条件永远为真,程序卡死在该位置无法退出
循环变量未更新
计数器或指针忘了自增或后移,导致条件永不改变
嵌套性能塌方
多层循环叠加,时间复杂度从 O(n) 暴增到 O(n²) 甚至更高
操场数圈跑对应 →循环边界控制

圈数对应当前计数;忘喊停就死循环,圈数算差就 off-by-one

7第 7 页 · 循环结构常见问题解析

程序硬件实验范例

前面我们写的循环都在屏幕里跑。把同样的逻辑搬到单片机上,循环就成了硬件的心跳——每转一圈就真实地读一次传感器、推一次电机。

硬件实验程序
在嵌入式设备上,通过 I/O 接口与传感器、电机等外设持续交互的程序
实时性约束
物理世界按物理时间走,循环节奏必须匹配采样和响应的物理窗口
三种典型模式
轮询循环、定时采样循环、有限状态机循环,对应不同交互节奏
易踩的边界
阻塞式 delay 会丢事件;ADC 采样有抖动;按键输入必须去抖动
工厂流水线的节拍对应 →单片机主循环

循环每转一圈=流水线一个节拍;IO 读写=工位动作;时序错位=产线拥堵

8第 8 页 · 程序硬件实验范例

二级C考点解析之循环语句

上页看了三种循环的「长相」,但考试考的从来不是长相——而是给你一段循环代码,问「执行几次」或「输出什么」。这一页专门拆解二级C里循环部分的常见考点。

先判 vs 后判
while/for 先判断后执行,条件一开始就假则 0 次;do-while 先执行后判断,至少执行 1 次
for 三段式
表达式1只在最初执行一次(初始化);表达式2是每次进入循环体前的判断;表达式3是每次循环体后的更新
次数推算
初值、终值、步长、边界含不含等号——四件事对齐才能算对;do-while 比同条件 while 多 1 次
中断与跳过
break 跳出本层整个循环;continue 跳过本次剩余进入下一轮判断;嵌套时只影响所在那一层
读程序技巧
干跑法:用表格记录每次循环的关键变量值,直到条件不满足——读程序题最稳的方法
数楼梯台阶数对应 →推算循环执行次数

起点(初值)、步长(每次+几)、终点(含不含等号),三件事对齐才数对——差一个就差一个台阶

次数终值初值步长(+1)\text{次数} \approx \left\lfloor \frac{\text{终值} - \text{初值}}{\text{步长}} \right\rfloor \quad (\leq \text{时}+1)
9第 9 页 · 二级C考点解析之循环语句

二级C考点解析之结构编程

前面我们专门啃下了循环语句这块硬骨头。但你有没有想过——为什么循环会和顺序、选择并称为三大结构?因为任何 C 程序本质上都是这三种结构的有机组合。

结构化核心思想
任意程序都可由顺序、选择、循环三种基本结构组合而成,这就是结构化程序设计的核心
三种基本结构
顺序:语句依次执行;选择:按条件分支;循环:重复执行某段代码
单入口单出口
每种结构只有一个入口和一个出口,执行路径清晰可追踪
混合嵌套运用
真实程序常是顺序中含选择、选择中含循环、循环中又含选择,层层嵌套
考试实战价值
二级 C 常把循环嵌在选择里、或选择嵌在循环里,考查综合阅读能力
搭乐高积木对应 →结构化程序设计

三种结构是三种基础积木,单入口单出口像卡扣只能按指定方向拼,模块化对应按图纸分步组装

10第 10 页 · 二级C考点解析之结构编程

本节要点

  • 三种循环本质等价,选型取决于判断时机与计数需求
  • break 与 continue 只作用于最近一层循环
  • 嵌套循环的时间复杂度是各层迭代次数的乘积
  • 死循环必须搭配 break 等显式出口
  • 差一错误(off-by-one)是循环头号 bug 来源
延伸主题:数组遍历与循环递归与循环的等价转换循环性能分析与优化
11第 11 页 · 本节要点

课后思考

先尝试自己回答,再展开参考答案;每道题都值得停一停。

1为什么需要 while、do-while、for 三种循环?只保留一种行不行?

参考答案三种循环适用场景不同:for 适合已知次数,while 适合条件驱动,do-while 保证至少执行一次。理论上它们可相互模拟,但语义表达力和代码可读性会显著下降。

2处理未知长度输入流直到遇到哨兵值,do-while 与 while 哪个更自然?为什么?

参考答案do-while 更自然。输入流至少要先读一次才能判断是否遇到哨兵,先判后读会让逻辑分叉;while 需预读或读—判—读结构,稍显笨拙。

3嵌套循环里 break 默认只能跳出一层;若想一次性跳出多层,常见思路有哪些?各自有什么代价?

参考答案两条路径:①外层加标志位、内层跳出置位、外层再判;②内层抽成函数靠 return 直接跳出。代价是多一次判读、丧失内联性;Java 带标签 break 是第三条路。

12第 12 页 · 课后思考