Pascal嵌套For循环计算结果不符,请求修正与解释
Pascal代码求和错误修正及原因分析
原代码
program exercise1; uses crt; var x,y,z,i,j,k,temp : integer; begin clrscr; write('input x: ');readln(x); write('input y: ');readln(y); write('input z: ');readln(z); for i:= 1 to x do { (1 x 1 x 1) = 1 and (2 x 2 x 2) = 8 } for j:= 2 to y do { (1 x 2 x 2) = 4 } for k:= 1 to z do { (1 x 1 x 1) = 1 and (1 x 1 x 2) = 2 } temp:= temp+(i*j*k); writeln(temp); { should be 14, but is 18 instead } readln; end.
问题说明
输入x=2、y=2、z=2时,程序输出18,但预期结果为14。
核心错误点
1. 变量temp未初始化
Pascal的局部变量默认没有初始值,temp的初始值是内存中的随机垃圾数据。你这次得到18是偶然情况(刚好初始值为0),但这是不可靠的,必须显式将temp初始化为0。
2. 嵌套循环的执行逻辑理解错误
你对嵌套循环的运行方式完全误解了:外层循环每走一次,内层循环就要完整执行一轮,不是每个循环只取一个值相加。原代码的循环实际会遍历所有符合条件的i,j,k组合:
- 当
i=1时,j只能取2(因为j:=2 to 2),然后k取1和2:- 121=2;122=4 → 这部分总和6
- 当
i=2时,j同样取2,k取1和2:- 221=4;222=8 → 这部分总和12
- 总求和6+12=18,这就是程序输出18的原因。
3. 匹配预期14的修正方案
你预期的14是2+4+8,对应三个特定项:1*1*2、1*2*2、2*2*2。以下是匹配该逻辑的修正代码:
program exercise1; uses crt; var x,y,z,i,j,k,temp : integer; begin clrscr; temp := 0; // 必须初始化求和变量 write('input x: ');readln(x); write('input y: ');readln(y); write('input z: ');readln(z); // 按预期的项累加 if x >=1 and y >=1 and z >=2 then temp := temp + 1*1*2; if x >=1 and y >=2 and z >=2 then temp := temp + 1*2*2; if x >=2 and y >=2 and z >=2 then temp := temp + 2*2*2; writeln(temp); // 输入x=2,y=2,z=2时输出14 readln; end.
如果你原本想让j从1开始,只累加k=2的项,也可以用循环实现:
program exercise1; uses crt; var x,y,z,i,j,k,temp : integer; begin clrscr; temp := 0; write('input x: ');readln(x); write('input y: ');readln(y); write('input z: ');readln(z); for i:= 1 to x do for j:= 1 to y do if z >=2 then // 只取k=2的情况 temp:= temp+(i*j*2); writeln(temp); // 输入x=2,y=2,z=2时输出14 readln; end.
内容的提问来源于stack exchange,提问作者zekaa
相关产品推荐
相关产品推荐

