| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4220 人关注过本帖, 2 人收藏
标题:成绩排名 程序优化
取消只看楼主 加入收藏
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
结帖率:100%
收藏(2)
 问题点数:0 回复次数:9 
成绩排名 程序优化
成绩排名程序,可否再进行优化,或者哪位还有更通俗易懂的:
表:CJ   PM
    85   1
    84   2
    84   2
    83   4
    。。。。


public w_max,n,i
n=1    && 成绩相同的人数
i=0    && 排名序号

select cjk
set order to cj
go top

w_max = cjk.cj
repl pm with n+i
skip    
    do while !eof()
    if w_max = cjk.cj
             n = n + 1
    else
        if n>0
           i = i + n + 1
           n = 0
        else
           i = i + 1
        endif
    endif

    repl pm with i
    w_max = cjk.cj
    skip
    enddo

[[it] 本帖最后由 szy345 于 2008-9-12 15:19 编辑 [/it]]
搜索更多相关主题的帖子: 程序优化 排名 
2008-09-12 15:18
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
楼上的可能要再改改,有点小问题
    CJ  PM
    85   1
    84   2
    84   2
    83   4
2个84并列第2,那么83就应该是第4名了,而不是第3名
2008-09-12 16:56
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
[bo][un]qjbzjp[/un] 在 2008/9/12 18:52 的发言:[/bo]


    n=IIF(cj=cjbak,i-1,i)
    REPLACE pm with n

这2句还是有点问题:

CJ  PM       i值   cj=cjbak  n值
84  1         1       F       1
83  2         2       F       2
83  2         3       T       2
83  2         4       T     (i-1)=3   
82  5         5       F       5
2008-09-12 21:17
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
只是各个项目的要求不同。
没有什么硬性的规定。
2008-09-13 11:52
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
这次应该是好的!
果然要好点!

ibmlang_002的也不错,都比我的要简单!
哈哈
2008-09-13 12:52
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
前2天,没时间,今天看了一下,
ibmlang_002的效率最高!

只是有那么一点点遗憾,就是产生了新表!
2008-09-16 09:36
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
刚有位兄弟,留言给我,问我关于多个科目成绩排名如何做。
首先,我说下,有什么问题,可以直接拿出来,大家讨论讨论。没人会说你什么!真的!当然留言也可以!
下面是我对我的程序进行适当修改,由单科目排名,到多科目排名的代码。

close data
use E:\学习\VFP\排名分段统计\中考成绩.dbf  alias cjk in 0
public w_max,n,i

***********************************    cj1,cj2,cj3 字段(建立索引)          && 以3个科目为例
for j=1 to 3  && 3 个科目
         n=1    && 成绩相同的人数
         i=0    && 排名序号
    cj = 'cj'+ allt(str(j))
    pm = 'pm'+ allt(str(j))    && cj1,cj2,cj3 分别对应pm1,pm2,pm3
    
    select cjk
    set order to &cj
    go top

    w_max = cjk.&cj
    repl &pm with 1

    skip    
    do while !eof()
        if w_max = cjk.&cj
            n = n + 1
        else
            if n>0
                i = i + n + 1
                n = 0
            else
                i = i + 1
            endif
        endif

        repl &pm with i
        w_max = cjk.&cj
        skip
    enddo
endfor

close data

[[it] 本帖最后由 szy345 于 2008-9-16 15:42 编辑 [/it]]
2008-09-16 15:37
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
你试下看看

close data
use E:\学习\VFP\排名分段统计\中考成绩.dbf  alias cjk in 0
public w_max,n,i
                           
 for j=1 to 3  &&      以3个科目为例
    n=1    && 成绩相同的人数
    i=0    && 排名序号
    cj = 'cj'+ allt(str(j))
    pm = 'pm'+ allt(str(j))    && cj1,cj2,cj3 分别对应pm1,pm2,pm3
     
    select cjk
    *****************************
    aa = .f.
    for f=1 to fcount()
        if field(f) = &pm
            aa = .t.
        endif
    endfor   
    if aa = .f.
       alter table cjk
       add column &pm  N(5)
    endif   
    index on &cj tag &cj desc
    ******************************
    set order to &cj
    go top

    w_max = cjk.&cj
    repl &pm with 1

    skip   
    do while !eof()
        if w_max = cjk.&cj
            n = n + 1
        else
            if n>0
                i = i + n + 1
                n = 0
            else
                i = i + 1
            endif
        endif
        repl &pm with i
        w_max = cjk.&cj
        skip
    enddo
endfor
close data

[[it] 本帖最后由 szy345 于 2008-9-18 09:21 编辑 [/it]]
2008-09-18 09:06
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
VFP6 ,这个我试过了

close data
use E:\学习\VFP\排名分段统计\中考成绩.dbf  alias cjk in 0
public w_max,n,i
                           
for j=1 to 3  &&      以3个科目为例
    n=1    && 成绩相同的人数
    i=0    && 排名序号
    cj = 'cj'+ allt(str(j))
    pm = 'pm'+ allt(str(j))

    select cjk
    *****************************
    aa = 0
    for f=1 to fcount()
        if lower(field(f)) = 'pm'+ allt(str(j))
            aa = 1
        endif
    endfor   
    if aa == 0
       alter table cjk  add column &pm  N(5,0)
    endif   
    index on &cj tag &cj desc
    ******************************
    set order to &cj
    go top

    w_max = cjk.&cj
    repl &pm with 1

    skip   
    do while !eof()
        if w_max = cjk.&cj
            n = n + 1
        else
            if n>0
                i = i + n + 1
                n = 0
            else
                i = i + 1
            endif
        endif
        repl &pm with i
        w_max = cjk.&cj
        skip
    enddo
endfor
close data

[[it] 本帖最后由 szy345 于 2008-9-18 13:12 编辑 [/it]]
2008-09-18 12:35
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
002 对select语句比较中意啊,哈哈
我不怎么擅长,学习
2008-09-18 13:32
快速回复:成绩排名 程序优化
数据加载中...
 
   



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

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