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