数学中国

用户名  找回密码
 注册
帖子
热搜: 活动 交友 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
回复 支持 反对

使用道具 举报

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

本版积分规则

LaTEX预览输入 教程 符号库 加行内标签 加行间标签 
对应的 LaTEX 效果:

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

GMT+8, 2025-7-24 16:09 , Processed in 0.087355 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表
\frac{\square}{\square}\sqrt{\square}\square_{\baguet}^{\baguet}\overarc{\square}\ \dot{\baguet}\left(\square\right)\binom{\square}{\square}\begin{cases}\square\\\square\end{cases}\ \begin{bmatrix}\square&\square\\\square&\square\end{bmatrix}\to\Rightarrow\mapsto\alpha\ \theta\ \pi\times\div\pm\because\angle\ \infty
\frac{\square}{\square}\sqrt{\square}\sqrt[\baguet]{\square}\square_{\baguet}\square^{\baguet}\square_{\baguet}^{\baguet}\sum_{\baguet}^{\baguet}\prod_{\baguet}^{\baguet}\coprod_{\baguet}^{\baguet}\int_{\baguet}^{\baguet}\lim_{\baguet}\lim_{\baguet}^{\baguet}\bigcup_{\baguet}^{\baguet}\bigcap_{\baguet}^{\baguet}\bigwedge_{\baguet}^{\baguet}\bigvee_{\baguet}^{\baguet}
\underline{\square}\overline{\square}\overrightarrow{\square}\overleftarrow{\square}\overleftrightarrow{\square}\underrightarrow{\square}\underleftarrow{\square}\underleftrightarrow{\square}\dot{\baguet}\hat{\baguet}\vec{\baguet}\tilde{\baguet}
\left(\square\right)\left[\square\right]\left\{\square\right\}\left|\square\right|\left\langle\square\right\rangle\left\lVert\square\right\rVert\left\lfloor\square\right\rfloor\left\lceil\square\right\rceil\binom{\square}{\square}\boxed{\square}
\begin{cases}\square\\\square\end{cases}\begin{matrix}\square&\square\\\square&\square\end{matrix}\begin{pmatrix}\square&\square\\\square&\square\end{pmatrix}\begin{bmatrix}\square&\square\\\square&\square\end{bmatrix}\begin{Bmatrix}\square&\square\\\square&\square\end{Bmatrix}\begin{vmatrix}\square&\square\\\square&\square\end{vmatrix}\begin{Vmatrix}\square&\square\\\square&\square\end{Vmatrix}\begin{array}{l|l}\square&\square\\\hline\square&\square\end{array}
\to\gets\leftrightarrow\nearrow\searrow\downarrow\uparrow\updownarrow\swarrow\nwarrow\Leftarrow\Rightarrow\Leftrightarrow\rightharpoonup\rightharpoondown\impliedby\implies\Longleftrightarrow\leftharpoonup\leftharpoondown\longleftarrow\longrightarrow\longleftrightarrow\Uparrow\Downarrow\Updownarrow\hookleftarrow\hookrightarrow\mapsto
\alpha\beta\gamma\Gamma\delta\Delta\epsilon\varepsilon\zeta\eta\theta\Theta\iota\kappa\varkappa\lambda\Lambda\mu\nu\xi\Xi\pi\Pi\varpi\rho\varrho\sigma\Sigma\tau\upsilon\Upsilon\phi\Phi\varphi\chi\psi\Psi\omega\Omega\digamma\vartheta\varsigma\mathbb{C}\mathbb{H}\mathbb{N}\mathbb{P}\mathbb{Q}\mathbb{R}\mathbb{Z}\Re\Im\aleph\partial\nabla
\times\cdot\ast\div\pm\mp\circ\backslash\oplus\ominus\otimes\odot\bullet\varnothing\neq\equiv\not\equiv\sim\approx\simeq\cong\geq\leq\ll\gg\succ\prec\in\ni\cup\cap\subset\supset\not\subset\not\supset\notin\not\ni\subseteq\supseteq\nsubseteq\nsupseteq\sqsubset\sqsupset\sqsubseteq\sqsupseteq\sqcap\sqcup\wedge\vee\neg\forall\exists\nexists\uplus\bigsqcup\bigodot\bigotimes\bigoplus\biguplus\bigcap\bigcup\bigvee\bigwedge
\because\therefore\angle\parallel\perp\top\nparallel\measuredangle\sphericalangle\diamond\diamondsuit\doteq\propto\infty\bowtie\square\smile\frown\bigtriangledown\triangle\triangleleft\triangleright\bigcirc \wr\amalg\models\preceq\mid\nmid\vdash\dashv\nless\ngtr\ldots\cdots\vdots\ddots\surd\ell\flat\sharp\natural\wp\clubsuit\heartsuit\spadesuit\oint\lfloor\rfloor\lceil\rceil\lbrace\rbrace\lbrack\rbrack\vert\hbar\aleph\dagger\ddagger

MathQuill输入:

Latex代码输入: