若有如下程序段,其中 $s,a,b,c$ 均已定义为整型变量,且 $a,c$ 均已赋值 ($c$ 大于 $0$)。
s = a;
for (b = 1;b <= c; b++ )
s = s + 1;则与上述程序段修改 $s$ 值的功能等价的赋值语句是()。
这道题考循环累加的本质。拿到这种 for 循环,别被变量 b 晃眼,直接看循环体在算什么、循环跑了几趟。s 初始是 a,循环里每次 s 都加 1,一共跑了 c 次,所以最终就是 a 加上 c 个 1,直接写成 s = a + c 就对了。
最容易栽跟头的就是盯着循环变量 b 看,误以为循环结束后 b 等于 c,从而选 A。其实 b 在循环结束时已经自增了,等于 c+1,而且 b 只是计数器,跟 s 的累加过程没关系。另一个坑是 C 选项,看到 s = s + c 觉得是‘加 c 次’,但题目里 s 的初始值被重置成了 a,不是原来的 s,所以不能直接套用。记住,循环等价变换只看‘加了多少次’和‘每次加多少’,跟循环变量名无关。
这道题考查的是循环结构的等价变换,核心在于理解循环变量在循环结束后到底是多少,以及循环体执行了多少次。
在 C/C++ 等语言中,for (b = 1; b <= c; b++) 这个循环的完整流程是: 1. 初始化:把 b 设为 1。 2. 条件判断:检查 b 是否小于等于 c。 3. 循环体:如果条件成立,执行循环体(这里是 s = s + 1)。 4. 迭代:b 自增 1(b++)。 5. 回到步骤 2。
当循环结束时,意味着条件 b <= c 第一次不成立。因为 b 每次只加 1,所以循环结束时,b 的值一定是 c + 1。这是一个非常经典的陷阱,很多同学会直觉地认为循环结束时 b 等于 c,从而掉进坑里。
命题人特别喜欢在这种基础循环里挖坑,目的很明确:
for 循环,能否立刻反应出它等价于一个直接的赋值语句?这类题目在 NOIP 普及组初赛里出现频率不低,属于高频考点。从题库数据来看,循环结构总共考过 609 题,覆盖从 2008 年到 2026 年的所有年份(2008 年 7 题、2009 年 3 题、2010 年 3 题、2011 年 6 题、2012 年 5 题、2013 年 7 题、2014 年 8 题、2015 年 4 题、2016 年 12 题、2017 年 11 题、2018 年 13 题、2019 年 4 题、2022 年 1 题、2023 年 77 题、2024 年 128 题、2025 年 158 题、2026 年 161 题)。在分赛事分布上,GESP 二级考过 172 题,GESP 一级考过 139 题,NOIP 普及组初赛考过 56 题。这说明循环不仅是算法题的基础,也是初赛选择题的常客,尤其是 GESP 和 NOIP 普及组,必须熟练掌握。