| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1175 人关注过本帖
标题:求VFP代码:怎样调整学生使两个班的学生男女人数相差1人;住校和非住校人数 ...
只看楼主 加入收藏
inightwolf
Rank: 1
等 级:新手上路
帖 子:12
专家分:3
注 册:2012-8-20
收藏
得分:0 
1、手工求解的模型是:先按 性别+是否住校+成绩 排序,按照 “S”型分班
如:男住校生的新分班级依次为2、10、10、2、2、10、10、2..........
    女住校生的新分班级依次为2、10、10、2、2、10、10、2..........
    男非住校生的新分班级依次为2、10、10、2、2、10、10、2..........
    女非住校生的新分班级依次为2、10、10、2、2、10、10、2..........
 这样分的班基本能达到2个班男女人数、住校生非住校生人数、平均成绩均衡。
但这种分法不能保证2个班的平均成绩差距在1分以内。

2、据说可以通过交换两个班的学生来使2个班的平均成绩控制在1分以内:
假设按以上方法分班完成后,2班的平均成绩为av2;10班的平均成绩为av10; 2个班的总平均成绩为av
    av10>av2
调整方法:
   (1)、在10班随机找一个成绩大于av的学生,将新分班级改为2,然后再在2班找一个性别、是否住校与刚才变动的学生相同,平均成绩小于av的学生,新分班级改为10。
   (2)、判断2个班平均成绩是否差距在1分以内,如果是调整成功,否则继续(1)

算法是这样的,请各位大侠写一下VFP代码。


2012-08-21 20:45
茵梦湖
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:31
帖 子:545
专家分:2180
注 册:2009-4-25
收藏
得分:0 
以下是引用inightwolf在2012-8-21 20:45:40的发言:


2、据说可以通过交换两个班的学生来使2个班的平均成绩控制在1分以内:
假设按以上方法分班完成后,2班的平均成绩为av2;10班的平均成绩为av10; 2个班的总平均成绩为av
    av10>av2
调整方法:
   (1)、在10班随机找一个成绩大于av的学生,将新分班级改为2,然后再在2班找一个性别、是否住校与刚才变动的学生相同,平均成绩小于av的学生,新分班级改为10。
   (2)、判断2个班平均成绩是否差距在1分以内,如果是调整成功,否则继续(1)

算法是这样的,请各位大侠写一下VFP代码。



如果这样, 倒不如用 sql- orde by ... 来调整 2个班的最小平均成绩差~

程序代码:
...
...
ls调整 ="???"
for kk=1 to 10  && 调整限次
    sele tmp
    sum 成绩 to lsv for 班级=1
    ls差 =lsv-arx*arx(2)
    upda tmp调整 set 调整=abs(差-ls差)
    sele * from tmp调整 where !( 学号1$ls调整 .or.学号2$ls调整 ) orde by 调整 into curs tmp调整 readw
    if recc()=0.or.调整>=abs(ls差)
       exit
    endif
    ls调整 =学号1 +"/" +学号2
    upda tmp set 班级=iif(班级=1,2,1) where 学号$ls调整
endfor
sele 班级,cnt(*) 学生数,sum(iif("男"$性别,1,0)) 男,sum(iif("女"$性别,1,0)) 女,sum(iif("是"$是否住校,1,0)) 住校;
    ,sum(iif("否"$是否住校,1,0)) 走读,sum(成绩)/cnt(*) 平均成绩 from tmp grou by 1 into curs tmptj
brow titl "经( " +tran(kk-1) +"次/" +tran((kk-1)*2) +"学生 )的调整, 分班毕, 相关统计一览~"
retu


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


 

2012-08-23 15:33
wjp456789
Rank: 5Rank: 5
来 自:四川成都
等 级:职业侠客
威 望:1
帖 子:345
专家分:330
注 册:2012-6-25
收藏
得分:0 
太高深了!我弄了一个。不知道是否正确。请各位指点。
student.zip (5.01 KB)


[ 本帖最后由 wjp456789 于 2012-8-23 18:20 编辑 ]

我是来向高手学习的!
2012-08-23 17:43
ycvf
Rank: 2
等 级:论坛游民
帖 子:210
专家分:56
注 册:2012-8-25
收藏
得分:0 
学习中,。。。。

落花人独立,微雨燕双飞。
2012-08-25 17:22
jwcjwc
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-8-30
收藏
得分:0 
比较赞成版主的意见,分班实际上就是一个平衡问题,比如性别、成绩、地域等等,要均衡分班,先确定如下条件:专业、分班个数、每班人数、班级简称、分班规则(比如专业简称+年份+流水号)等,然后按这些条件先给均衡分班涉及到的几个情况order by 排个序,最后在生成排序表学生表内按照分班条件内分班即可。
附上一直在使用的一段代码:
SELECT curCustomer_zk1
GO top
DO WHILE !EOF()
aa=ALLTRIM(lqzy)
bb=ALLTRIM(xz)
cc=ALLTRIM(bjrs)
bhj=ALLTRIM(bhjc)
xqq=ALLTRIM(xq)
yxx=ALLTRIM(yx)


SELECT ksh,yx,xq,lqzy,xz,bh FROM curCustomer_zk WHERE lqzy=aa AND xz=bb AND xq=xqq AND yx=yxx INTO CURSOR temp readwrite
SELECT temp
GO top


DO WHILE !EOF()
   WAIT WINDOW AT 25,75  '正在进行分班,请等待...' NOWAIT
  
   IF this.Parent.check1.Value=1 AND yx='一年级工作部'
   hh=ALLTRIM(bhj)+SUBSTR(ALLTRIM(STR(YEAR(DATE()))),3,2)+REPLICATE('0',2-LEN(ALLTRIM(STR(MOD(RECNO(),VAL(ALLTRIM(cc)))+1,2))))+ALLTRIM(STR(MOD(RECNO(),VAL(ALLTRIM(cc)))+1,2))
   ELSE
   hh=ALLTRIM(bhj)+IIF(xqq='东校区','1',IIF(xqq='南校区','2','3'))+SUBSTR(ALLTRIM(STR(YEAR(DATE()))),3,2)+REPLICATE('0',2-LEN(ALLTRIM(STR(MOD(RECNO(),VAL(ALLTRIM(cc)))+1,2))))+ALLTRIM(STR(MOD(RECNO(),VAL(ALLTRIM(cc)))+1,2))
   ENDIF
   
   REPLACE bh WITH hh
   SKIP
ENDDO
UPDATE curCustomer_zk SET curCustomer_zk.bh=temp.bh from temp WHERE curCustomer_zk.ksh=temp.ksh
SELECT curCustomer_zk1
SKIP
ENDDO
=MESSAGEBOX("分班完成,谢谢您的使用")
2012-09-05 09:08
myvfpforver
Rank: 1
来 自:齐鲁大地
等 级:新手上路
威 望:2
帖 子:22
专家分:6
注 册:2012-8-3
收藏
得分:0 
楼主所说的均衡只能是相对的,即使达到平均分相差1分,这种分配也并不科学!另外,楼主想在平均分均衡的情况下男女生比例和住校生、非住校生比例也达到均衡,这也只能尽量达到,我认为,按成绩分班是最关键的依据,然后尽量达到性别、是否住校的尽量均衡。
    我认为,应该把所有学生按成绩排序,采用两头取的方式来分班(假设有100个学生,那么2班取第1名和第100名,10班取第2名和第99名,10班取第3名和第98名,2班取第4名和97名,如此继续,可保成绩基本均衡,这样分配学生应该是均衡的),然后查看性别、是否住校是否尽量均衡,如果差别太大,可以按成绩接近的手动调整。
2012-09-05 11:55
快速回复:求VFP代码:怎样调整学生使两个班的学生男女人数相差1人;住校和非住校 ...
数据加载中...
 
   



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

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