程序代码:
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