数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
楼主: 白新岭

[原创]请教vfbpgyfk先生一个编程问题

  [复制链接]
 楼主| 发表于 2016-8-8 22:57 | 显示全部楼层
导出23中的8家村

*ALL表示所有记录
*NEXT(n)从当前记录起的N个记录
*RECORD(N)第N个记录
*REST从当前记录起到最后一条记录
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\放23中的8家村.dbf ALIAS 放23中的8家村
SELECT 2
USE  e:\用vfp求k生素数数量\升序代数数23.dbf ALIAS 升序代数数23
SELECT 3
USE E:\用vfp求k生素数数量\查询23中的8家村.dbf ALIAS 查询23中的8家村
DO WHILE NOT EOF()
        PUBLIC A
        A=代数23
        PUBLIC B
        B=recno()
        PUBLIC D
        COUNT NEXT 15 FOR 间距23=2 TO D
        IF D=8
           SELECT 查询23中的8家村
           APPEND BLANK
           REPLACE 在23中8 WITH A
           REPLACE 在23中的位置 WITH B
           SELECT 升序代数数23
        endif
    go B
    SKIP
ENDDO
CLEAR ALL
 楼主| 发表于 2016-8-8 23:00 | 显示全部楼层
二维表程序

* 请注意,外循环是初始值,即:从1到3,
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\生成初始值11.dbf ALIAS 生成初始值11
SELECT 2
USE F:\myvfp\学习vfp\生成初始值7.DBF ALIAS 生成初始值7
*INPUT "请输入外循环开始值 wxhks=" TO wxhks
*INPUT "请输入外循环结束值 wjs=" TO wjs
*INPUT "请输入内循环开始值 nks=" TO nks
*INPUT "请输入内循环结束值 njs=" TO njs
GO Top
FOR h=1 TO 3
        SELECT 生成初始值7
        FOR j=0 TO 10
                bpz=生成元7+j*210       &&注意这条语句中的“初始值”
                qmz=MOD(bpz,11)
                IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8
                ELSE
                        SELECT  生成初始值11
                        APPEND BLANK
                        REPLACE 生成元11 WITH bpz
                        SELECT 生成初始值7
                ENDIF
        ENDFOR
        SKIP
ENDFOR
CLEAR ALL                               
 楼主| 发表于 2016-8-8 23:02 | 显示全部楼层
获得10生数数据

CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\最密10生素数群.dbf ALIAS 最密10生素数 &&当每增倍一个素数周期就改成下一个表名(改成带下一个素数数字的表
SELECT 2
USE E:\用vfp求k生素数数量\素数表2.dbf ALIAS 素数表
SELECT 3
USE E:\用vfp求k生素数数量\k10生成初始值31.DBF ALIAS k10生成初始值31 &&同上
*INPUT "请输入外循环开始值 wxhks=" TO wxhks
*INPUT "请输入外循环结束值 wjs=" TO wjs
*INPUT "请输入内循环开始值 nks=" TO nks
*INPUT "请输入内循环结束值 njs=" TO njs
go Top
DO WHILE NOT EOF()
@ 2,5 say RECNO()
scy=初始值31+200560490130
                Kf=INT(SQRT(scy))                   &&求出被判断值的开方根
       SELECT 素数表                     &&打开素数表
       LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
       DO CASE
       CASE EOF()                          &&如果超出素数表最后一条记录
       GO BOTTOM
       CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
       SKIP -1
       ENDCASE
      SSS=RECNO()                         &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
      GO 11                                &&从第二条记录开始读取素数(37)
       FOR j=11 TO SSS                      &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
        qmz=MOD(scy,素数)                  &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
          IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 OR qmz=12 OR qmz=18 OR qmz=20 OR qmz=26 OR qmz=30 OR qmz=32
          EXIT         
                ENDIF
                SKIP                                &&素数表指针向下移动一个
           ENDFOR
        IF j>sss
                SELECT  最密10生素数                 &&打开保存求解结果的信息表
                APPEND BLANK                        &&增加一条空记录
        REPLACE 被判值 WITH scy            &&将被判断值保存到被判断值字段中(被判断值数据栏)
    ENDIF
        SELECT k10生成初始值31
        SKIP
ENDDO
CLEAR ALL
         
         
         
         
             
 楼主| 发表于 2016-8-8 23:05 | 显示全部楼层
那宝吉5生数产生

CLEAR
SELECT 1
USE E:\用vfp求k生素数数量\最密5生素数群.DBF ALIAS 最密5生素数
SELECT 2
USE E:\用vfp求k生素数数量\素数表2.DBF ALIAS 素数表
SELECT 3
USE E:\用vfp求k生素数数量\k5生成初始值23.DBF ALIAS k5生成初始值23
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
GO top                            &&***************这条语句是将“k8生成初始值31”表的指针移到“41001”处**************
FOR h=1 TO 290304                   &&注意,当复制此程序模版时一定把外循环次数改成工作区2打开表的总记录条数的值
@ 2,5 say h
SELECT k5生成初始值23
bpz=生成元23                        &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 素数表                     &&打开素数表
LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
DO CASE
CASE EOF()                          &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
SSS=RECNO()                         &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 11                               &&从第二条记录开始读取素数(37)
FOR j=11 TO SSS                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 OR qmz=12  
EXIT
*************根据您的解释(我认为是对的),应该把内循环外的保存语句,放到内循环中(前面的实践已经证明运行良好的程序)
ELSE                                &&因为符合条件,则做完相应工作后跳出内循环
SELECT  最密5生素数                 &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 外环值 WITH h               &&将外循环数值保存到外循环字段中(外循环数据栏)
REPLACE 被判值 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
REPLACE 开方根 WITH kf              &&将开方根保存到开方根字段中(开方根值数据栏)
SELECT k8生成初始值31
************结束保存(“*”号区内是移进来的保存信息语句部分)         
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
SKIP
ENDFOR
CLEAR ALL
 楼主| 发表于 2016-8-8 23:07 | 显示全部楼层
偶数素数对求法
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\偶数素数对.DBF ALIAS 偶数素数
SELECT 2
USE E:\用vfp求k生素数数量\素数表2.DBF ALIAS 素数表
SELECT 3
USE E:\用vfp求k生素数数量\偶数参考素数.DBF ALIAS 偶数参考
GO top                                    &&***************这条语句是将“k8生成初始值31”表的指针移到“41001”处**************
DO WHILE  参照元素<6000000                        &&*********既然是调用表中信息,而且是后部分,就应该使用“DO WHILE NOT EOF()”语句,由它来判断是否到文件尾**********
        czss=参照元素
        @ 2,5 say czss                      &&显示记录号
        bpz=12000000-czss                            &&计算被判断值
        Kf=INT(SQRT(bpz))                       &&求出被判断值的开方根
        SELECT 素数表                         &&打开素数表
        LOCATE FOR 素数>=kf                     &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()                          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()                             &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 1                                   &&从第二条记录开始读取素数(37)
        FOR j=1 TO SSS                         &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP                                &&素数表指针向下移动一个
        ENDFOR
        IF j>sss
                SELECT  偶数素数                 &&打开保存求解结果的信息表
                APPEND BLANK                        &&增加一条空记录
        REPLACE 大素数 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
                REPLACE 小素数 WITH czss            &&将开方根保存到开方根字段中(开方根值数据栏)
                REPLACE 偶数 WITH 12000000
        ENDIF
        SELECT 偶数参考
        SKIP
ENDDO
CLEAR ALL
 楼主| 发表于 2016-8-8 23:07 | 显示全部楼层
偶数素数对求法
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\偶数素数对.DBF ALIAS 偶数素数
SELECT 2
USE E:\用vfp求k生素数数量\素数表2.DBF ALIAS 素数表
SELECT 3
USE E:\用vfp求k生素数数量\偶数参考素数.DBF ALIAS 偶数参考
GO top                                    &&***************这条语句是将“k8生成初始值31”表的指针移到“41001”处**************
DO WHILE  参照元素<6000000                        &&*********既然是调用表中信息,而且是后部分,就应该使用“DO WHILE NOT EOF()”语句,由它来判断是否到文件尾**********
        czss=参照元素
        @ 2,5 say czss                      &&显示记录号
        bpz=12000000-czss                            &&计算被判断值
        Kf=INT(SQRT(bpz))                       &&求出被判断值的开方根
        SELECT 素数表                         &&打开素数表
        LOCATE FOR 素数>=kf                     &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()                          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()                             &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 1                                   &&从第二条记录开始读取素数(37)
        FOR j=1 TO SSS                         &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP                                &&素数表指针向下移动一个
        ENDFOR
        IF j>sss
                SELECT  偶数素数                 &&打开保存求解结果的信息表
                APPEND BLANK                        &&增加一条空记录
        REPLACE 大素数 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
                REPLACE 小素数 WITH czss            &&将开方根保存到开方根字段中(开方根值数据栏)
                REPLACE 偶数 WITH 12000000
        ENDIF
        SELECT 偶数参考
        SKIP
ENDDO
CLEAR ALL
 楼主| 发表于 2016-8-8 23:09 | 显示全部楼层
拼程序

*请先生检查一下,下边的程序是不是对k8生成初始值31表中的生成元31字段的值进行处理(判断是否符合条件,符合的保存,
*不符合的跳过执行下一个生成元31字段中的值),程序能正常运行,按概率估算应该是2万,3万个被判值中有1个符合要求的不会被筛掉,
*可是处理了23万,24万的被判值,没有一组符合要求,在最密8生素数群中一条记录也未存上?
CLEAR ALL
SELECT 1
USE f:\MYVFP\学习VFP\最密8生素数群.DBF ALIAS 最密8生素数
ZAP
SELECT 2
USE f:\MYVFP\学习VFP\新制素数表.DBF ALIAS 新制素数
SELECT 3
USE f:\MYVFP\学习VFP\k8生成初始值31.DBF ALIAS k8生成初始值31
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
GO 41001                                    &&***************这条语句是将“k8生成初始值31”表的指针移到“41001”处**************
*FOR h=1 TO 200000                          &&注意,当复制此程序模版时一定把外循环次数改成工作区2打开表的总记录条数的值
DO WHILE NOT EOF()                          &&*********既然是调用表中信息,而且是后部分,就应该使用“DO WHILE NOT EOF()”语句,由它来判断是否到文件尾**********
        @ 2,5 say RECNO()                       &&显示记录号
        bpz=生成元31                            &&计算被判断值
        Kf=INT(SQRT(bpz))                       &&求出被判断值的开方根
        SELECT 新制素数                         &&打开素数表
        LOCATE FOR 素数>=kf                     &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()                          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()                             &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 11                                   &&从第二条记录开始读取素数(37)
        FOR j=11 TO SSS                         &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0 OR qmz=6 OR qmz=8 OR qmz=14 OR qmz=18 OR qmz=20 OR qmz=24 OR qmz=26
                        EXIT         
                ENDIF
                SKIP                                &&素数表指针向下移动一个
        ENDFOR
        IF j>sss
                SELECT  最密8生素数                 &&打开保存求解结果的信息表
                APPEND BLANK                        &&增加一条空记录
*                REPLACE 外环值 WITH h               &&将外循环数值保存到外循环字段中(外循环数据栏)
                REPLACE 被判值 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
                REPLACE 开方根 WITH kf              &&将开方根保存到开方根字段中(开方根值数据栏)
                REPLACE 余数 WITH qmz
        ENDIF
        SELECT k8生成初始值31
        SKIP
*ENDFOR
ENDDO
CLEAR ALL
*由于我没有掌握表名称,只能随意地用一个,程序调通了。您按这个程序运行一下看看,结果如何,再联系。
 楼主| 发表于 2016-8-8 23:11 | 显示全部楼层
求升序代数数19中差距16的最小值

SELECT 1
USE e:\用vfp求k生素数数量\升序代数数19.dbf ALIAS 升序代数数19
    go 25
        PUBLIC A
        A=间隔16
    skip
    PUBLIC B
    B=间隔16
    PUBLIC  E
    if A>B
       E=B
     else
       E=A
    endif
    skip
   DO WHILE NOT EOF()
    PUBLIC C
    C=间隔16
    if E>C
       E=C
       else
       E=E
    endif
     skip
  ENDDO
?E
 楼主| 发表于 2016-8-8 23:13 | 显示全部楼层
实验间距13

USE  e:\用vfp求k生素数数量\k家村的间距.dbf
DO WHILE NOT EOF()
        SELECT k家村的间距
        PUBLIC B
        B=代数13
SKIP
PUBLIC A
A=代数13
C=A-B
REPLACE 间距13 WITH C
ENDDO
 楼主| 发表于 2016-8-8 23:14 | 显示全部楼层
填写间距23

USE  e:\用vfp求k生素数数量\升序代数数23.dbf
DO WHILE NOT EOF()
        SELECT 升序代数数23
        PUBLIC B
        B=代数23
SKIP
PUBLIC A
A=代数23
C=A-B
REPLACE 间距23 WITH C
ENDDO
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2025-5-13 04:07 , Processed in 0.093388 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表