| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4062 人关注过本帖, 2 人收藏
标题:学生各科成绩排名代码的讨论
只看楼主 加入收藏
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
结帖率:90.48%
收藏(2)
 问题点数:0 回复次数:12 
学生各科成绩排名代码的讨论
*我把学生成绩排名程序代码帖出来,供参考(只需稍加修改,就可以排名所有科目成绩)。希望有高手能用更简便高效的SQL查询替代。

*数据表student有字段:准考证号,sx,yw,yy,wl,hx(数学、语文、英语、物理、化学),sxmc,ywmc,yymc,wlmc,hxmc(各科相应名次)
*各科排名完成后,最终得到PMK.DBF
IF !USED("student")
    USE student
ENDIF
COPY TO pmk
USE in student
FOR ii=1 to 5
    USE pmk
    km=SUBSTR("sxywyyhxwl",2*ii-1,2) &&科名
    zfs=km-"mc"  &&各科名次
    SORT  ON &km /D to studentpm
    USE studentpm
    REPLACE all &zfs with RECNO()
    DO dpm    with km,zfs
    COPY TO pmk
    BROWSE fields &km,语文名次,&zfs,数学名次,英语名次,物理名次,化学名次
    use
NEXT
retu
PROCEDURE dpm
    PARAMETER cj,pm
n=0
nbak=0
cjbak=0
GO top
FOR i=1 to RECCOUNT()
    n=IIF(&cj=cjbak,n,i)
    REPLACE &pm with n
    cjbak=&cj
    nbak=n
    skip
next
ENDPROC

[[it] 本帖最后由 qjbzjp 于 2008-9-26 13:39 编辑 [/it]]
搜索更多相关主题的帖子: 学生 代码 排名 
2008-09-22 15:51
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
收藏
得分:0 
试建议:(1)用Index命令代替Sort命令;(2)m.km=Field(ii+1)取出科目字段名,m.mc=Field(ii+6)取出对应名次字段名;(3)连续名次或间断名次考虑其一

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2008-09-22 15:58
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:0 
我试过许多方法,也用过将A数据表文件 index on ....to X, 然后Copy to B文件,将B文件排序结果放入到B文件的字段中。然后试过许多网上发的关于SQL语句、UPdate、Scan等,但没办法将这个排序结果字段更新到A文件中了,所以用了DOS下常用的笨办法来达到目的。
2008-09-22 21:18
ibmlang_002
Rank: 5Rank: 5
来 自:浙江-嘉兴
等 级:贵宾
威 望:18
帖 子:437
专家分:176
注 册:2008-8-30
收藏
得分:0 
alter table A add column 排序 n(4)
update A set a.排序=B.排序 from b where a.姓名=b.姓名

VFP
2008-09-23 07:42
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
收藏
得分:0 
Set Safety Off
Close All
Use cj1
For ii=1 To 5
  c科目=Field(m.ii+1)
  c名次=Field(m.ii+6)
  Index on -&c科目 Tag Temp
  Go Top
  n成绩=&c科目
  nIndex=1
  nOrder=1
  Scan
    If n成绩#&c科目
      nIndex=nOrder
    EndIf
    nOrder=nOrder+1
    Replace &c名次 With nIndex
  EndScan
EndFor
set index to
Browse

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2008-09-23 09:14
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
收藏
得分:0 
上述程序所用的表结构可能是这样的:姓名,5个科目的成绩,5个科目的名次

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2008-09-23 15:13
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:0 
三楼ibmlang_002的代码,运行时提示错误,去掉“ from b ”后,可以运行,但“a.排序”字段中置换了相同的数据。
以往我见到的排序代码,理论上应该没有问题,但实际运行总有问题,大多是字段中置换了同一个数据,又找不到问题所在。

四楼Tiger5392 的代码非常简练,排序正确。如果再把同分者并列名次考虑进去就更好了。

[[it] 本帖最后由 qjbzjp 于 2008-9-24 09:42 编辑 [/it]]
2008-09-23 21:18
ibmlang_002
Rank: 5Rank: 5
来 自:浙江-嘉兴
等 级:贵宾
威 望:18
帖 子:437
专家分:176
注 册:2008-8-30
收藏
得分:0 
[bo][un]qjbzjp[/un] 在 2008-9-23 21:18 的发言:[/bo]

三楼ibmlang_002的代码,运行时提示错误,去掉“ form b ”后,可以运行,但“a.排序”字段中置换了相同的数据。
以往我见到的排序代码,理论上应该没有问题,但实际运行总有问题,大多是字段中置换了同一个数据,又 ...

你的什么版本?我在7.0上可以运行,结果正确。

VFP
2008-09-24 07:35
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:0 
我查了一下,三楼的代码应该没问题,而是版本问题。
我用的是8.0版VF,在帮助文件中UPDATE - SQL 命令中确实没有…from …
但9.0版就有了。
只不过搞不明白的是,7.0版有…from …,8.0版怎么会没有?一头雾水……
2008-09-24 10:23
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2214
专家分:3882
注 册:2007-4-27
收藏
得分:0 
*计算成绩的名次
CLOSE DATABASES
WAIT WINDOW '成绩名次正在计算中,请稍等…… ' NOWAIT   &&&& 显示消息框
SELECT 0
USE bmk alia zk
SELECT * from zk orde by zf desc into cursor tmp readwrite  &&& 在内存中建一个可改写的临时表
SELECT tmp
GO top
_cj=tmp.zf
_mc1=1  &&同名
_mc2=1  &&累计 
REPLACE tmp.zfmc with _mc1   && 先将成绩最好的一个写上第名次1
DO whil not EOF()
  SKIP
  _mc2=_mc2+1    &&&& 执行一次SKIP 后名次累加1 
  IF tmp.zf=_cj   &&& 如果当前成绩与前一个成绩是相同的,则计原来的名次
    REPLACE tmp.zfmc with _mc1   
  ELSE           && 否则,变量取最新值,并写入名次
    _mc1=_mc2
    REPLACE tmp.zfmc with _mc1
    _cj=tmp.zf
  ENDIF
ENDDO
*-------------------
*将名次写回原库
SELECT zk
SCAN
  SELECT tmp
  LOCATE for tmp.xh==zk.xh
  *if ....endif  这里省略是否找到的判断语句是因为一定是能找到,并且唯一的。
  SELECT zk
  REPLACE zk.zfmc with tmp.zfmc
ENDSCAN  
*-----------------
MESSAGEBOX('名次计算完成!',64,'完成提示:')
  WAIT CLEAR    &&&& 清屏
RETURN
*分校统计各段人数
(……)

只求每天有一丁点儿的进步就可以了
2011-11-18 10:53
快速回复:学生各科成绩排名代码的讨论
数据加载中...
 
   



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

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