下列程序中,正确计算 $1, 2,\dots, 100$ 这 $100$ 个自然数之和 $sum$(初始值为 $0$)的是( )。
这题就是考循环结构的执行顺序和条件判断时机。拿到题先别急着看代码,脑子里过一遍:for是'先判后做',while也是'先判后做',do-while是'先做一次再判'。把i=1代入每个循环的初始条件,看能不能进,进几次,就能秒杀。
最容易栽跟头的就是do-while的'至少执行一次'特性。很多学生看到while(i>100)条件不满足就以为循环一次都不跑,却忘了do-while是先干后看,哪怕条件一开始就是假,它也会先执行一次循环体。选项D就是典型陷阱,初始i=1,条件i>100直接为假,循环体只执行一次(sum=1),完全不符合题意。另外,多选题里B选项while(i>100)初始就假,一次都不进,学生容易误以为'没进循环所以没出错',其实sum根本没加任何数,这也是个坑。
这道题考查的是循环结构的基本执行流程,属于信息学竞赛中最基础但也最易被忽视的细节。命题人喜欢在这里挖坑,特别是把for、while、do-while混在一起考,看学生是否真正理解它们的区别。
首先,咱们把知识点捋清楚:
带着这个框架,咱们逐项分析: A选项:for(i=1; i<=100; i++) sum+=i; 初始i=1,满足i<=100,进入循环累加,i一步步到100,最后判断i=101时退出。完美覆盖1到100,正确。 B选项:i=1; while(i>100) { sum+=i; i++; } 初始i=1,条件i>100直接为假,循环体一次都不执行,sum还是0。错误。 C选项:i=1; do { sum+=i; i++; } while(i<=100); 先执行一次:sum=1, i=2;然后判断i<=100成立,继续;直到i=101时判断失败退出。覆盖了1到100,正确。 D选项:i=1; do { sum+=i; i++; } while(i>100); 先执行一次:sum=1, i=2;然后判断i>100,2>100为假,直接退出。只执行了一次,sum=1。错误。
所以正确答案是A和C。
这里有个快速验证技巧:把100换成2,手算一遍。A:1+2=3,对;B:i=1>2假,sum=0,错;C:先加1得1,i=2,判断2<=2真,再加2得3,i=3,判断3<=2假,退出,对;D:先加1得1,i=2,判断2>2假,退出,错。这样一验,选项AC就跳出来了,而且能帮你理解为什么D只执行一次。
考试时遇到这类题,千万别被代码长度吓到,核心就是看循环的'入口条件'和'出口条件'。do-while的'先做后判'是最大陷阱,务必记住。