练习
学完本章你应该掌握
- 能根据场景选择传统
for、while模式、do-while模式和for range。 - 能使用循环完成计数、累加、累乘、筛选、查找等基础任务,并写对条件边界。
- 能遍历切片与 map,正确处理索引、键值以及 map 遍历顺序不固定的特点。
- 能使用
break和continue改变循环流程,并识别由更新语句遗漏带来的死循环问题。 - 能在循环中结合输入、判断、切片、map 写出更完整的控制台小程序。
- 能把
for的知识迁移到数据统计、菜单交互、重复录入、倒计时等常见场景。
简单
第 1 题:打印 1 到 5 并求和
编写一个 Go 程序,完成下面要求:
- 使用传统
for循环 - 依次输出
1到5 - 再输出它们的总和
示例输出:
| |
查看参考答案
| |
说明:这道题的重点是把“循环次数已知”的场景写成熟悉的 for 初始化; 条件; 后置操作 结构。
第 2 题:补全倒序偶数循环
补全下面代码中的空白,让程序输出:
| |
| |
查看参考答案
补全后的代码如下:
| |
说明:这道题练的是“倒序循环”和“步长不一定是 1”。后置操作除了 i++,也可以写成 i--、i += 2、i -= 2。
第 3 题:用 while 模式计算阶乘
编写一个程序:
- 读取一个正整数
n - 使用
while模式,也就是for 条件 {}的写法 - 计算
n! - 输出结果
例如输入:
| |
输出:
| |
查看参考答案
| |
说明:for n > 0 {} 就是 Go 里的 while 模式。循环变量的更新要写在循环体里,否则很容易变成死循环。
第 4 题:用 do-while 模式打印倒计时
请使用 for {} + break 模拟 do-while 模式,完成下面任务:
- 定义
count := 3 - 每轮先输出
count - 再让
count-- - 当
count == 0时结束循环
输出结果应为:
| |
查看参考答案
| |
说明:这道题的关键不是“打印倒计时”,而是体会 do-while 模式的顺序是“先执行一次,再判断要不要退出”。
第 5 题:修正 continue 造成的死循环
下面程序的目标是输出:
| |
但它现在会卡住。请改正后让它正常结束。
| |
查看参考答案
修正后的代码:
| |
原因说明:
- 当
i == 3时,程序会直接执行continue - 原代码里的
i++在continue后面,所以这一轮不会执行 i一直停在3,循环条件始终成立,于是程序陷入死循环
一般
第 6 题:遍历切片输出编号和名称
已知下面这个切片:
| |
请使用 for range 输出:
| |
查看参考答案
| |
说明:遍历切片时,range 返回的是索引和值。如果想把编号显示成“第 1 个”,记得把索引加 1。
第 7 题:统计 1 到 n 中 3 的倍数
编写一个程序,完成下面要求:
- 读取一个整数
n - 如果
n <= 0,输出n 必须大于 0 - 否则统计
1 ~ n之间能被3整除的数字个数和总和 - 最后输出
count=...和total=...
例如输入:
| |
输出:
| |
查看参考答案
| |
说明:这道题把循环和条件判断放到了一起,是最常见的“边遍历、边筛选、边统计”写法。
第 8 题:统计成绩切片的总分、平均分和及格人数
已知下面这个成绩切片:
| |
请编写程序,完成下面要求:
- 使用
for range遍历切片 - 计算总分
total - 计算平均分
avg,保留 1 位小数 - 统计及格人数
passCount,及格线是60
示例输出:
| |
查看参考答案
| |
说明:这道题虽然主角是 for range,但想把平均分算对,仍然需要用到前面学过的类型转换。
第 9 题:遍历 map 输出高价商品
已知下面这个商品价格表:
| |
请编写程序,完成下面要求:
- 使用
for range遍历这个 map - 只输出价格大于等于
30的商品 - 同时统计这类商品的数量
count - 再统计它们的总价
total
一种可能的输出结果:
| |
查看参考答案
| |
说明:前面几行商品输出的顺序不固定,因为 map 的遍历顺序本来就不保证一致。只要统计结果正确即可。
第 10 题:用 break 找到第一个及格分数
已知下面这个切片:
| |
请编写程序,完成下面要求:
- 遍历切片
- 找到第一个大于等于
60的分数 - 输出它的下标和分数
- 找到后立即结束循环
- 如果整个切片里都没有及格分数,输出
未找到及格分数
示例输出:
| |
查看参考答案
| |
说明:break 很适合“找到就停”的场景。它能避免无意义地继续遍历后面的元素。
进阶
下面三题会把 01-05 单元里的输入、判断、切片、map 和 for 一起用起来,更接近真实的控制台程序。
第 11 题:编写一个循环菜单
请编写一个程序,完成下面要求:
- 先准备一个成绩切片:
| |
- 使用
for {}做一个循环菜单 - 每轮提示用户输入一个选项:
1表示输出总分2表示输出及格人数0表示退出程序 - 其他输入输出
无效选项 - 菜单要能重复使用,直到用户输入
0 - 选项分流要求使用
switch
查看参考答案
| |
说明:这道题会把死循环、switch、切片遍历和统计逻辑连在一起,是一个很典型的“控制台菜单”场景。
第 12 题:使用死循环做 5 秒倒计时
请编写一个程序,完成下面要求:
- 使用
for {}创建死循环 - 从
5开始倒计时 - 每秒输出一个数字
- 输出顺序是
5、4、3、2、1 - 倒计时结束后输出
开始
要求:
- 使用
time.Sleep(1 * time.Second)控制每轮间隔 - 倒计时结束时要主动跳出循环
查看参考答案
| |
说明:for {} 会一直循环,所以必须自己设计退出条件。time.Sleep 用来让程序暂停 1 秒,避免一瞬间把所有数字都打印完。
第 13 题:录入成绩直到输入 -1
请编写一个程序,完成下面要求:
- 不断读取用户输入的成绩
- 如果输入
-1,结束录入 - 如果分数小于
0或大于100,输出分数无效,已跳过,并继续下一轮 - 对有效成绩统计人数
count、总分total - 最后输出平均分
avg,保留 1 位小数 - 如果用户没有输入任何有效成绩,输出
没有有效成绩
示例交互可以类似这样:
| |
查看参考答案
| |
说明:这道题是本章很有代表性的综合题。for {} 负责反复读取,break 负责结束录入,continue 负责跳过非法数据,最后再做一次统计输出。