沈健 杨庆
在中小学教务工作中,每年的新生分班是一项重要工作。网上虽也有分班软件,但不一定适合自己的需要,且在不注册的情况下功能受限。自己做程序困难又大,笔者长期从事教务工作,对分班工作有一些见解。
首先简要说一下情况:
软件:从目前学校教务工作来看,大多还是使用VFP数据库或Excel电子表格进行数据加工,我们以下的操作环境主要基于这两种软件。
方法:第一种,“S”形分班,有的也称为拐“8”字形,假设要分3个班,则从最高分向下依次是1、2、3、3、2、1、1……反复循环直到最低分。分完以后,所有为班级为“1”的即1班,这样分出来较均衡。当然,有时可能会考虑更多因素,像男女生均衡,住校与不住校均衡。
第二种,“错位法”,如表1。
表1
意见:“S”形分班中,只要情况许可,尽量只按分数进行分班,因为考虑因素越多,分完班后成绩越不均衡。在完全按照成绩进行分班的情况下,“错位法”分班要比“S”形分班更均衡一些。
下面介绍方法,共分两种类型,“S”形和“错位”形,每一种又分别介绍VFP数据库方法和Excel方法。
一、“s”型分班法
(一)Excel方法
在Excel表中,假设表结构如表2。简要步骤如下:
表2
1.按总分从高到低进行排序。(最好是用“筛选”进行排序)
2.在序号栏中进行填充,从“1”开始填充,有100个学生则填充到100,注意不是填充名次。
3.在E2中,填入以下公式:“=IF(MOD(D2,2*8)>8,8-MOD(D2,8)+1,(IF(MOD(D2,2*8)=0,1,MOD(D2,2*8))))”(引号不要输入)。在以上公式中,“8”是要划分的班级个数,可以根据班级数的变化而修改,若分成n个班级,则总公式为“=IF(MOD(D2,2*n)>n,n-MOD(D2,n)+1,(IF(MOD(D2,2*n)=0,1,MOD(D2,2*n))))”(引号不要输入,在输入以上公式时,均在英文状态下输入)。
(二)VFP编程方法
如果习惯使用Microsoft VisuaL Foxpro程序,我们首先建立一个分班数据库,数据库结构如表3所示。在命令窗口中键入“modi comm fb.prg”(没有引号且要回车)创建源程序(如果打开程序后没有命令窗口,则点击vfp中“窗口”—“命令窗口”调出,或直接按CtrL+F2键也可以),然后我们输入以下代码(输入时,除在输入必要汉字时,其他均在英文状态下输入,在输入代码时,“&&”及后面字符为解释此语句的作用,以帮助您理解此语句的作用,您可以不用输入,此程序在windows7系统,vfp9.0中文版测试通过。为方便您区分数字“1”和小写字母“l”,本文中所有小写字母“l”已经替换为“L”)。
表3
set taLk off
SET SAFETY OFF
acce"请输入要分班的数据库:" to k
acce"请输入分班的数量 :" to sL
inde on -zf to zf
do whiL !eof()
x=1
do whiL x<=&sL
repL bj with x
x=x+1
IF EOF()
EXIT
ELSE
SKIP
endif
endd
x=&sL
do whiL x>=1
repL bj with x
x=x-1
IF EOF()
EXIT
ELSE
SKIP
endif
endd
endd
brow &&查看结果
代码键入完成后,我们按“Ctrl+W”保存,命令窗口中我们键入“do fb.prg”,输入数据库名及要分班的数量即可完成分班。分班完成后可以用“List to prin for bj=1”语句将每个班的数据打印出来(bj=1,bj=2……分别打印),也可以用“copy to bj1.xls type xls for bj=1”语句将结果导出成xLs格式。
二、“错位”分班法
(一)Excel方法
ExceL方法如下(exceL結构如表4):
表4
1.按总分进行排序;
2.在“序号”栏中进行填充,从“0”开始填充,100个学生则填充到99;
3.在分班E2单元格中,填入公式:“=MOD(INT(D2/4)+MOD(D2,4),4)+1”
如果要分为其他班级数(n为班级数),则通用公式为:“=MOD(INT(D2/n)+MOD(D2,n),n)+1”
(二)VFP编程方法
此程序在windows7系统,vfp9.0中文版测试通过。
SET TALK OFF
SET SAFETY OFF
acce"请输入要分班的数据库:" to sjkmc_fb
acce"您要从几班开始分?(数学1,2,3...)" to a1
acce"告诉我最后一个班级数是多少?(数字1,2,3...)"to a2
fbks=VAL(a1)&&将a1变量转为数值型
fbjs=VAL(a2)&&将a2变量转为数值型
USE(sjkmc_fb)
SORT TO tempLs ON zf/dec
IF fbks=1
USE tempLs
REPLACE ALL bj WITH MOD(INT((RECNO()-1)/ fbjs)+MOD(RECNO()-1,fbjs),fbjs)+1
COPY TO (sjkmc_fb)
USE (sjkmc_fb)
Brow
ELSE
USE tempLs
fbks_a=fbks-1
fbjs_a=fbjs-fbks+1
REPLACE ALL bj WITH MOD(INT((RECNO()-1)/fbjs_a)+MOD(RECNO()-1,fbjs_a),fbjs_a)+1+fbks_a
COPY TO (sjkmc_fb)
USE (sjkmc_fb)
brow
ENDIF
SET TALK ON
SET SAFETY on
经过比较,错位分班法要较走“S”形分班,在分数分布上更加均匀一些。
参考文献:
[1]高大庆.电脑爱好者[J].2008(16):58.