| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1475 人关注过本帖
标题:再请教考场编排的问题
只看楼主 加入收藏
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:10 
回复 10楼 wengjl
感觉考场号应连续 不然1考场不只1个 等等
2014-02-20 12:33
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
程序代码出来了,应该可以满足你的要求。主要是随机安排方面比较麻烦,你可以多运行几趟,看看结果是否符合要求。
另外,根据你对考场名称的安排,我把表中原来只有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

图片附件: 游客没有浏览图片的权限,请 登录注册

2014-02-20 13:27
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
楼主,你可以用“SELECT NJDM,KLDM,KCH,COUNT(KCH) 考生数量 FROM BMK GROUP BY 1,2,3”命令查看结果。
2014-02-20 13:40
施南人
Rank: 2
等 级:论坛游民
帖 子:40
专家分:27
注 册:2013-5-19
收藏
得分:0 
感谢bccn0906老师给了我很好的启示。非常感谢taifu945老师非常专业的解决问题的方法!

[ 本帖最后由 施南人 于 2014-2-20 15:15 编辑 ]
2014-02-20 15:10
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2215
专家分:3882
注 册:2007-4-27
收藏
得分:0 
bmk.rar (1.95 KB)

施南人好,符合你期望的吗?

只求每天有一丁点儿的进步就可以了
2014-02-20 16:22
施南人
Rank: 2
等 级:论坛游民
帖 子:40
专家分:27
注 册:2013-5-19
收藏
得分:0 
再次感谢各位老师的帮助,问题已经解决!
2014-03-07 08:40
Littlebeezkz
Rank: 1
等 级:新手上路
威 望:1
帖 子:10
专家分:0
注 册:2015-7-12
收藏
得分:0 
精品!慢慢拜读
REPLACE ALL BMK.sjbh WITH SUBS(ALLT(STR(VAL(SUBS(TIME(6),7,6))*100*RAND()*10000,20))+'78212356',3,5) 中的'78212356'好像不起作用?

[ 本帖最后由 Littlebeezkz 于 2015-8-10 06:51 编辑 ]
2015-08-10 06:05
快速回复:再请教考场编排的问题
数据加载中...
 
   



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

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