使用FOR/NEXT语句易出现的问题和解决方法

🏠 首页 《无线电》杂志 1990年 🔗 第2期 🔗 第29页 分类:无线电技术自学经验交流 🔗 赵明星 🔗

在教学过程中,学生用循环结构编写求解S=1.1+2.2+3.3+4.4+5.5+6.6+7.7+8.8+9.9+11.0的计算程序,用了以下两种形式:

程序1

10 S=0

20 FOR I=1 TO 10

30 READ A

40 S=S+A

50 NEXT I

60 PRINT“S=”;S

80 DATA1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,11

RUN

S=60.5

程序2

10 S=0

20 FOR I=1.1 TO 11 STEP 1.1

30 G=S+I

40 NEXT I

50 PRINT“S=”;S

RUN

S=49.5

其中,程序1的运行结果是正确的,程序2的结果则是错误的。而程序2的编程方法并没有错,问题出在哪里呢?

为了说明问题,我们先在程序2中插入25行(见程序3),并运行之。

程序3

10 S=0

20 FOR I=1.1 TO 11 S TEP 1.1

25 PRINT“I=”;I,

30 S=S+I

40 NEXT I

50 PRINT“S=”;S

RUN

I=1.1 I=2.2 I=3.3

I=4.4 I=5.5 I=6.6

I=7.7 I=8.8 I=9.90000;

S=49.5

程序4

10 S=0

20 FOR I=1.1 TO 11 STEP 1.1

30 S=S+I

35 I=INT(I*10+0.1)/10

40 NEXT I

50 PRINT“S=”,S

RUN

S=60.5

很明显,循环到第9次时,循环变量I出现了正误差(I=9.900001),按照NEXT的执行过程,此时要用现有的I值(9.900001)再加上一个步长值(1.1),而后与终值进行比较。比较结果,I值超越了终值(11),程序便跳出循环,故得S=49.5。如将步长值减小(如改为0.2)运行程序,则I的输出值中将会同时出现正误差和负误差。究其原因,主要是由于机器采用二进制运算(浮点运算)而采用十进制显示所致。因此,用带小数的循环变量参与循环体内的计算时,必须采取某些对策才能使计算结果正确。这个对策是:在NEXT I语句前用取整函数先对I值的误差进行消除(见程序4中35行),即在取整前加上一个不影响!值精度的小数(本例取0.1)然后再运行程度4,共结果完全正确。(赵明星)