| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1355 人关注过本帖, 1 人收藏
标题:请大家帮我看下这个程序排准考证的,哪里出错了,排到倒数第二个考时,都会 ...
只看楼主 加入收藏
施南人
Rank: 2
等 级:论坛游民
帖 子:40
专家分:27
注 册:2013-5-19
收藏
得分:0 
请教SDTA老师,如果有两个或三个以上的考点(学校)同时编排考场,如何进行呢?
2013-05-21 08:29
bccn0906
Rank: 9Rank: 9Rank: 9
来 自:广州
等 级:蜘蛛侠
威 望:2
帖 子:414
专家分:1183
注 册:2013-10-16
收藏
得分:0 
楼主这算法不错
吸收消化一下:
CREATE CURSOR 考生名单 (学号 c(20),姓名 c(20),试室编号 c(10),准考号 c(20),所属学校 c(60),考场 c(60),随机数 int)

SELECT distinct 考场 FROM 考生名单 INTO CURSOR 考场名单
SELECT * FROM 考生名单 INTO CURSOR 准考号生成库 READWRITE WHERE .f.
当前试室编号=1
试室人数=30 &&设每30一人试室

=RAND(-1)
REPLACE ALL 随机数 WITH INT(RAND()*50000) IN 考生名单
SELECT 考场名单
SCAN
    ZAP IN 准考号生成库
    INSERT INTO 准考号生成库 SELECT * FROM 考生名单 WHERE ALLTRIM(考场)==ALLTRIM(考场名单.考场) order by 随机数

    此考场人数=RECCOUNT('准考号生成库')
    此考场试室个数 =CEILING(此考场人数/试室人数)
    未满试室人数=此考场人数-INT(此考场人数/试室人数)*试室人数

    GO TOP IN 准考号生成库
    BZ =.f.
    FOR Y = 1 TO 试室人数 STEP 2
        FOR X = 当前试室编号 TO  当前试室编号+ 此考场试室个数 - 1
            REPLACE 试室编号 WITH  PADL(x,3,'0'),准考号 WITH PADL(x,3,'0') + PADL(y,2,'0') IN 准考号生成库
            SKIP IN 准考号生成库
        ENDFOR
        IF 未满试室人数<>0 AND ((未满试室人数%2=0 AND Y >= 未满试室人数-2) OR (未满试室人数%2<>0 AND Y >= 未满试室人数)) AND NOT BZ
             此考场试室个数=此考场试室个数-1
            BZ =.t.
        ENDIF
    ENDFOR

    此考场试室个数 =CEILING(此考场人数/试室人数)
    BZ =.f.
    FOR Y = 2 TO 试室人数 STEP 2
        FOR X = 当前试室编号 TO  当前试室编号+ 此考场试室个数 - 1
            REPLACE 试室编号 WITH  PADL(x,3,'0'),准考号 WITH PADL(x,3,'0') + PADL(y,2,'0') IN 准考号生成库
            SKIP IN 准考号生成库
        ENDFOR
        IF 未满试室人数<>0 AND ((未满试室人数%2=0 AND Y >= 未满试室人数) OR (未满试室人数%2<>0 AND Y >= 未满试室人数-2)) AND NOT BZ
             此考场试室个数=此考场试室个数-1
            BZ =.t.
        ENDIF
    ENDFOR
    此考场试室个数 =CEILING(此考场人数/试室人数)
    当前试室编号=当前试室编号+此考场试室个数
    UPDATE 考生名单 SET 准考号=b.准考号,试室编号=b.试室编号 from 准考号生成库 b WHERE ALLTRIM(考生名单.学号)==ALLTRIM(b.学号)
ENDSCAN
======================================================
另一个算法,同班不连号,更乱一点
=RAND(-1)
CREATE CURSOR 考生名单 (班级 c(10),学号 c(20),姓名 c(20),试室编号 c(10),准考号 c(20),所属学校 c(60),考场 c(60),随机数 int)
SELECT distinct 考场 FROM 考生名单 INTO CURSOR 考场名单
SELECT * FROM 考生名单 INTO CURSOR 准考号生成库 READWRITE WHERE .f.
当前试室编号=1
试室人数=30 &&设每30一人试室
SELECT 考场名单
SCAN
    ZAP IN 准考号生成库
    SELECT * FROM 考生名单 INTO CURSOR 准考号生成库tmp1 READWRITE WHERE ALLTRIM(考场)==ALLTRIM(考场名单.考场)
    REPLACE ALL 随机数 WITH INT(RAND()*50000) IN 准考号生成库tmp1
    SELECT *,.f. 处理标记 FROM 准考号生成库tmp1 INTO CURSOR 准考号生成库tmp2 READWRITE ORDER BY 随机数
    USE IN 准考号生成库tmp1
    GO TOP IN 准考号生成库tmp2
    DO whil .t.
        SELECT 准考号生成库tmp2
        LOCATE FOR NOT (ALLTRIM(班级)==ALLTRIM(准考号生成库.班级) OR 处理标记)
        IF FOUND()
            INSERT INTO 准考号生成库 (学号,班级) VALUES (准考号生成库tmp2.学号,准考号生成库tmp2.班级)
            REPLACE 处理标记 WITH .t. IN 准考号生成库tmp2
        ELSE
            INSERT INTO 准考号生成库 (学号,班级) SELECT 学号,班级 FROM 准考号生成库tmp2 WHERE NOT 处理标记
            EXIT
        ENDIF
    ENDDO
    USE IN 准考号生成库tmp2
    REPLACE ALL 试室编号 WITH  PADL(当前试室编号+CEILING(RECNO()/试室人数)-1,3,'0') IN 准考号生成库
    REPLACE ALL 准考号 WITH  PADL(RECNO()%试室人数,2,'0') IN 准考号生成库
    REPLACE ALL 准考号 WITH  PADL(试室人数,2,'0') FOR ALLTRIM(准考号)=='00' IN 准考号生成库
    REPLACE ALL 准考号 WITH  ALLTRIM(试室编号)+ALLTRIM(准考号) IN 准考号生成库
    UPDATE 考生名单 SET 准考号=b.准考号,试室编号=b.试室编号 from 准考号生成库 b WHERE ALLTRIM(考生名单.学号)==ALLTRIM(b.学号)
    当前试室编号=当前试室编号+CEILING(RECCOUNT('准考号生成库')/试室人数)
ENDSCAN
USE IN 准考号生成库
USE IN 考场名单

考生名单.rar (8.73 KB)





[ 本帖最后由 bccn0906 于 2013-12-8 16:07 编辑 ]
2013-12-03 21:57
快速回复:请大家帮我看下这个程序排准考证的,哪里出错了,排到倒数第二个考时, ...
数据加载中...
 
   



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

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