我必须在 BASIC 中编写 pi 的计算程序。为此,我使用 BASIC 的 FOR ... TO ... STEP
结构。
此外,我正在使用 2 个 NEXT
命令,最后一个失败了。看起来它只是在程序达到循环极限时才失败。
我的代码是这样的:
2040 LET M = 0
2050 LET P = 3
2070 FOR i = 1 TO 50 STEP 2
2075 IF M = 1 THEN 2100
2080 P = P + 4/(I*(I+2)*(I+3))
2085 M = 1
2089 PRINT P
2090 NEXT i
2100 P = P - 4/(I*(I+2)*(I+3))
2105 M = 0
2109 PRINT P
2110 NEXT i
预期结果是这样的列表:
3.2981943981943984
3.2994764494764497
3.2986049897814604
3.2992241848279003
3.2987685001616893
and so on...
我得到的错误(仅当 i
达到 50 时):
next without for in line 2110
或者,在另一个环境
E6 at 2110 FOR/NEXT error
我在网上找不到太多有用的文档,只有基本的FOR ... TO ... STEP ... NEXT
。
最佳答案
这里有两个问题。
第一个是由第 2075 行的(隐含的)GOTO 语句引起的。(用 Edsger Dijkstra 的话说,GOTO 语句是 considered harmful。)在您的 FOR 循环中,第 2080-2089 行和第 2100-2109 行交替出现在每次奇数和偶数迭代时执行。由于循环运行了奇数次(准确地说是 25 次),因此它会在到达第 2090 行的 NEXT I 语句时结束。之后,程序将执行到第 2100-2109 行,然后在第 2 行失败2110 当它在没有 FOR 循环处于事件状态时遇到 NEXT 语句。
更好的方法是使用 IF...THEN...ELSE 结构来控制 FOR 循环内的流程,或者简单地将 M 的值合并到计算中,例如,通过将 M 初始化为 4第 2040 行,第 2080 行用 M 替换 4,并用 M = -M 替换第 2085 行。这种方法还有一个优点,即 pi 的计算只发生 in one line而不是两个。
另一个问题是你的程序产生了错误的答案!看起来您正在使用 Nilakantha Somayaji 发现的无限级数计算 pi ,具体如下:
4 4 4
pi = 3 + ----- - ----- + ----- - ...
2.3.4 4.5.6 6.7.8
但在您的程序中,您计算的分母错误地为 1.3.4、3.5.6、5.7.8 等。这是一个建议的重写,应该会给您带来更好的结果:
1000 LET M = 4
1010 LET P = 3
1020 FOR I = 1 TO 50 STEP 2
1030 P = P + M / ((I+1)*(I+2)*(I+3))
1040 M = -M
1050 PRINT P
1060 NEXT I
关于loops - FOR/NEXT 带有多个下一个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58756249/