程序好了,至少在你给定的这三个数据下验证通过了。但我代码设计的是有变化的情况,只是来不及测试了,我要去考场了:
******************************************
* 思路:一共有6门课,每门课需要40名教师
*
* 总计240人次。根据课程和教室循环,随机
*
* 挑出教师填充。超过基数的课肯定有空档需 *
* 要某些教师超基数分配的,作特殊处理。
*
******************************************
SET SAFETY OFF
SET TALK OFF
CLOSE ALL
课程门数=6
教室数=40
教师数=52
分配基数=INT(课程门数*教室数/教师数)
************************************
* 教师表用来存储教师姓名及分配次数 *
* 以供程序进行判断使用
*
************************************
CREATE CURSOR 教师 (姓名 C(6),分配次数 I)
FOR I=1 TO 教师数
INSERT INTO 教师 VALUES ("教师"+LTRIM(STR(I)),分配基数)
NEXT &&I
****************************
* 已分配表用来存储分配情况 *
* 以供程序进行判断使用
*
****************************
CREATE CURSOR 已分配 (课名 C(4),姓名 C(6))
**************
* 处理考试表 *
**************
SELECT VAL(NVL(MAX(教室),"0")) ;
FROM 考试表 ;
INTO ARRAY 最大教室号
FOR I=1 TO 教室数-最大教室号
INSERT INTO 考试表 (教室) VALUES (ALLTRIM(STR(最大教室号+I))) &&凑齐教室数
NEXT &&I
UPDATE 考试表 SET 语文=[],数学=[],英语=[],地理=[],历史=[],综合=[]
************
* 开始分配 *
************
RAND(-1)
******************************************
* 加以下两个变量的目的是防止超过基数课程 *
* 分配,若有教师在前面没分配过,会产生在 *
* 该门课程重复分配的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>分配基数 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
RETURN
[
本帖最后由 taifu945 于 2013-6-25 12:48 编辑 ]