| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2366 人关注过本帖, 3 人收藏
标题:编程技巧擂台赛[四]
只看楼主 加入收藏
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
S版不是要最优方案吗?所以大家就不停地优化算法喽。实际编程应用时,这种情况有很多做法,但是做题目就不一样了。
2013-01-03 08:39
stone1930
Rank: 1
等 级:新手上路
帖 子:12
专家分:1
注 册:2012-11-30
收藏
得分:0 
学习学习真好
2013-01-03 10:32
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9803
专家分:26906
注 册:2012-2-5
收藏
得分:0 
个人认为,优化算法,本着简单易懂的原则,不要一味追求一句代码,表面看是一句代码,实际上有十几行甚至几十行,这种算法,我认为不是最优的算法。

坚守VFP最后的阵地
2013-01-03 22:13
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9803
专家分:26906
注 册:2012-2-5
收藏
得分:0 
这是一个初学VFP的网友在实际工作中遇到的问题,我当时给了一段代码给他,后来我发现这段代码的优点是运行速度很快,缺点是思路不是太好,现贴上这段代码:
程序代码:
CLOSE DATABASE
SELECT ksh,性别,必考项目 AS 考试内容,必考项目数 AS 考试成绩,[必考项目] AS 考试分类 FROM 体考;
   UNION ALL SELECT ksh,性别,抽选项目 AS 考试内容,抽选项目数 AS 考试成绩,[抽定项目] AS 考试分类 FROM 体考;
   UNION ALL SELECT ksh,性别,自选项目 AS 考试内容,自选项目数 AS 考试成绩,[自选项目] AS 考试分类 FROM 体考;
   UNION ALL SELECT ksh,性别,备选项目 AS 考试内容,备选项目数 AS 考试成绩,[备选项目] AS 考试分类 FROM 体考;
   INTO ARRAY ATK
SELECT ksh,性别,必考项目 AS 考试内容,必考项目数 AS 考试成绩,[必考项目] AS 考试分类,00.0 FS FROM 体考 INTO CURSOR TEMP READWRITE
ZAP
APPEND FROM ARRAY ATK
BLANK ALL FIELDS 考试成绩 FOR 考试成绩=0 &&清空[0]
UPDATE TEMP SET FS=测试标准.分数 FROM 测试标准 WHERE ALLTRIM(TEMP.考试内容)==ALLTRIM(测试标准.项目名称) AND TEMP.性别==测试标准.性别 AND BETWEEN(考试成绩,测试标准.下限,测试标准.上限)
SELECT A.KSH,A.性别,A.必考项目,B.抽定项目,C.自选项目,D.备选项目,A.必考项目数,;
       B.抽定项目数,C.自选项目数,D.备选项目数,A.FS1,B.FS2,C.FS3,D.FS4,;
       CAST(A.FS1+B.FS2+C.FS3+D.FS4 AS N(4,1)) 总分 FROM ;
       (SELECT ksh,性别,考试内容 AS 必考项目,考试成绩 AS 必考项目数,FS AS FS1 FROM TEMP WHERE ALLTRIM(考试分类)==[必考项目]) A,;
       (SELECT ksh,性别,考试内容 AS 抽定项目,考试成绩 AS 抽定项目数,FS AS FS2 FROM TEMP WHERE ALLTRIM(考试分类)==[抽定项目]) B,;
       (SELECT ksh,性别,考试内容 AS 自选项目,考试成绩 AS 自选项目数,FS AS FS3 FROM TEMP WHERE ALLTRIM(考试分类)==[自选项目]) C,;
       (SELECT ksh,性别,考试内容 AS 备选项目,考试成绩 AS 备选项目数,FS AS FS4 FROM TEMP WHERE ALLTRIM(考试分类)==[备选项目]) D WHERE A.KSH==B.KSH AND B.KSH==C.KSH AND C.KSH==D.KSH
后来看了大家的贴子后,代码改成以下:
程序代码:
CLOSE DATABASES
UPDATE 体考 SET 体考.必考分数=标准.分数 FROM 标准 WHERE 体考.必考项目==标准.项目名称 AND 体考.性别==标准.性别 AND BETWEEN(体考.必考项目数,标准.下限,标准.上限)
UPDATE 体考 SET 体考.抽选分数=标准.分数 FROM 标准 WHERE 体考.抽选项目==标准.项目名称 AND 体考.性别==标准.性别 AND BETWEEN(体考.抽选项目数,标准.下限,标准.上限)
UPDATE 体考 SET 体考.自选分数=标准.分数 FROM 标准 WHERE 体考.自选项目==标准.项目名称 AND 体考.性别==标准.性别 AND BETWEEN(体考.自选项目数,标准.下限,标准.上限)
UPDATE 体考 SET 体考.备选分数=标准.分数 FROM 标准 WHERE 体考.备选项目==标准.项目名称 AND 体考.性别==标准.性别 AND BETWEEN(体考.备选项目数,标准.下限,标准.上限)
SELECT 体考
REPLACE ALL 总分数 WITH 必考分数+抽选分数+自选分数+备选分数
FOR I=11 TO 15
    BLANK FIELDS (FIELD(I)) FOR EVALUATE(FIELD(I))=0
ENDFOR
BROWSE


 

坚守VFP最后的阵地
2013-01-03 22:19
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用sdta在2013-1-3 22:13:19的发言:

个人认为,优化算法,本着简单易懂的原则,不要一味追求一句代码,表面看是一句代码,实际上有十几行甚至几十行,这种算法,我认为不是最优的算法。
据我多年的编程经验,算法一旦被最优化,必然不是让旁人一看就懂的。就拿SELECT-SQL举例:其实一切SELECT-SQL命令可以做到的事情,编段程序都可以做到。但为什么各数据库软件还要有各种各样的SQL语句呢?就是为了精简算法,优化算法,让程序运行得更快。对于用户来说,他不需要关心代码是什么,维护时看得懂看不懂,只要运行速度快,bug少,能达到自己的目的,就是好软件;对于程序员而言,要在“看得懂”和“速度快”之间找个平衡点,这样能达到两全其美的效果。但往往速度是快了,但代码可能变得难懂,这时就应该通过建立文档来说明这些生涩难懂的语句,为将来的维护打下基础。
其实我也很赞成你说的“本着简单易懂的原则,不要一味追求一句代码”,但这只限于编程。比如,用一段清晰的逻辑结构来执行一段程序,要比用嵌套函数运行慢,但我赞成编程时用前者。至于SQL命令,它本身就是为优化算法、加快速度而生。再者,一句复杂的SQL语句也可以用清晰的结构来表达思路(可能会牺牲一点时间,但基本可以忽略,因为SQL命令本身速度就很快)。我认为,SQL命令的复杂与编程序段的复杂不是一个概念。否则,还要SQL语句干嘛呢?
所以,我认为,对于可以用SQL命令的地方,还是尽量用SQL命令,而不要用编程的方式;能在一句SQL命令中完成的,还是尽量不要拆分。SQL命令中的子句可以适当优化,但不要弄得生涩难懂,即便牺牲点速度。最后,我要说的是:如果觉得用了SQL命令看不懂思路的,或觉得用了一句SQL命令就是思路变差的,其实是他对SQL命令理解还不够。


[ 本帖最后由 taifu945 于 2013-1-4 08:29 编辑 ]
2013-01-04 08:25
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏
得分:0 
程序代码:
UPDATE 体考 SET 体考.必考分数=标准.分数 FROM 标准 WHERE 体考.必考项目==标准.项目名称 AND 体考.性别==标准.性别 AND BETWEEN(体考.必考项目数,标准.下限,标准.上限)
UPDATE 体考 SET 体考.抽选分数=标准.分数 FROM 标准 WHERE 体考.抽选项目==标准.项目名称 AND 体考.性别==标准.性别 AND BETWEEN(体考.抽选项目数,标准.下限,标准.上限)
UPDATE 体考 SET 体考.自选分数=标准.分数 FROM 标准 WHERE 体考.自选项目==标准.项目名称 AND 体考.性别==标准.性别 AND BETWEEN(体考.自选项目数,标准.下限,标准.上限)
UPDATE 体考 SET 体考.备选分数=标准.分数 FROM 标准 WHERE 体考.备选项目==标准.项目名称 AND 体考.性别==标准.性别 AND BETWEEN(体考.备选项目数,标准.下限,标准.上限)
UPDATE 体考 SET 总分数=必考分数+抽选分数+自选分数+备选分数

不考的一定要清空,不能为0?如果要清空,就得加上那末尾一句。

坚持学习vfp,QQ:306805680
2013-01-04 08:42
buyifly
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-7-29
收藏
得分:0 
谢谢各位老师,特别是SDTA:)
我最终使用的是SDTA老师的代码,简单,一看就懂,也非常快:)

考虑到原始数据是EXCEL转成DBF,项目名称有可能不同,我用了substr,取前4个汉字,
自选项止和备选项目,需要判断一下哪个分数高,就采用哪个,我用了IIF判断

程序代码:
CLOSE DATABASES

UPDATE 体考 SET 体考.必考分数=标准.分数 FROM 标准 WHERE SUBSTR(ALLTRIM(体考.必考项目),1,8)==SUBSTR(ALLTRIM(标准.项目名称),1,8) AND 体考.性别==标准.性别 AND BETWEEN(体考.必考项目数,标准.下限,标准.上限)

UPDATE 体考 SET 体考.抽选分数=标准.分数 FROM 标准 WHERE SUBSTR(ALLTRIM(体考.抽选项目),1,8)==SUBSTR(ALLTRIM(标准.项目名称),1,8) AND 体考.性别==标准.性别 AND BETWEEN(体考.抽选项目数,标准.下限,标准.上限)

UPDATE 体考 SET 体考.自选分数=标准.分数 FROM 标准 WHERE SUBSTR(ALLTRIM(体考.自选项目),1,8)==SUBSTR(ALLTRIM(标准.项目名称),1,8) AND 体考.性别==标准.性别 AND BETWEEN(体考.自选项目数,标准.下限,标准.上限)

UPDATE 体考 SET 体考.备选分数=标准.分数 FROM 标准 WHERE SUBSTR(ALLTRIM(体考.备选项目),1,8)==SUBSTR(ALLTRIM(标准.项目名称),1,8) AND 体考.性别==标准.性别 AND BETWEEN(体考.备选项目数,标准.下限,标准.上限)

SELECT 体考

REPLACE ALL 总分数 WITH 必考分数+抽选分数+Iif(自选分数>=备选分数,自选分数,备选分数)

FOR I=11 TO 15

   BLANK FIELDS (FIELD(I)) FOR EVALUATE(FIELD(I))=0

ENDFOR

BROWSE

我的代码分享在:http://www.

[ 本帖最后由 buyifly 于 2013-1-5 11:03 编辑 ]
2013-01-05 10:59
XCJSQ
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2013-4-15
收藏
得分:0 
过路的,顺便学习学习!
2013-05-27 09:57
快速回复:编程技巧擂台赛[四]
数据加载中...
 
   



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

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