| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
ADSL如何秒变专线,公网IP盒子了解一下千里之行 始于足下
共有 486 人关注过本帖
标题:问什么不执行最外层循环
只看楼主 加入收藏
独木星空
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2016-6-29
  问题点数:0  回复次数:7   
问什么不执行最外层循环
CLEAR ALL
SELECT 1
USE c:\visualfoxpro项目\素数表万.DBF ALIAS 万素
SELECT 2
USE c:\visualfoxpro项目\素数生成元.DBF ALIAS 生成元
SELECT 3
USE c:\visualfoxpro项目\素数62个周期.DBF ALIAS 素数62周
    kssj=SECONDS()                      &&取出开始时间
   For N=1 to 2
        SELECT 生成元
        DO WHILE NOT EOF()
            bpz=素数式+N*510510
            Kf=INT(SQRT(bpz))       &&求出奇数的开方根
            SELECT  万素             &&打开素数表
            LOCATE FOR 素数万>=kf      &&根据开方根,查找最大素数
            DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数万>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
            ENDCASE
            SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
            GO 1           &&从第一条记录开始读取素数(3)
            FOR j=1 TO SSS       &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数万)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF j>sss
                SELECT  素数62周       &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 素数 WITH bpz            &&将N值付给素数
          ENDIF
         SELECT  生成元
        skip
       ENDdo
   endfor
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL

开始时,我是把N=0 TO 1,仅仅是执行了一次循环,用时10分36.02秒,我认为是把初始值赋0的原因;当第二次用N=1 TO 2 时,还是仅完成了一次循环,用了N=1的值,没有N=2的情况,可用时是20分25.83秒,是原来的一倍,问什么不是循环2次呢?(在结果表中没有N=2的素数值)
搜索更多相关主题的帖子: 循环 SELECT 素数 开方 记录 
2019-03-01 16:48
独木星空
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2016-6-29
  得分:0 
我把N=2 to 4又试一下,还是仅执行了一次(只执行了N=2的情况),没有再进入下一个循环,用时17分19.07秒,到底如何更正才能完成外循环语句呢?

[此贴子已经被作者于2019-3-1 17:34编辑过]

2019-03-01 17:33
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:96
帖 子:2617
专家分:6491
注 册:2015-3-25
  得分:0 
你想做什么,把你的数据,和你的算法说出来。
2019-03-01 23:29
独木星空
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2016-6-29
  得分:0 
我想用10000内的素数表制作3165万内的素数表,最内层的语句就是判断一个数是不是素数,从里往外的第二层嵌套是调取已经制作好能产生素数的序列(有不被2,3,5,7,11,13,17整除的数构成,其范围是从1到510509之间,不是每个奇数,共有92160个数据,步长是510510,即不被整除的素数积),最外一层嵌套是让程序每次完成多少个周期,一个周期是510510,有n*510510+生成元(它是已经制作好的表,放着92160个整数,它们有共同的性质,都不能整除素数2,3,5,7,11,13,17)

不知道我把问题是否说清楚了。
2019-03-02 09:17
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:359
帖 子:11444
专家分:42649
注 册:2006-5-13
  得分:0 
你的最外循环(for N =1 to 2)仅仅是重复执行了一次,其他数据并没有任何变动,本身逻辑上就存在问题。从代码上看应该是循环了两次再出现提示(MessageBox)的,你根据什么判定没有执行最外的循环呢?

活到老,学到老! http://www. E-mail:hu-jj@
2019-03-02 10:26
独木星空
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2016-6-29
  得分:0 
从新产生的素数可以看出仅执行了一次外循环,没有再执行剩下的外循环,因为我改了,初始值和终值,结果都是初始值执行了(从运行结果可以看出来,不是运行时间上),如改成for N=2 to 4 后仍就是执行了N=2的情况,N=3和N=4的都没有执行。
2019-03-02 12:32
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:359
帖 子:11444
专家分:42649
注 册:2006-5-13
  得分:0 
以下是引用独木星空在2019-3-2 12:32:02的发言:

从新产生的素数可以看出仅执行了一次外循环,没有再执行剩下的外循环,因为我改了,初始值和终值,结果都是初始值执行了(从运行结果可以看出来,不是运行时间上),如改成for N=2 to 4 后仍就是执行了N=2的情况,N=3和N=4的都没有执行。

你不妨在enddo和endfor之间插入一个messagebox()来显示N值,就会清楚地看到是执行了几次。

活到老,学到老! http://www. E-mail:hu-jj@
2019-03-02 17:45
独木星空
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2016-6-29
  得分:0 
知道原因了,在选择工作区后,没有把指针移到表头,在进入第一次外循环时,打开的表,指针默认是第一条记录,而当执行第二次外循环时,指针还在表尾,所以条件已经达到,就没有执行,同样其它的外循环都没有执行,不知时间问什么增大了,也可能与数的增大有关,数越大调取的素数表中的记录越多,在这个语句之后SELECT 生成元
加一条go 1的语句,让指针从新回到表头。
2019-03-02 22:29
快速回复:问什么不执行最外层循环
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026869 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved