注册 登录
编程论坛 VFP论坛

关于监考轮换的求助

bcly0808 发布于 2025-04-17 09:48, 1197 次点击
现压缩包里有4个数据表,分别是监考甲(jkj.dbf,33条记录)、监考乙(jky.dbf,33条记录)、结果(jg.dbf;是以jkj为主的两表对接表共1089条记录)、还有一表是(jg51.dbf,是在jg表中删除监考甲和监考乙都为男性的数据表有949条记录)、监考轮换1-6.prg(写一个循环筛选提取记录,只能校对当前记录的要插入的记录不相同,无法校对之前安排过的考场监考甲、监考乙组合其他记录与现要筛选提取插入的结果相同,监考轮换1是处理第一场监考甲,监考轮换2是处理第一场监考乙,监考轮换3是处理第二场监考甲,监考轮换4是处理第二场监考乙,监考轮换5是处理第三场监考甲,监考轮换6是处理第三场监考乙,后来发现重复就没有写
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
)

轮换要求是:
1、共分为7组;
2、每组监考甲、监考乙各33人,分布到33个考场中、保证甲、乙各1人;
3、监考甲、监考乙全为男性的不允许在一个考场出现;
4、监考甲、监考乙在这7组监考任务中只能相遇1次;
5、监考甲、监考乙在这7组监考任务中监考过的考场不能再出现
6、监考甲、监考乙男、女搭配说明,比如说某位女老师在这7组中不能全与男生搭配。
7、监考甲、监考乙分配要完全随机,不想用第一组分配完,第二组或以下几组用递增、递减或齿轮法。
19 回复
#2
wengjl2025-04-17 10:22
意思是共有33个考场,7门学科考试分布在7个时间段。也就是说每一场考试的时间段里,有33个试场同时在进行考试。
同一场监考的2个老师,在甲乙搭配上,老师的性别是允许二女或一男一女,不允许二男。
每个老师在7场次的监考中,不可以在同一试场中重复出现;甲乙的搭配中也不得重复出现。
#3
bcly08082025-04-17 13:26
回复 2楼 wengjl
是的,监考甲、监考乙分配要完全随机,不想第一组分配完,第二组或以下几组监考甲、监考乙用递增、递减或齿轮方法等串位,完全随机
#4
bcly08082025-04-17 13:28
回复 2楼 wengjl
监考甲、监考乙男、女搭配说明,比如说某位女老师在这7组中不能全与男生搭配。
#5
bcly08082025-04-17 13:38
回复 2楼 wengjl
具体分几组最好根据考试科目来定,每种考试的科目有所不同,就是无论分几组可能满足要求,我根据上传附件的男、女比例算了一下,应该够分
#6
my23182025-04-17 16:16
以下是引用bcly0808在2025-4-17 13:26:42的发言:

是的,监考甲、监考乙分配要完全随机,不想第一组分配完,第二组或以下几组监考甲、监考乙用递增、递减或齿轮方法等串位,完全随机

随机组合,遇到不符合要求的重新组合,直到分派结束,不知可否?
#7
bcly08082025-04-17 16:24
回复 6楼 my2318
第一二场还好说,如果涉及到场数多,不一直对不上
#8
wengjl2025-04-17 16:38
你配好的1089中有72组是 男+男 的,按前面的描述,这72组合是不符合的,甲监考是男的只能配女的乙监考,甲监考是女的可配男的或女的,换言之:甲监考是女的,可得到33组,甲是男的,可得到的组数是小于33的

这样理解是否正确???

#9
bcly08082025-04-17 21:41
回复 8楼 wengjl
jkj表(监考甲)里的数据是来自一所学校的,jky表(监考乙)里的数据是来自一所学校的
#10
bcly08082025-04-17 21:46
回复 8楼 wengjl
是的这72组是不符合要求的,如果在剩下的组合里筛选就可以了,还要保证某名女生监考教师在这七科任务里不能全与男生搭配
#11
bcly08082025-04-18 07:18
回复 8楼 wengjl
有思路了,在对接好里的表中删除甲、乙都是男的,剩上的随机筛选出7场
#12
bcly08082025-04-18 08:48
回复 11楼 bcly0808
思想是有了,测试没通过
#13
wengjl2025-04-18 09:13
甲组中有10位男的,乙组中有14位男的,所以男男组合 有 140 所以最后得的组合 是949
只有本站会员才能查看附件,请 登录


      ********************
      * 名称:甲乙监考教师搭配处理
      * 时间:2025-4-18
      * 来源:https://bbs.bc-cn.net/thread-514275-1-1.html
      ********************
      CLEAR
      CLEAR ALL
      SET SAFETY off
      SET engi 70      
      CLOSE DATABASES
      SELECT * from jkjmd wher 1=3 into cursor lstem readw
      SELECT lstem
      FOR i=1 to 33
        APPEND FROM jkjmd
      ENDFOR
      SELECT * from lstem orde by jxm into array ls
      SELECT 0
      USE ppjg alia bmk
      ZAP
      APPEND FROM array ls
      CLOSE DATABASES  
      SELECT 0
      USE ppjg alia bmk
      SELECT 0
      USE jkymd alia kg
      SELECT bmk
      DO while not EOF()
          xmj=bmk.jxm
          xbj=bmk.jxb
          nRen=RECNO()
          SELECT * ,0.0000000 as nn from kg into cursor tmp readw
          SELECT tmp
          REPLACE nn with RAND() all
          SELECT * from tmp orde by nn into cursor ls
          SELECT bmk
          GO top
          jls=1
          SCAN for bmk.jxm=xmj
            SELECT ls
            GO jls
            REPLACE bmk.yxm with ls.yxm,bmk.yxb with ls.yxb
            SELECT bmk
            jls=jls+1
          ENDSCAN
          SELECT bmk
          GO nRen+32
          SKIP 1
      ENDDO
      SELECT bmk
      DELETE FOR jxb=[男] and yxb=[男]
      PACK
      CLOSE DATABASES
      QUIT

只做了搭配部分。
监考落到试场中的部分,尚未完全理解...
#14
wengjl2025-04-18 09:15
以下是引用bcly0808在2025-4-18 08:48:15的发言:

思想是有了,测试没通过


继续努力,加油...等你好消息!
#15
xuminxz2025-04-18 12:12
回复 楼主 bcly0808
结果字段命名为什么是JXM2,YXM1(甲姓名2,乙姓名1?),有什么特殊含义吗?这样写代码很容易乱啊,可以成xm1,xm2,或 xmJ,xmY吗?要不是我理解错了,XM是考试项目?最后结果是Ksapb吧,可以用其它结构吗?



[此贴子已经被作者于2025-4-18 12:19编辑过]

#16
wengjl2025-04-18 16:29
以下是引用bcly0808在2025-4-18 08:48:15的发言:

思想是有了,测试没通过


部分内容有实现......抛砖引玉

只有本站会员才能查看附件,请 登录
#17
xuminxz2025-04-18 19:30
回复 楼主 bcly0808
一个程序,3个表。监考教师表,考试课程表,监考安排表。考试课程门次不限,每门考场数可不限。
只有本站会员才能查看附件,请 登录
,如有需要可以加一个判断男女人数的语句,男少禁止男男,女少禁止女女。
程序代码:
*!*    表及字段说明

*!*    jsmd-监考教师名单,XM-姓名,XB-性别,FZ-分组,1代表甲组-监考1,2代表乙-监考2 ; 如果不想让1组始终是主监考,可以在排好后,同组对调一下。
*!*    jkap-安排表,课程名称(也可以考试场次),姓名、性别
*!*    kskc-考试课程,kcmc 课程名称,kcs 考场数,wp1,wp2 未安排场次
Close Tables All
Use jsmd
Use jkap In 0
Zap In jkap
Use kskc In 0
Replace  wp1 With 0,wp2 With 0 All In kskc
ikskc=Reccount('kskc')
Count For fz='1' To rs1
Count For fz='2' To rs2
If rs1<>rs2 Then
    yorn=Messagebox('两组监考人数不相等,1组'+Alltrim(Str(rs1))+'人,2组'+Alltrim(Str(rs2))+'人。'+Chr(13)+'是否继续?',4+32+256,"提示")
    If yorn<>6 Then
        Return
    Else
        irs=rs1  && ?max(rs1,rs2) ?min(rs1,rs2)均可
    Endif
Endi
Select jkap
For i=1 To ikskc
    Go i In kskc
    _kcmc=Alltrim(kskc.kcmc)
    _kcs=kskc.kcs
    For j=1 To _kcs
        Insert Into jkap  (kcmc ) Values (_kcmc)
        Replace xlh With Rand() In jsmd All
        Select Top 1 xm,xb From jsmd Order By xlh Desc Where fz='1' And Not( xm In (Select xm1 From jkap Where Alltrim(kcmc)==_kcmc) )Into Curs tmp
        If Reccount('tmp')=0
            Replace xm1 With "NO" In jkap
            Replace wp1 With wp1+1 In kskc
**            loop
        Else
            _js1=Alltrim(tmp.xm)
            _xbn=(Alltrim(tmp.xb)='')
            Replace xb1 With tmp.xb,xm1 With _js1 In jkap
        Endif
**下面第二个老师
        Select Top 1 xm,xb From jsmd Order By xb,xlh  Where  fz='2' And !(xm In (Select xm2 From jkap Where Alltrim(kcmc)==_kcmc))  And !(xm In (Select xm2 From jkap  Where Alltrim(xm1)==_js1))  AND !(xb='' AND _xbn) Into Curs tmp
        
*  _xbn[color=#808080]=(ALLTRIM(tmp.xb)=''),(xb='')=_xbn 性别不能相同[/color]
*_xbn=(ALLTRIM(tmp.xb)=''),!((xb='')and_xbn) 性别不能同为男
        If Reccount('tmp')=0
            Replace xm2 With "NO" In jkap
            Replace wp2 With wp2+1 In kskc

**            loop
        Else
            Replace xm2 With tmp.xm,xb2 With tmp.xb In jkap
        Endif

    Endfor

Endfor




#18
schtg7 天前 06:38
回复 17楼 xuminxz
很好,学习啦!
#19
xuminxz7 天前 09:43
回复 18楼 schtg
如果你把表单发上来,用事件代码处理就方便多了。比如,预先指定部分监考、同科不监考、同科不同场、某人不监考某场……。不发表单上来很难处理。
#20
chychychy4 天前 09:34
先留个脚印,学习了
1