我必须用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
。
是,您只能有一个NEXT
语句。而是使用IF .. THEN .. ELSE .. END IF
分支出两种计算类型。
2040 LET M = 0
2050 LET P = 3
2070 FOR i = 1 TO 50 STEP 2
2075 IF M <> 1 THEN
2080 P = P + 4/(I*(I+2)*(I+3))
2085 M = 1
2089 PRINT P
2090 ELSE
2100 P = P - 4/(I*(I+2)*(I+3))
2105 M = 0
2107 END IF
2109 PRINT P
2110 NEXT i
这里有两个问题。
第一个是由第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
我一直使用的生成PI的函数:
REM 4 * (1/1-1/3+1/5-1/7...)
REM 3.1415926
DEFDBL A-Z
L = 1
DO
X = X + 1 / L - 1 / (L + 2)
L = L + 4
P = 4 * X
PRINT P
LOOP
END