数学中国

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

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

  [复制链接]
 楼主| 发表于 2022-2-9 10:54 | 显示全部楼层
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE D:\三角递增法\各段四生素数个数.DBF ALIAS 四生个数表
SELECT 3
USE D:\三角递增法\偶数表.DBF ALIAS 偶数表
kssj=SECONDS()
  For i=2 to 2
       @ 5,12 say i
       FOR j=1 TO INT(i/2)
       SELECT 3
       DELETE ALL
       PACK
         SELECT  2     
         GO j
         zgs1=总个数
        fgs1=分个数
        SELECT  2
         GO i-j
         zgs2=总个数
        fgs2=分个数
           SELECT 1
            GO zgs1-fgs1+1
                FOR k1=1  TO  fgs1
                A=四中
               jl=recno()
                  SELECT  1
                  GO zgs2-fgs2+1
                  For k2=1 to fgs2
                  @ 15,22 say k2
                  B=四中
                 C=A+B
                  SELECT 3
                  APPEND BLANK   
                  REPLACE 偶数 WITH C   
                  SELECT 1
                  SKIP
                  ENDFOR
                SELECT 1
                GO jl+1
              ENDFOR
              Select A.* Into Table d:\三角递增法\偶数表升序j From 偶数表 A Inner Join (Select 偶数 From 偶数表 Group By 偶数 Having Count(*)=1) B On A.偶数=B.偶数
       ENDFOR
     ENDFOR
     =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是今天早晨制作的,不完善,不能应用。
原因就是,当内部主体循环完成后(最里的两层循环,主要是完成偶数表,即任意取两段数据进行组合),紧接着的语句是否可以完成使命,在手工操作时,把那条语句写好后,回撤,即可运行,获得一个新表,而且已经去重,每类偶数只留下一个代表。当第二层循环完,需要对新建的j个表,进行同样处理,即去重,留下唯一,完成后存一个结果表就OK了。最外层循环值,每一次循环都会得到一个处理好的表,里边都是单一记录,没有重复,是2亿区间段,能被合成的偶数,最后在用这些表找到不能合成的偶数即可。       
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-9 11:03 | 显示全部楼层
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE D:\三角递增法\各段四生素数个数.DBF ALIAS 四生个数表
SELECT 3
USE D:\三角递增法\偶数表新.DBF ALIAS 偶数表新
SELECT 4
USE D:\三角递增法\文件起名.DBF ALIAS 文件起名
kssj=SECONDS()
dimension  arr[50]
  For i=6 to 7
       @ 5,12 say i
       SELECT 4
       GO i-1
       arr[i-1]=文件名
       SELECT 3
        DELETE ALL
        PACK
        FOR j=1 TO INT(i/2)
         SELECT  2     
         GO j
         zgs1=总个数
        fgs1=分个数
        SELECT  2
         GO i-j
         zgs2=总个数
        fgs2=分个数
           SELECT 1
            GO zgs1-fgs1+1
                FOR k1=1  TO  fgs1
                A=四中
               jl=recno()
                  SELECT  1
                  GO zgs2-fgs2+1
                  For k2=1 to fgs2
                  @ 15,22 say k2
                  B=四中
                 C=A+B
                  SELECT 3
                  APPEND BLANK   
                  REPLACE 偶数 WITH C   
                  SELECT 1
                  SKIP
                  ENDFOR
                SELECT 1
                GO jl+1
              ENDFOR   
           ENDFOR
        SELECT 3
        GO 1
        select * from 偶数表新.dbf DISTINCT INTO table d:\三角递增法\"arr[i-1]".dbf
        CLOSE ALL Database
     ENDFOR
     =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个程序存在几处错误的地方:
第一,当程序运行完最内两层循环后,出现对话框,让选择打开数据库中的表,选择“偶数表新”后,新建表arr[i-1],不加文本号时,可以运行,但是表文件名就是它,并没有被文件起名表中的文件名代替,然后添加表时,说路径或文件名错误,打开文件夹,把名称手工改写成:偶数唯一表m后,可正常添加。
问题1,如何起个变量文件名,目的不让程序覆盖它。
第二,进入下一个循环时,提示:偶数表新已经在另一个工作区打开,所以不能执行,标记删除,到彻底删除记录那个步骤,程序不能正常执行下去。
问题2:如何知道一个表是否已经在其他工作区被打开了,或者在用某一个表时,提前关闭它(不管它是否在另一个工作区是否打开)。
    这是这个程序遇到的两个问题。
    希望得到大家的指导。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-9 11:05 | 显示全部楼层
本题就是化整为零。如果一次性处理50亿内的102949个数据,势必造成拥堵不堪,但是如果,我们把它划分成100份,或者1000份,那就可以轻装上阵,不用面面俱到,只处理部分,不处理整体,分散处理,比起集中处理要快的多,这个算法就是加两个数,看结果分布情况,对于现在的编程,和计算机技术来说,这是非常简单的事情。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-9 11:08 | 显示全部楼层
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE D:\三角递增法\各段四生素数个数.DBF ALIAS 四生个数表
SELECT 3
USE D:\三角递增法\偶数表新.DBF ALIAS 偶数表新
kssj=SECONDS()
bwjm="偶数唯一表"
  For i=16 to 17
       @ 5,12 say i
       wd=bwjm+ALLTRIM(STR(i-1))
        SELECT 3
        DELETE ALL
        PACK
        FOR j=1 TO INT(i/2)
         @ 15,22 say j
         SELECT  2     
         GO j
         zgs1=总个数
        fgs1=分个数
        SELECT  2
         GO i-j
         zgs2=总个数
        fgs2=分个数
           SELECT 1
            GO zgs1-fgs1+1
                FOR k1=1  TO  fgs1
                A=四中
               jl=recno()
                  SELECT  1
                  GO zgs2-fgs2+1
                  For k2=1 to fgs2
                  
                  B=四中
                 C=A+B
                  SELECT 3
                  APPEND BLANK   
                  REPLACE 偶数 WITH C   
                  SELECT 1
                  SKIP
                  ENDFOR
                SELECT 1
                GO jl+1
              ENDFOR   
           ENDFOR
        SELECT 3
        select * from 偶数表新.dbf DISTINCT INTO table d:\三角递增法\&wd.dbf
      
     ENDFOR
     =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个程序给建了个新表:偶数唯一表15dbf,看来,后缀不需要加。
另外就是:当内两层循环完成后,仍就有对话框,打开那个表。
进入,下一个循环时,提示:文件已在另一个工作区打开(所以,彻底删除语句不能执行)
在不断摸索,改进中,最终解决了问题,去重留唯一;用变量文件名,自动存表。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-9 11:13 | 显示全部楼层
vfbpgyfk 发表于 2022-2-9 08:22
抱歉,我已经很长时间没有查看邮箱了,恰好今天有事,到邮箱看了一下,才发现你的邮件。那请你把程序发给我 ...

在1304楼是程序最终结果,思路是:化整为零,分段计算,去重留一,自动存表,最后获得数据。
此法稍作改变,可以求偶数的素数对(仍就是化整为零的方法),把去重改成统计相同记录条数,最后做并表处理。
回复 支持 反对

使用道具 举报

发表于 2022-2-9 15:23 | 显示全部楼层
1304楼的三个表结构都是什么?建立起来好模拟运行程序。

点评

因为数据在硬盘上,我原来在内蒙古太仆寺旗,现在在家乡曲阳县,需要在移动硬盘找一下。  发表于 2022-2-10 09:07
一个是四生素数的中项,一个是四生素数的中项不同范围段的统计数(即中项的个数),偶数表是过程表,打包后发在这里。  发表于 2022-2-9 16:03
回复 支持 反对

使用道具 举报

发表于 2022-2-9 16:22 | 显示全部楼层
截止2022年2月9日周三16:26分农历正月初九,热度68,回复1314,浏览量45958.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-10 21:24 | 显示全部楼层
SELECT 1
USE g:\一加m问题\二生素数d52.DBF ALIAS 二素中表
SELECT 3
USE g:\一加m问题\偶数表.DBF ALIAS 偶数表

kssj=SECONDS()
bwjm="偶数周期表二中自加d52"

For i=1 TO 1
       @ 5,12 say i
       wd=bwjm+ALLTRIM(STR(i))
           SELECT 3
           DELETE ALL
           PACK      
           SELECT 1
            GO 1
                FOR k1=1  TO  1309
                @ 15,22 say k1
                A=二素52
               jl1=recno()
                  SELECT  1
                  GO 1
                  For k2=1 to 1309
                  jl2=recno()
                  B=二素52
                 C=A+B
                  SELECT 3
                  APPEND BLANK   
                  REPLACE 偶数 WITH C   
                  SELECT 1
                  GO jl2+1
                  ENDFOR
                SELECT 1
                GO jl1+1
              ENDFOR   
         
        SELECT 3
        USE IN 3&&打开,或关闭,那个工作区(或者,写别名)
      
       USE g:\一加m问题\偶数表.dbf && 设源表的名称为"表1"
       P=''
       FOR K=1 TO FCOUNT()
       P=P+IIF(EMPTY(P),'',',')+FIELDS(K)&& 取得表中所有字段名称,放在P中
      ENDFOR

       SELECT *,COUNT(FIELDS(1)) AS 相同记录数 FROM DBF() GROUP BY &P. INTO DBF g:\一加m问题\&wd
        
       USE IN &wd
      
     ENDFOR
     =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

发表于 2022-2-11 23:46 | 显示全部楼层
读了几天你写的程序,可能是因为不能运行,理解起来有些费劲。那就先把比较简单直观的基本常识性方法和概念冒犯地说几点。
1、打开或进入表可以用序号,也可以用标识。也就是说,如果用了【SELECT+序号】的话,就没有必要写上标识【ALIAS+标识】,可以直接用【SELECT+标识】那么,开始打开表的语句前就不必写【SELECT+序号】例如:
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
就可以直接写:
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
当在程序用到此表时,就直接写:
SELECT 四中表
这样写法方便于读程序,能直接知道下面是要用哪个表。
2、如果想删除表中所有记录,可以用【ZAP】命令。要比用【DELETE ALL,加PACK】简单。
3、可能是没有完全读懂程序的原因,四层循环五个表,是否把需要解决的问题复杂化了?(只是粗浅想法)
4、如果每个表的结构和相关记录建立不起来,程序就无法试运行,那就不能发现问题所在,程序就不能改动了。

点评

四层循环五个表,问题是否复杂化需要给先生数据后,可判断,届时把处理问题思路叙述给您,你看能不能优化。整个问题有点复杂,我是把五六个程序合并到一起的,还有最后的两个程序未合并进去(或许不简化的原因)  发表于 2022-2-12 09:41
那先生1、2、建议很好,以前没有考虑这些(实际上自己根本就不知道其用处)  发表于 2022-2-12 09:36
回复 支持 反对

使用道具 举报

发表于 2022-2-12 07:16 | 显示全部楼层
本帖最后由 vfbpgyfk 于 2022-2-12 11:23 编辑

我的思路是:如果只是为了排除重复的相同数值偶数,是否可以这样做:
1、把所有需要判别的偶数集中到一个表中;
2、FOR  i=1  TO RECCOUNT()-1
3、GO i
4、A=偶数
5、FOR j=i+1 TO  RECCOUNT()
6、GO j
7、IF 偶数=A
8、DELETE
9、ENDIF
10、ENDFOR
11、ENDFOR
12、PACK
至此,全部完成唯一偶数判断和选定。
*****************************
若此法可行,是否可以将你的那种四层循环和五个表的程序简化一下?

点评

这种当然可以。vfp自带的查询语句运算更快捷。  发表于 2022-2-12 09:42
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-13 03:51 , Processed in 0.087418 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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