| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3356 人关注过本帖
标题:请教排考场问题!按照年级及年级要求考场数,排出考场座号。
只看楼主 加入收藏
yewxj
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:157
专家分:153
注 册:2015-6-18
收藏
得分:0 
*****新增‘no_’数值型字段****思路是随机打乱表的排序,然后再进行分配。打乱排序来自百度lys_zj大神,效率不高,但能满足要求。
SET SAFETY OFF
CLOSE ALL
CLEAR
USE stu ALIAS stu IN 0
SELECT stu
_kc=RECCOUNT()
public nA(_kc),nB(_kc)
for i=1 to _kc
nA(i)=i
next
ii=1
  do while ii<=_kc
    for i=1 to _kc
      if rand()=0
        if nA(i)>0
          nB(ii)=nA(i)
          nA(i)=0
          ii=ii+1
        endif
      endif
    next
    i=1
  ENDDO  
FOR iii=1 to _kc
  GOTO nB(iii)
  REPLACE no_ with iii
NEXT
INDEX on no_ to px


SELECT 年级 FROM stu GROUP BY 年级,nj ORDER BY nj INTO ARRAY stu1
_n=ALEN(stu1)
FOR _i=1 TO _n
  rs=0
  @_i,5 say stu1(_i)+"考场人数:" get rs
  read
  IF rs=0
     EXIT
  ENDIF
  SET FILTER TO 年级=stu1(_i)
  ma=1
  mb=1  &&两个变量
  GO TOP
  DO WHILE !EOF()
   IF mb>rs
      ma=ma+1
      mb=1
    ELSE
      REPLACE kc WITH ma,考场 WITH ma
      REPLACE zh WITH mb,座号 WITH zh
    SKIP
    mb=mb+1
   ENDIF
  ENDDO
ENDFOR
CLOSE ALL

[此贴子已经被作者于2017-11-7 07:37编辑过]

2017-11-06 23:04
分号
Rank: 1
等 级:新手上路
帖 子:156
专家分:0
注 册:2006-12-4
收藏
得分:0 
按照年级随机排考场号,座位号。
2017-11-07 06:21
yewxj
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:157
专家分:153
注 册:2015-6-18
收藏
得分:0 
运行一下11楼的看看是不是你需要的,运行比较慢,要多等一会。
stu.dbf 需要增加一个 no_ 数值型字段,宽度4以上,小数点0,目的是为了随机分配记录号,然后以此排序来打乱表记录顺序。

[此贴子已经被作者于2017-11-7 07:09编辑过]

2017-11-07 07:08
分号
Rank: 1
等 级:新手上路
帖 子:156
专家分:0
注 册:2006-12-4
收藏
得分:0 
就是运行比较慢。
2017-11-07 07:53
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
隨機索引

坚守VFP最后的阵地
2017-11-07 09:42
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
排考这件事其实远没有楼主说得那么简单,要注意以下几个问题:

1、每个教室可容纳的考生数。这是个核心问题,因为可容纳的考生数和平时上课可容纳的学生数不是一个概念。而且教室有大有小,每个教室可容纳的考生数是不一样的。
2、你们学校有几个教室可同时作为考场使用。也就是,同一时间开考,可以同时用几个教室。
3、试卷问题。假设同一年级因为试卷相同,必须放在同一时间开考,那么,至少要有能容纳最多人数年级的那么多教室。
4、每个考场的人数安排。标准考场是每考场30人,如果楼主要做随机数,也需要人工控制。人工控制包括2方面:(1)每考场的人数,比如:只能在25-33之间随机。因为每考场人数太多,会让监考老师不好控制;人太少,会浪费教室;(2)如果教室数量有限,那么人多的年级需要每个考场略微多安排一些人,比如:可在30-33之间随机;人少的年级,每个考场的人数可在25-30之间随机。

我之所以说这些,不是向楼主灌输教学管理的知识,而是在编程时需要考虑这些问题,做些人工控制,让程序产生的结果更合理。
2017-11-07 09:49
yewxj
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:157
专家分:153
注 册:2015-6-18
收藏
得分:20 
***这个快很多,仍然需要一个用来排序的 no_ 数值字段
SET SAFETY OFF
CLOSE ALL
CLEAR
USE stu ALIAS stu IN 0
SELECT stu
PUBLIC no1(RECCOUNT())
FOR i=1 TO RECCOUNT()
  no1(i)=i
NEXT
GOTO TOP
DO WHILE !EOF()
  _n=ASCAN(no1,.F.)-1
  IF _n<1
    _n=RECCOUNT()
  ENDIF
  _mo1=INT(_n*rand()+1)
  REPLACE no_ WITH no1(_mo1)
  ADEL(no1,_mo1)
  SKIP
ENDDO
INDEX on no_ to px


SELECT 年级 FROM stu GROUP BY 年级,nj ORDER BY nj INTO ARRAY stu1
_n=ALEN(stu1)
FOR _i=1 TO _n
  rs=0
  @_i,5 say stu1(_i)+"考场人数:" get rs
  read
  IF rs=0
     EXIT
  ENDIF
  SET FILTER TO 年级=stu1(_i)
  ma=1
  mb=1  &&两个变量
  GO TOP
  DO WHILE !EOF()
   IF mb>rs
      ma=ma+1
      mb=1
    ELSE
      IF LEN(ALLTRIM(STR(ma)))<2
        ma1="0"+ALLTRIM(STR(ma))
      ELSE
        ma1=ALLTRIM(STR(ma))
      ENDIF        
      REPLACE kc WITH ma,考场 WITH VAL(LEFT(ALLTRIM(STR(bjs)),1)+ma1)
      REPLACE zh WITH mb,座号 WITH zh
    SKIP
    mb=mb+1
   ENDIF
  ENDDO
ENDFOR
CLOSE ALL
USE stu ALIAS stu IN 0
SELECT stu
INDEX on STR(考场)+STR(座号) TO px
BROWSE

[此贴子已经被作者于2017-11-7 10:08编辑过]

2017-11-07 10:02
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2215
专家分:3882
注 册:2007-4-27
收藏
得分:0 
添加附件或图片 按钮 点了无反应。

只求每天有一丁点儿的进步就可以了
2017-11-14 10:23
快速回复:请教排考场问题!按照年级及年级要求考场数,排出考场座号。
数据加载中...
 
   



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

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