张小刚
摘 要:鉴于当前部分民办学校拥有较优质资源和教学实绩,往往出现报名人数多于录取人数的情况。这时,采用电脑软件进行随机派位录取是学校和社会所能接受的解决问题的普遍方法。本文介绍了电脑派位录取程序的原理及其编写。
关键词:电脑派位;随机;程序;源代码
中图分类号:TP312 文献标识码:B 文章编号:1673-8454(2008)22-0060-02
鉴于当前部分民办学校拥有较优质资源和教学实绩,往往出现报名人数多于录取人数的情况。这时,采用电脑软件进行随机派位录取是学校和社会所能接受的解决问题的普遍方法。鉴于社会关注度高等因素,决定了本程序设计必须做到选择公平公正、选择随机、源代码可以当场展示讲解且程序代码百分之百正确,因此,虽然程序原理及运行流程比较简单,许多学校也有具备一定知识水平的人员,却很少有敢于承担此项编程工作的。为此,本文就程序原理、代码编写及其在某校实际运行过程中的操作方法进行简要论述,并附全部源代码,以供参考。
一、编程语言的选择
由于关注度高,因此程序和运行环节的公正性要求能接受社会公开监督。有些学校为了保证其公正性不受置疑,除了请公证处全程公证,甚至采取电视直播的方法进行。这就要求我们的程序能以最简洁的代码来实现所需功能,以便能在运行前当场展示并讲解程序代码及原理。基于此,综合考虑当前流行的主要编程语言,我们优先选择了Visual Foxpro:代码简洁、便于讲解、源代码无需编译即可直接运行,同时其DBF文件格式与学校一般采用的Excel录入的报名学生名册文件可以自由转换。
二、程序原理
以在江苏省南通市有影响的某实验初中为例,要求在报名的1500多名学生中随机选择516人录取,分6个批次进行,前5批次每次取100人,最后取16人。程序运行时,先对原始数据文件进行备份,根据在屏幕上显示“第x批”按钮及当前待选库人数、本批选择进度条等组成程序运行界面。每按动“第x批”按键一次,电脑计算本批次应产生的选中人数(如果总的待选择数大于100则为100,否则为剩余数),随机对当前待选择库进行派位,直到选中本批次待选人数,显示选择结果,将选中名单导出到“批次.dbf”和“批次.xls”文件,并显示报告,将已选出名单从待选择库中删除,打印本批名单交公证处及相关人员签字,如果还有待选择名单,则屏幕界面上显示 “第x+1批”按钮,以供下一批次的选择,否则选择按钮显示为“选择结束”。
三、数据准备及代码编写
数据准备:将学校提供的经公证处检查认可的报名Excel文件保留其中的“姓名”、“身份证号”或登记号(需唯一)并另存生成bmk.DBF文件。打开该DBF文件,运行modi stru命令,添加“原始记录号”、“选中”、“选中顺序”三个数值型字段,运行命令repl all原始记录号 with recno(),数据准备完毕。
在新窗体添加四个标签,分别为Label1、Label2、Label3、Progress1,将Label2的Caption设置为“进度”且与Progress1水平对齐,将Progress1的BackColor设置为“0,0,255”,即蓝色,添加两个命令按钮,名称分别为Command1、Command2,将Command1的Caption设置为“第1批”,将Command2的Caption设置为“退出”。
1.对窗体的Init即初始化部分添加代码
*行前带*号的为注解
set esca off
set talk off
this.visible=.t.
this.autocenter=.t.
this.Command1.Caption="第1批"
public 批次,需选人数,已选出数,oldwidth
clos all
sele 1
use bmk
*将标志清0,防止被事先设置
repl all 选中 with 0,选中顺序 with 0
copy to bmk原始备份
批次=1
需选人数=516
this.label1.Caption="待选出总人数"+ltrim(str(需选人数))+",已选出0"
已选出数=0
**随机数初始化
rand(-100)
oldwidth=thisform.Progress1.width
coun to totalnow
this.label3.Caption="待选库现有总人数"+ltrim(str(totalnow))
**界面显示完成,等待进行选择
2.对Command1的Click即点击事件添加代码
rand(-100)
if 需选人数-已选出数>100 then
本批数=100
else
本批数=需选人数-已选出数
endi
go bott
库中还有总人数=recno()
本批已选=0
**当本批已选<本批数时 循环选择,考虑了防止被事先设置选中标记的情况
do whil 本批已选<本批数
**产生随机的选中行号随机数精度为小数后5位(0-1)
随机数=round(库中还有总人数*round(rand(),5),0)
**如果随机数 变量>=1,就去判断选择该行,
if 随机数>=1 then
go 随机数
**如果该行的选中标记不是1,那么“本批已选”变量加1,该行的“选中”为1,选择顺序放置在“选中顺序” if 选中<>1 then
本批已选=本批已选+1
repl 选中 with 1,选中顺序 with 本批已选
thisform.Progress1.width=本批已选*oldwidth/本批数
thisform.refresh
endi
endi
**空循环,产生延时效果
delay1=1
do whil delay1<10000
kk=round(123456789/456789.8,8)
delay1=delay1+1
endd
endd
**将本批选中的行拷贝到“批次.dbf”例如“1.dbf”
copy to ltrim(str(批次)) for 选中=1
**将本批选中的行拷贝到 批次.xls
copy to ltrim(str(批次)) xlsfor 选中=1
**将本批选中的行从当前待选择表删除
dele allfor 选中=1
pack
已选出数=已选出数+本批已选
thisform.Progress1.width=oldwidth
thisform.Label1.Caption="待选出总人数"+ltrim(str(需选人数))+",已选出"+ltrim(str(已选出数))
coun to totalnow
thisform.label3.Caption="待选库现有总人数"+ltrim(str(totalnow))
=MESSAGEBOX("第"+ltrim(str(批次))+"批"+ltrim(str(本批已选))+"已选出",48,'提示')
=MESSAGEBOX("本批名单已导出到文件"+ltrim(str(批次))+".xls及"+ltrim(str(批次))+".dbf",48,'提示')
批次=批次+1
if 已选出数<需选人数
thisform.Command1.Caption="第"+ltrim(str(批次))+"批"
else
=MESSAGEBOX('选择全部完成!',48,'提示')
thisform.Command1.Caption="选择结束"
thisform.Command1.Enabled=.f.
thisform.Command2.Enabled=.T.
endi
retu
CLOS all
四、程序运行
程序运行前,先将经公证处检验密封的派位运行专用电脑启封,查看派位程序运行的硬盘分区如E盘内容应为空白。将经公证处事先检验并密封的数据和程序U盘插上,将数据和程序从U盘拷贝到E盘,打开 Bmk.dbf文件当众展示,打开程序文件展示源代码并讲解其原理,即可准备运行。在每一批次(一般由嘉宾点击按钮)录取名单生成后,根据指示当场将运行文件夹下的如 “2.xls”文件打开,展示并打印交签字。
本软件通过简洁有效的代码实现了电脑随机派位录取,结合相应的操作流程,保证了整个选择的随机性、公平公正性,在实际应用中取得良好的社会效果。