回 帖 发 新 帖 刷新版面

主题:[讨论]浅议for...next的用法(QB的越界4)

for i=a to b step c
...
next

相信每个人都会懂得如何去使用这个语句.
意思就是变量 i 的值从 a 到 b 步长为 c 的循环.
步长 c 是可以省略的,默认为1

说的是大家不一定能注意到的东西:

1.   a ,b ,c 的值是在第一次执行到 for 的时候就计算好了,
    你在之后改变这三个值对 for 的执行范围不会有改变.
    也就是 for 已经把这三个值复制到自己的口袋里去了.
    你不能改变别人口袋里的数值.

2.  你可以在循环体里改变 i 的值(作用很大)

3.   i 的越界
    (1) i 的值在第一次执行到 for 的时候赋值为起始值 a
    (2) 马上检查 c 的方向,按方向看有没有越过范围 b

    (3) 如果没有越界,就执行循环体
    (4) 运行到 next 后再回到 for 首

    (5) 加上增量 c ,再检查是否越界 b
    (6) 如果越界,跳过 next

可以看到,退出 for 循环体的时候 i 的值已经超出有效范围了,
这有什么用呢?
有用!
大家在求质数的时候,或者检查一个数是否在已有队列中的时候都能用到的.

function ZS%(x%)
  if x%<2 then exit function
  b%=sqr(x%)
  for i%=2 to b%
    if x% mod i% =0 then exit for
  next
  if i%>b% then ZS%=1
end function

在循环体里改变 i 的值也会经常用到的,
比如说这段时间里经常有人提一些问题
求一个数的平方(或立方)得数的尾部包含这个数.
还有什么水仙花数.

平方(或立方)后尾数依然的只有 0,1,5,6 这四个数.
当然,4,9可以满足立方的条件的.
先说平方:

deflng a-z
for i=1 to 100
  ii=i mod 10
  if ii=2 or ii=7 then i=i+3
  if (i*i) mod (10^(1+int(log(i)/log(10))))=i then print i,i*i
next

立方的:
deflng a-z
for i=1 to 100
  ii=i mod 10
  if ii=2 or ii=7 then i=i+2
  if (i*i*i) mod (10^(1+int(log(i)/log(10))))=i then print i,i*i*i
next

在这里的计算还不算太繁复,
节约的时间效率还不明显,
当后面的计算过程过多的时候就显得必要了.

上面的例子是跳过某个区间,就是改大了 i 的值.
还可以重复前面的某个区间.就是把 i 值改小,不用我多说了吧.

回复列表 (共1个回复)

沙发

老大,我加你。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册