程序代码:SET SAFETY OFF
SET TALK OFF
CLOSE ALL
SELECT 1
USE e:\考试表.dbf
DELETE ALL
pack
x=INPUTBOX("请输入考室数目")
教室数=VAL(x)
FOR i=1 TO VAL(x)
INSERT INTO 考试表 (教室) VALUES (STR(i,2))
next
SELECT 2
USE e:\教师.dbf
DELETE ALL
pack
APPEND FROM e:\教师.xls xls
DELETE FOR RECNO()=1
pack
教师数=RECCOUNT()
************************************
* 教师表用来存储教师姓名及分配次数 *
* 以供程序进行判断使用 *
************************************
IF 教师数<教室数
MESSAGEBOX("教师人数小于教室人数不能排考,请确认!")
RETURN
ENDIF
****************************
* 已分配表用来存储分配情况 *
* 以供程序进行判断使用 *
****************************
CREATE CURSOR 已分配 (课名 C(6),姓名 C(8))
************
* 开始分配 *
************
SELECT VAL(NVL(MAX(教室),"0")) ;
FROM 考试表 ;
INTO ARRAY 最大教室号
FOR I=1 TO 教室数-最大教室号
INSERT INTO 考试表 (教室) VALUES (ALLTRIM(STR(最大教室号+I))) &&凑齐教室数
NEXT &&I
RAND(-1)
课程门数=FCOUNT(1)-1
教室数=VAL(x)
****************************************
* 加以下两个变量的目的是防止最后一门课 *
* 时,若有教师在前面没分配过,会产生在 *
* 该门课程重复分配的bug。 *
****************************************
最后可分配数=0
最后课程填补=.F.
FOR I=1 TO 课程门数
课程名=FIELD(I+1,"考试表")
FOR J=1 TO 教室数
IF !最后课程填补
IF J=1 &&第1次分配
SELECT 姓名 FROM 教师 WHERE 分配次数>0 INTO ARRAY 教师名
ELSE
SELECT 姓名 FROM 教师 WHERE 姓名 NOT IN (SELECT 姓名 FROM 已分配 WHERE 课名=课程名) AND 分配次数>0 INTO ARRAY 教师名
ENDIF
可分配数=ALEN(教师名)
IF I>4 AND 最后可分配数=0 &&最后一门课程时
最后可分配数=可分配数 &&记录下最后可分配的教师数
ENDIF
ENDIF
教师序号=INT(RAND()*可分配数+1)
******************
* 修改教师表信息 *
******************
UPDATE 教师 SET 分配次数=分配次数-1 WHERE 姓名=教师名[教师序号]
********************
* 添加已分配表信息 *
********************
INSERT INTO 已分配 VALUES (课程名,教师名[教师序号])
******************
* 修改考试表信息 *
******************
UPDATE 考试表 SET &课程名=教师名[教师序号] WHERE VAL(教室)=J
IF I=课程门数
IF 最后可分配数>1
最后可分配数=最后可分配数-1
ELSE
IF J<教室数
最后课程填补=.T.
SELECT 姓名 FROM 教师 ;
WHERE 姓名 NOT IN ;
(SELECT 姓名 FROM 已分配 WHERE 课名=课程名) AND 分配次数>-2 ;
INTO ARRAY 教师名
可分配数=ALEN(教师名)
ENDIF
ENDIF
ENDIF
NEXT &&J
NEXT &&I
SET SAFETY ON
SET TALK ON
CLOSE ALL
USE e:\考试表
brow
COPY TO e:\考试表.xls xls






