| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1265 人关注过本帖
标题:请问 taifu945 在不
只看楼主 加入收藏
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
程序代码:
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
2013-06-25 22:00
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用dzy123在2013-6-25 21:58:58的发言:

我的代码和教师表,考试表都在这儿,如果你有空帮我看下再次谢谢你

不客气。今天晚了,不急的话过两天再帮你看下。最近期末,单位事情比较多,不过我会尽快抽空。
2013-06-25 22:12
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
好的
2013-06-25 22:13
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
你在学校工作?
2013-06-25 22:13
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用dzy123在2013-6-25 22:13:26的发言:

你在学校工作?
是的,在学校工作。不然,我怎么会对你的帖子和上一次一个狐友的什么培养计划的帖子那么熟悉呢。
2013-06-26 13:15
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:20 
以下是引用dzy123在2013-6-25 15:57:05的发言:

我试了一下还是有问题你帮我改下我已经改过后的程序
小问题先说一下:DELETE ALL+PACK的组合完全可以用一条ZAP命令替代,且ZAP命令的速度要快得多。另外,分配基数如果经常变动的话,还是用我这种代码比较好,不要用常量。
关键问题:你没有仔细对比我修改前后的程序差别,有些地方用的还是老代码,有些地方你还改错了。

但我帮你测试程序时新发现一个问题:一共6门课,分配基数每人4次;但3门课分配完毕后,有些老师居然只被分配掉一次。如果继续随机分配,会发生两个老师之间被分配的差距大于2次,不符合你的要求了。解决方法初步设想是:加一段代码进行人工干预。最初课程数肯定是大于分配基数的,当剩下的课程数开始等于分配基数或后面小于分配基数时时,每次都要查询分配基数剩量与剩余课程数相同的人,一旦查到,就要强制优先分配这些老师。不然,课程只剩下2门,分配基数还剩下3,甚至4,就肯定不对了。这只是想法,目前没有时间去写相应代码,你可以自己试写一下。然后,加这一段代码肯定会牵涉到现在代码的算法出现变化,可能现有代码也要作些改动。
2013-06-26 14:46
快速回复:请问 taifu945 在不
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027542 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved