回复 10楼 wengjl
感觉考场号应连续 不然1考场不只1个 等等
程序代码出来了,应该可以满足你的要求。主要是随机安排方面比较麻烦,你可以多运行几趟,看看结果是否符合要求。
另外,根据你对考场名称的安排,我把表中原来只有2位长度的KCH字段扩展到了V(30)以容纳中文。
SET TALK OFF
SET SAFETY OFF
CLOSE ALL
SET DEFAULT TO C:\RR\论坛\
RAND(-1)
****************
* 统计考场分类 *
****************
SELECT DISTINCT NJDM+KLDM;
FROM BMK;
GROUP BY njdm,kldm;
INTO ARRAY KCFL &&考场分类
***********************************
* 统计科类总数(年级+科类的汇总数) *
***********************************
SELECT COUNT(*);
FROM;
(SELECT NJDM+KLDM,COUNT(DISTINCT NJDM+KLDM);
FROM BMK;
GROUP BY njdm,kldm) T1;
INTO ARRAY KLZS &&科类总数
****************************
* 统计每个大科类中的小计数 *
****************************
SELECT COUNT(NJDM+KLDM);
FROM BMK;
GROUP BY njdm,kldm;
INTO ARRAY GLRS &&各类人数
****************
* 开始编排考场 *
****************
FOR I=1 TO KLZS(1,1)
考场数量=INT(GLRS(I,1)/30+1)
年级=IIF(LEFT(KCFL(I,1),1)='1','一年级',;
IIF(LEFT(KCFL(I,1),1)='2','二年级',;
'三年级'))
科类=IIF(RIGHT(KCFL(I,1),2)='11','文史','理工')
FOR J=1 TO 考场数量
考场人数=1
考场名称='考场'+ALLTRIM(STR(J,3))
DO WHILE 考场人数<31
***************************************
* 判断本类学生是否已经全部分配完, *
* 若已分配完,则换个科类。 *
* 本段代码用于每个科类的最后一个考场。*
***************************************
SELECT COUNT(BMH) FROM BMK;
WHERE NJDM+KLDM==KCFL(I,1) AND;
EMPTY(ZWH);
INTO ARRAY STUDENTS
IF STUDENTS(1,1)=0
EXIT &&若本类学生全部分配完就换类别
ENDIF
*****************************
* 开始按考场随机分配学生 *
* 此段为核心代码 *
*****************************
SELECT BMH FROM BMK;
WHERE NJDM+KLDM==KCFL(I,1) AND;
EMPTY(ZWH);
INTO ARRAY STUDENT
座位号=IIF(考场人数<10,'0'+STR(考场人数,1),STR(考场人数,2))
学生序号=INT(RAND()*ALEN(STUDENT,1)+1)
UPDATE BMK SET ZWH=座位号,KCH=年级+科类+考场名称 ;
WHERE BMH==STUDENT(学生序号,1)
考场人数=考场人数+1
ENDDO
NEXT
NEXT
SET TALK ON
SET SAFETY ON
RETURN