请教SDTA老师,如果有两个或三个以上的考点(学校)同时编排考场,如何进行呢?
吸收消化一下:
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 编辑 ]