| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1549 人关注过本帖
标题:不知何缘故程序执行几次就卡住了
只看楼主 加入收藏
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:801
专家分:683
注 册:2016-6-29
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:8 
不知何缘故程序执行几次就卡住了
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\二生素数中项合成\偶数的素数对.DBF ALIAS 偶数素数对
SELECT 2
USE D:\二生素数中项合成\二生L24中项.DBF  ALIAS 广孪中表
kssj=SECONDS()
FOR i=199801 to 200001
@ 3,6 say i
       X=2*i
          Y=X/2   
          s=0
        SELECT 2
        LOCATE FOR 二24中>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 二24中>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=二24中
                GO xjl
                xss=二24中
                IF xss=<Y OR dss>=Y                        
                          t=.T.
                          ELSE
                          t=.F.                                      
                ENDIF                                               
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                               s=s+1
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>=Y OR dss=<Y
        SELECT 1
        APPEND BLANK
        REPLACE 偶数 WITH X
        REPLACE 素数对 WITH s
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个程序是:先搜寻最大值位置(与所求的偶数比较),记下指针位置,然后从两头往中心移动,当正好大小值之和是所求偶数值时,s累加一次,直到大值小于中值,或小值大于中值,就结束循环,然后填写偶数及s值。
问题是:程序外循环运行几次就卡住不往下进行了。
如果加上i=i+1时,偶数是间隔的(主要是这时也不能很好完成外循环,也出现卡顿现象;在去掉i=i+1,碰运气可以完成全部外循环,但是10次9次失败)。
搜索更多相关主题的帖子: 偶数 CASE SELECT 循环 素数 
2021-07-14 09:33
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:41
帖 子:763
专家分:2503
注 册:2011-5-8
收藏
得分:0 
表放上来,最起码表结构放上来。

dBase有人接盘了。
2021-07-14 09:37
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1063
专家分:2579
注 册:2015-12-30
收藏
得分:0 
死循环了吧,程序中加上变量值的显示看看当时什么情况
2021-07-14 10:36
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:801
专家分:683
注 册:2016-6-29
收藏
得分:0 
二生l24中项副表.zip (32.66 KB)
偶数的素数对副表.zip (671 Bytes)

这是用到的两个表,改回表名,改写路径,就可以尝试运行了

素数问题的解决是我学习编程永恒的动力。
2021-07-14 10:44
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:801
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 3楼 laowan001
死循环,肯定不假。但是那里出了问题,进入了无休止的循环过程。有时它能正常运行(以前偶数较小时,很容易出现这种状况,后来就把初始值偶数加大了,小范围的不用此程序计算,而是在Excel中获得数据)。

素数问题的解决是我学习编程永恒的动力。
2021-07-14 10:49
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9799
专家分:26886
注 册:2012-2-5
收藏
得分:0 
这个程序是:先搜寻最大值位置(与所求的偶数比较),记下指针位置,然后从两头往中心移动,当正好大小值之和是所求偶数值时,s累加一次,直到大值小于中值,或小值大于中值,就结束循环,然后填写偶数及s值。

不明白什么意思

坚守VFP最后的阵地
2021-07-14 11:02
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:801
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 6楼 sdta
一个放着参与运算的数,一个表放着运算结果。即x+y=2n,x,y是表中的数,求2n对应着几组解(这个程序暗含x小于等于y)。你可以设计一个程序,算一算2n有多少组解即可,x,y的取值范围在100万以内,是表中的记录值即可。

素数问题的解决是我学习编程永恒的动力。
2021-07-14 12:33
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:41
帖 子:763
专家分:2503
注 册:2011-5-8
收藏
得分:15 
Local xjl,djl,ts,xss,dss,kssj,tj
CLEAR
CLOSE TABLES all
Select 1
Use 偶数的素数对.Dbf Alias 偶数素数对
Select 2
Use 二生L24中项.Dbf Alias 广孪中表
kssj=Seconds()
For i=199801 To 200001  &&i 是多余的。用y就可以了
    Wait Transform(i) Window At 3,6 Nowait
    y=i
    X=2*i
* Y=X/2
    s=0
    Select 2
    Locate For 二24中>X
*!*     DO CASE
*!*     CASE EOF()
*!*     GO Bottom &&已经eof()了,就是BOttom了
*!*     CASE 二24中>X
*!*     SKIP -1
*!*     ENDCASE
**改为
    If Found()
        Skip -1
    Endif
    xjl=1
    djl=Recno()
    T=.T.
    Do While T
        dss=二24中
        Go xjl
        xss=二24中
*!*     IF xss=<Y OR dss>=Y
*!*     t=.T. &&多余本来就是.t.,如果不是,就退出Do While了
*!*     ELSE
*!*     t=.F.
*!*     ENDIF
**改为
        If XSS>Y And dss<Y
            T=.F.
        ENDIF
**死循环就是这一条件当i=199819时永无法满足。
        Do Case
            Case xss+dss>X
                Go djl
                Skip -1
                djl=Recno()
            Case xss+dss=X
                s=s+1
            Case xss+dss<X
                Go xjl
                Skip
                xjl=Recno()
                Go djl
        Endcase
    Enddo
    If xss>=Y Or dss=<Y   &&这一条件永远不会成立,因为只有它不成立时,才能退出do while循环。
        Select 1
        Append Blank
        Replace 偶数 With X
        Replace 素数对 With s
    Endif
Endfor
=Messagebox("运行时间:"+Ltrim(Str(Int((Seconds()-kssj)/60)))+"分"+Ltrim(Str(Mod(Seconds()-kssj,60),5,2))+"秒",64,"运行时间提示")


[此贴子已经被作者于2021-7-14 15:32编辑过]


dBase有人接盘了。
2021-07-14 15:27
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:801
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 8楼 xuminxz
Local xjl,djl,ts,xss,dss,kssj,tj
CLEAR
CLOSE TABLES all
Select 1
Use D:\二生素数中项合成\偶数的素数对.Dbf Alias 偶数素数对
Select 2
Use D:\二生素数中项合成\二生L24中项.Dbf Alias 广孪中表
kssj=Seconds()
For i=199801 To 200001  &&i 是多余的。用y就可以了
    Wait Transform(i) Window At 3,6 Nowait
    y=i
    X=2*i
* Y=X/2
    s=0
    Select 2
    Locate For 二24中>X
*!*     DO CASE
*!*     CASE EOF()
*!*     GO Bottom &&已经eof()了,就是BOttom了
*!*     CASE 二24中>X
*!*     SKIP -1
*!*     ENDCASE
**改为
    If Found()
        Skip -1
    Endif
    xjl=1
    djl=Recno()
    T=.T.
    Do While T
        dss=二24中
        Go xjl
        xss=二24中
*!*     IF xss=<Y OR dss>=Y
*!*     t=.T. &&多余本来就是.t.,如果不是,就退出Do While了
*!*     ELSE
*!*     t=.F.
*!*     ENDIF
**改为
        If XSS>Y-1 And dss<Y+1
            T=.F.
        ENDIF
**死循环就是这一条件当i=199819时永无法满足。
        Do Case
            Case xss+dss>X
                Go djl
                Skip -1
                djl=Recno()
            Case xss+dss=X
                s=s+1
            Case xss+dss<X
                Go xjl
                Skip
                xjl=Recno()
                Go djl
        Endcase
    Enddo
   && If xss>=Y Or dss=<Y   这一条件永远不会成立,因为只有它不成立时,才能退出do while循环。
        Select 1
        Append Blank
        Replace 偶数 With X
        Replace 素数对 With s
   && Endif
Endfor
=Messagebox("运行时间:"+Ltrim(Str(Int((Seconds()-kssj)/60)))+"分"+Ltrim(Str(Mod(Seconds()-kssj,60),5,2))+"秒",64,"运行时间提示")
在xuminxz先生的帮助下,问题已经解决。稍微改了下条件,因为当偶数的一半正好是二生L24中项时,条件不满足,会进入死循环(这也是有时可以完成任务,有时会执行几次外循环就停止的原因)。

素数问题的解决是我学习编程永恒的动力。
2021-07-14 17:28
快速回复:不知何缘故程序执行几次就卡住了
数据加载中...
 
   



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

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