張小剛
摘 要:鑒于當(dāng)前部分民辦學(xué)校擁有較優(yōu)質(zhì)資源和教學(xué)實(shí)績(jī),往往出現(xiàn)報(bào)名人數(shù)多于錄取人數(shù)的情況。這時(shí),采用電腦軟件進(jìn)行隨機(jī)派位錄取是學(xué)校和社會(huì)所能接受的解決問題的普遍方法。本文介紹了電腦派位錄取程序的原理及其編寫。
關(guān)鍵詞:電腦派位;隨機(jī);程序;源代碼
中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:B 文章編號(hào):1673-8454(2008)22-0060-02
鑒于當(dāng)前部分民辦學(xué)校擁有較優(yōu)質(zhì)資源和教學(xué)實(shí)績(jī),往往出現(xiàn)報(bào)名人數(shù)多于錄取人數(shù)的情況。這時(shí),采用電腦軟件進(jìn)行隨機(jī)派位錄取是學(xué)校和社會(huì)所能接受的解決問題的普遍方法。鑒于社會(huì)關(guān)注度高等因素,決定了本程序設(shè)計(jì)必須做到選擇公平公正、選擇隨機(jī)、源代碼可以當(dāng)場(chǎng)展示講解且程序代碼百分之百正確,因此,雖然程序原理及運(yùn)行流程比較簡(jiǎn)單,許多學(xué)校也有具備一定知識(shí)水平的人員,卻很少有敢于承擔(dān)此項(xiàng)編程工作的。為此,本文就程序原理、代碼編寫及其在某校實(shí)際運(yùn)行過(guò)程中的操作方法進(jìn)行簡(jiǎn)要論述,并附全部源代碼,以供參考。
一、編程語(yǔ)言的選擇
由于關(guān)注度高,因此程序和運(yùn)行環(huán)節(jié)的公正性要求能接受社會(huì)公開監(jiān)督。有些學(xué)校為了保證其公正性不受置疑,除了請(qǐng)公證處全程公證,甚至采取電視直播的方法進(jìn)行。這就要求我們的程序能以最簡(jiǎn)潔的代碼來(lái)實(shí)現(xiàn)所需功能,以便能在運(yùn)行前當(dāng)場(chǎng)展示并講解程序代碼及原理。基于此,綜合考慮當(dāng)前流行的主要編程語(yǔ)言,我們優(yōu)先選擇了Visual Foxpro:代碼簡(jiǎn)潔、便于講解、源代碼無(wú)需編譯即可直接運(yùn)行,同時(shí)其DBF文件格式與學(xué)校一般采用的Excel錄入的報(bào)名學(xué)生名冊(cè)文件可以自由轉(zhuǎn)換。
二、程序原理
以在江蘇省南通市有影響的某實(shí)驗(yàn)初中為例,要求在報(bào)名的1500多名學(xué)生中隨機(jī)選擇516人錄取,分6個(gè)批次進(jìn)行,前5批次每次取100人,最后取16人。程序運(yùn)行時(shí),先對(duì)原始數(shù)據(jù)文件進(jìn)行備份,根據(jù)在屏幕上顯示“第x批”按鈕及當(dāng)前待選庫(kù)人數(shù)、本批選擇進(jìn)度條等組成程序運(yùn)行界面。每按動(dòng)“第x批”按鍵一次,電腦計(jì)算本批次應(yīng)產(chǎn)生的選中人數(shù)(如果總的待選擇數(shù)大于100則為100,否則為剩余數(shù)),隨機(jī)對(duì)當(dāng)前待選擇庫(kù)進(jìn)行派位,直到選中本批次待選人數(shù),顯示選擇結(jié)果,將選中名單導(dǎo)出到“批次.dbf”和“批次.xls”文件,并顯示報(bào)告,將已選出名單從待選擇庫(kù)中刪除,打印本批名單交公證處及相關(guān)人員簽字,如果還有待選擇名單,則屏幕界面上顯示 “第x+1批”按鈕,以供下一批次的選擇,否則選擇按鈕顯示為“選擇結(jié)束”。
三、數(shù)據(jù)準(zhǔn)備及代碼編寫
數(shù)據(jù)準(zhǔn)備:將學(xué)校提供的經(jīng)公證處檢查認(rèn)可的報(bào)名Excel文件保留其中的“姓名”、“身份證號(hào)”或登記號(hào)(需唯一)并另存生成bmk.DBF文件。打開該DBF文件,運(yùn)行modi stru命令,添加“原始記錄號(hào)”、“選中”、“選中順序”三個(gè)數(shù)值型字段,運(yùn)行命令repl all原始記錄號(hào) with recno(),數(shù)據(jù)準(zhǔn)備完畢。
在新窗體添加四個(gè)標(biāo)簽,分別為L(zhǎng)abel1、Label2、Label3、Progress1,將Label2的Caption設(shè)置為“進(jìn)度”且與Progress1水平對(duì)齊,將Progress1的BackColor設(shè)置為“0,0,255”,即藍(lán)色,添加兩個(gè)命令按鈕,名稱分別為Command1、Command2,將Command1的Caption設(shè)置為“第1批”,將Command2的Caption設(shè)置為“退出”。
1.對(duì)窗體的Init即初始化部分添加代碼
*行前帶*號(hào)的為注解
set esca off
set talk off
this.visible=.t.
this.autocenter=.t.
this.Command1.Caption="第1批"
public 批次,需選人數(shù),已選出數(shù),oldwidth
clos all
sele 1
use bmk
*將標(biāo)志清0,防止被事先設(shè)置
repl all 選中 with 0,選中順序 with 0
copy to bmk原始備份
批次=1
需選人數(shù)=516
this.label1.Caption="待選出總?cè)藬?shù)"+ltrim(str(需選人數(shù)))+",已選出0"
已選出數(shù)=0
**隨機(jī)數(shù)初始化
rand(-100)
oldwidth=thisform.Progress1.width
coun to totalnow
this.label3.Caption="待選庫(kù)現(xiàn)有總?cè)藬?shù)"+ltrim(str(totalnow))
**界面顯示完成,等待進(jìn)行選擇
2.對(duì)Command1的Click即點(diǎn)擊事件添加代碼
rand(-100)
if 需選人數(shù)-已選出數(shù)>100 then
本批數(shù)=100
else
本批數(shù)=需選人數(shù)-已選出數(shù)
endi
go bott
庫(kù)中還有總?cè)藬?shù)=recno()
本批已選=0
**當(dāng)本批已選<本批數(shù)時(shí) 循環(huán)選擇,考慮了防止被事先設(shè)置選中標(biāo)記的情況
do whil 本批已選<本批數(shù)
**產(chǎn)生隨機(jī)的選中行號(hào)隨機(jī)數(shù)精度為小數(shù)后5位(0-1)
隨機(jī)數(shù)=round(庫(kù)中還有總?cè)藬?shù)*round(rand(),5),0)
**如果隨機(jī)數(shù) 變量>=1,就去判斷選擇該行,
if 隨機(jī)數(shù)>=1 then
go 隨機(jī)數(shù)
**如果該行的選中標(biāo)記不是1,那么“本批已選”變量加1,該行的“選中”為1,選擇順序放置在“選中順序” if 選中<>1 then
本批已選=本批已選+1
repl 選中 with 1,選中順序 with 本批已選
thisform.Progress1.width=本批已選*oldwidth/本批數(shù)
thisform.refresh
endi
endi
**空循環(huán),產(chǎn)生延時(shí)效果
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
**將本批選中的行從當(dāng)前待選擇表刪除
dele allfor 選中=1
pack
已選出數(shù)=已選出數(shù)+本批已選
thisform.Progress1.width=oldwidth
thisform.Label1.Caption="待選出總?cè)藬?shù)"+ltrim(str(需選人數(shù)))+",已選出"+ltrim(str(已選出數(shù)))
coun to totalnow
thisform.label3.Caption="待選庫(kù)現(xiàn)有總?cè)藬?shù)"+ltrim(str(totalnow))
=MESSAGEBOX("第"+ltrim(str(批次))+"批"+ltrim(str(本批已選))+"已選出",48,'提示')
=MESSAGEBOX("本批名單已導(dǎo)出到文件"+ltrim(str(批次))+".xls及"+ltrim(str(批次))+".dbf",48,'提示')
批次=批次+1
if 已選出數(shù)<需選人數(shù)
thisform.Command1.Caption="第"+ltrim(str(批次))+"批"
else
=MESSAGEBOX('選擇全部完成!',48,'提示')
thisform.Command1.Caption="選擇結(jié)束"
thisform.Command1.Enabled=.f.
thisform.Command2.Enabled=.T.
endi
retu
CLOS all
四、程序運(yùn)行
程序運(yùn)行前,先將經(jīng)公證處檢驗(yàn)密封的派位運(yùn)行專用電腦啟封,查看派位程序運(yùn)行的硬盤分區(qū)如E盤內(nèi)容應(yīng)為空白。將經(jīng)公證處事先檢驗(yàn)并密封的數(shù)據(jù)和程序U盤插上,將數(shù)據(jù)和程序從U盤拷貝到E盤,打開 Bmk.dbf文件當(dāng)眾展示,打開程序文件展示源代碼并講解其原理,即可準(zhǔn)備運(yùn)行。在每一批次(一般由嘉賓點(diǎn)擊按鈕)錄取名單生成后,根據(jù)指示當(dāng)場(chǎng)將運(yùn)行文件夾下的如 “2.xls”文件打開,展示并打印交簽字。
本軟件通過(guò)簡(jiǎn)潔有效的代碼實(shí)現(xiàn)了電腦隨機(jī)派位錄取,結(jié)合相應(yīng)的操作流程,保證了整個(gè)選擇的隨機(jī)性、公平公正性,在實(shí)際應(yīng)用中取得良好的社會(huì)效果。