考試是教師檢查學(xué)生學(xué)習(xí)情況的必要手段,但出卷卻是一種繁重的智力和體力勞動,傳統(tǒng)的標(biāo)準(zhǔn)化試卷命題,需要由教學(xué)專家組成一個命題班子,根據(jù)許多優(yōu)秀教師多年的教學(xué)經(jīng)驗,從貫徹教學(xué)大綱要求,到試卷意圖的組織,經(jīng)過反復(fù)的推敲,才能完成一份標(biāo)準(zhǔn)化的試卷。這樣的命題方式不僅工作任務(wù)繁重而且試卷的標(biāo)準(zhǔn)化程度、難易程度、題量大小等各方面難以控制,難以形成有效的試題庫,給試題和試卷的管理帶來很多問題和困難。鑒于這種情況,利用計算機(jī)進(jìn)行試卷的自動生成并逐步積累形成有效的試題庫,對試題和試卷的管理將變得高效而便捷,對提高工作效率,使試卷管理逐步走向正規(guī)化自動化將起到十分重要的作用。同時使出卷工作變得輕松愉快,從很大程度上減輕了教師利用傳統(tǒng)的出卷方式組卷的繁重工作量,大大節(jié)省了老師的工作時間,便于教師有更多的時間和精力致力于教學(xué)方法的研究。今日, 隨著計算機(jī)的應(yīng)用的普及和硬件設(shè)備性能和軟件制作水平的提高,為研制開發(fā)高性能的試題管理軟件提供了條件。
作為在教學(xué)第一線的老師,往往需要及時了解學(xué)生對某一章節(jié)知識掌握的情況,經(jīng)常需要對學(xué)生進(jìn)行形成性測驗和終結(jié)性測試,來發(fā)現(xiàn)教學(xué)中的問題,從而調(diào)整教學(xué)進(jìn)度,改進(jìn)教學(xué)方法。不少軟件開發(fā)者看到了教育工作者在這一領(lǐng)域的需求相繼推出了一批與試題管理有關(guān)的操作軟件,其中不乏非常出色的作品。但是從試題管理這一方面來看,用戶反應(yīng)平淡,感覺中意的不多。我們不禁要問:為什么是這樣的結(jié)局?老師們最需要的是什么呢?
§2.1 試題庫分析 在試題庫方面,老師最需要的是對試題庫管理的自主性。老師們渴望能自由地操縱試題庫,具體表現(xiàn)在以下三個方面:
(1)自主初始化試題庫;
(2)自主維護(hù)試題庫;
(3)自主設(shè)計試卷。
※自主初始化試題庫
即用戶擁有創(chuàng)建新試題庫的權(quán)力,用戶能夠根據(jù)自己的需要,設(shè)計試題的儲存方案以及試題的屬性名和各屬性值,實現(xiàn)試題庫用戶個性化設(shè)計,讓試題庫真正成為用戶自己的試題庫。。用戶不喜歡這一種不能自主控制的試題分類方案,用戶希望自主地初始化試題庫。
※自主維護(hù)試題庫
即用戶具有添加、修改和刪除試題的權(quán)力,實現(xiàn)試題庫的可擴(kuò)充性和開放性,使用戶對試題庫具有至高無上的支配權(quán),F(xiàn)在已經(jīng)推出的幾乎所的試題管理軟件都不具備這樣的功能,用戶所使用的試題被程序制作者預(yù)先寫在某個文件中,這些文件不是隱藏得讓用戶難以找到就是經(jīng)過加密處理,用戶根本就不可能通過其它方式(比如Word、Access、WPS等)打開并看到它,更談不上對它的擴(kuò)充、修改和對某個試題的刪除了。由于用戶沒有自主維護(hù)試題庫的權(quán)力,新試題無法錄入,陳舊試題無法刪除,這樣的試題庫在較短的時間內(nèi)就逐漸老化、失去活力。用戶需要自主地維護(hù)試題庫,希望及時地更新試題庫。
※自主設(shè)計試卷
現(xiàn)有的某些試題管理軟件不僅不支持試題庫中試題的修改,生成的試卷也不可以修改,連加一個空格修改字體都不行,試卷保存后不能為其它系統(tǒng)(比如Word、WPS等)識別,只能從打印機(jī)上輸出,這種方案沒有多少實用性。
試題庫要保證一定的規(guī)模,給隨機(jī)選擇以較大的范圍。建立題庫是一個復(fù)雜的系統(tǒng)工程,首先要建立系統(tǒng)的數(shù)學(xué)模型,然后確定試題的屬性指標(biāo)以及試題的組成結(jié)構(gòu),再組織大批量的優(yōu)秀學(xué)科教師編寫試題,為了保證這些試題的科學(xué)性和有效性,對每一題試題進(jìn)行抽樣測試,對試題參數(shù)標(biāo)注的有效性進(jìn)行校正,建立起一個實用的題庫系統(tǒng),另外,應(yīng)該對題庫的管理實行一定程度上的開放性,以不斷提高題庫的質(zhì)量和可維護(hù)性。建立題庫是一項相當(dāng)復(fù)雜的系統(tǒng)工程,不僅開發(fā)需要大量的人力和時間,而且還要花費相當(dāng)?shù)臅r間和人力物力去維護(hù)調(diào)整,才能真正在教育中發(fā)揮作用。
§2.2 組卷分析 一般地說,對題庫系統(tǒng)組織試卷的要求是根據(jù)出卷者的需求產(chǎn)生一份對于測驗?zāi)繕?biāo)(如教學(xué)評價、學(xué)生能力水平評價等)有價值的測驗試卷。因此,在組卷時,用戶要提出組卷要求,通常包括題目內(nèi)容范圍、題目類型、題目數(shù)量和測驗?zāi)繕?biāo)等方面。這些要求應(yīng)轉(zhuǎn)化成試卷每個題目的量化參數(shù)才能被系統(tǒng)使用。例如按照測驗?zāi)繕?biāo)各知識點內(nèi)容所占比例數(shù),各層次的目標(biāo)(記憶、理解、綜合、應(yīng)用等)分別由哪些題型反映,每種題型在試卷中的數(shù)量,各難度級在卷中所占比例,難度等要求。量化工作可以由人工完成,然后按一定格式送入系統(tǒng)中。也可以由系統(tǒng)在一定程度上自動完成量化轉(zhuǎn)換,形成相應(yīng)的組卷參數(shù)。
要解決的一個首要問題是組卷策略的選擇。它在很大程度上決定著系統(tǒng)的成敗與否。組卷策略的實質(zhì)是將對人比較直觀明了的組卷參數(shù)變換成計算機(jī)能夠直接操作的試題屬性項,然后根據(jù)這些屬性項,在題庫中抽取試題組成試卷。因此,完整的組卷策略應(yīng)該由三部份組成:試題屬性項定義、組卷參數(shù)的定義、變換算法的說明。所謂計算機(jī)組卷至少應(yīng)該保證以下幾個方面的平衡方可考慮試卷的可接受性:
a) 整卷的題型比例要合理
- 整卷的章節(jié)比例要合理
- 整卷的難度分配要適度
d) 要保證隨機(jī)性
一種做法是,讓出題者按照一定格式描述試卷編制計劃信息,如卷內(nèi)題目在題型和難度上的分布,知識點內(nèi)容在各目標(biāo)層次上的分布(包括數(shù)量),然后通過一定算法變換成試卷試題的具體要求。另外一種做法是將課程目標(biāo)與內(nèi)容信息在系統(tǒng)中建立一個目標(biāo)/內(nèi)容分布關(guān)系表。
在題庫中按上述量化的組卷要求查找符合條件的題目進(jìn)行出題組卷,一般都采用匹配方法。精確匹配可以組出完全符合量化標(biāo)準(zhǔn)的試卷,但有時會出現(xiàn)組卷策略無法實現(xiàn)的情況(即查不到完全符合條件要求的題目)。為了避免這種情況,設(shè)計組卷策略時要考慮怎樣解決它。常用的辦法之一是形成并試用新的組卷策略,這種做法會帶來時間上的浪費。另一種辦法是把精確匹配改成近似匹配。采用近似匹配時應(yīng)事先規(guī)定所選題目在內(nèi)容、目標(biāo)、題型與難度等各指標(biāo)上是否可以與出題要求不完全一致,能不能有一一定的模糊度。若模糊度為0表示必須精確匹配;而非零值則青示可有多大的變異度。在后種條件下,若找不到完全符合要求的題目,就可以在模糊度許可范圍內(nèi)查找近似匹配的題目。
§2.3本系統(tǒng)簡介:基于以上諸因素的考慮,設(shè)計了本系統(tǒng):本系統(tǒng)以高一的英語教育為背景進(jìn)行設(shè)計,其意旨在于提供一個適合于形成性測試和階段性測試的自動組卷系統(tǒng)。本系統(tǒng)能快速方便地提供各種要求的試卷,幫助教師把握教學(xué)的進(jìn)度,及時地反饋教學(xué)中的問題,以改進(jìn)教學(xué)方法和調(diào)整教學(xué)重點。
功能:本系統(tǒng)主要有2大功能模塊組成:一,題庫管理;二,自動組卷。具體的功能及實現(xiàn)將在后面做詳細(xì)介紹。
特點:1.易用性:人機(jī)交互界面友好,不要求使用者具有太多的計算機(jī)知識
2.先進(jìn)性:前端自動組卷+后端題庫管理+優(yōu)選試題
3.合理性:結(jié)合國家教材,符合教學(xué)大綱。
4.實用性:教師減負(fù)第一步,幫助教師從煩瑣的出卷工作中解脫出來
實現(xiàn)工具:基于試題庫的自動組卷系統(tǒng)即以強(qiáng)大的試題數(shù)據(jù)庫作為后臺支持,由于Access是目前比較流行的一種數(shù)據(jù)庫軟件,它允許并很容易地用多種方式進(jìn)行篩選、分類和更新數(shù)據(jù),因此本系統(tǒng)中采用Access來構(gòu)建系統(tǒng)數(shù)據(jù)庫。作為與用戶做交互界面的前臺,本系統(tǒng)采用Visual Basic 6.0作為開發(fā)工具,它具有豐富的控件、先進(jìn)的ADO數(shù)據(jù)訪問技術(shù)、數(shù)據(jù)報表輸出技術(shù)等。
第三章 數(shù)據(jù)庫的設(shè)計
數(shù)據(jù)庫的庫結(jié)構(gòu)對于整個系統(tǒng)的性能起著重要作用。它是本系統(tǒng)的基礎(chǔ)。一個題庫將存放大量的題目,這些題目在計算機(jī)內(nèi)如何存儲將直接影響題庫系統(tǒng)的工作效率和效果,因此題庫結(jié)構(gòu)的設(shè)計是題庫系統(tǒng)設(shè)計開發(fā)的關(guān)鍵一環(huán)。題庫結(jié)構(gòu)設(shè)計時要考慮題庫的基本特征。題庫結(jié)構(gòu)設(shè)計最基礎(chǔ)的工作應(yīng)包括確定題目類型、規(guī)定試題屬性及題庫總體數(shù)據(jù)結(jié)構(gòu)的確立等幾方面。題庫是計算機(jī)輔助測驗系統(tǒng)的基礎(chǔ)。一個大的測驗系統(tǒng)的題庫應(yīng)能容納足夠數(shù)量的題目,這些題目在題庫中的組織、分類及其特征信息的確立與描述將直接影響系統(tǒng)的工作效率與效果。
本系統(tǒng)總共構(gòu)建了2個數(shù)據(jù)庫文件:系統(tǒng)數(shù)據(jù)庫datadb和臨時數(shù)據(jù)庫temp。
§3.1 datadb 數(shù)據(jù)庫 因為本系統(tǒng)是以英語教學(xué)為例,因此構(gòu)建了一個用于存儲英語試題及相關(guān)屬性的試題數(shù)據(jù)庫。在程序中設(shè)置別名為datadb。在該庫中共建立了6張表,其表名分別為:
a:選擇題
b:完型填空
c:閱讀理解
d:短文改錯
e:書面表達(dá)
f:登錄
◘3.1.1 試題文件
a~e是對應(yīng)于英語中常見的五種題型的試題文件表。為了通用起鑒,為每張表設(shè)置了相同的字段,依次為題號、分值、難度、章節(jié)分布、題目以及答案6個屬性。
· 題號---整型,設(shè)置為主鍵,即為試題庫中題目的編號;
· 分值----整型,是該題的分?jǐn)?shù);
· 難度----字符型,它的設(shè)置采用了3位編碼:用三個數(shù)字來表示該題的難度。對于不同的表,它的含義略微不同。在完型填空、短文改錯中,左起第一位、第二、第三位依次表示在該題中較容易、中等難度、較難得分的題目總分值(比如在完型填空中,有25小題,若每題為1分,則難度系數(shù)為988表示的意思為有9題是容易的題目,有8題為中等的,另外的8題是較難的題目),對于書面表達(dá)這種大題,沒有小題的設(shè)置,則難度系數(shù)的含義稍有差異(若書面表達(dá)的總分為20分,則難度為875表示8分是比較容易得到的,7分是中等水平的學(xué)生才能獲得的,而最后的5分則是較少部分的學(xué)生才能的到。)對于選擇題而言,它每題的分值較少,因此不再對分值拆分,只在相對難度位置上出現(xiàn)該題分值,如100表示該題屬于容易題,總分為1分,010表示該題為中等題。雖然各表中的難度屬性的含義看似有上述的差異,但是對于表達(dá)難度這個概念而言,它們所能實現(xiàn)的功能是一樣的,因此在程序中對于每個表中的難度做同樣的處理。
· 章節(jié)分布----字符型。在該系統(tǒng)設(shè)計的過程中,通過對高一的英語教材的分析和研究,把整個年級階段的知識點按教學(xué)進(jìn)度劃分為十個章節(jié),用A~J表示,在A~J之后用數(shù)字表示的則是該章節(jié)中所涉及的細(xì)微的知識點。(001:虛詞;010實詞;011: 時態(tài);100:語法;101:結(jié)構(gòu);110:語態(tài);111:情景意境),比如某選擇題的的章節(jié)分布為C110表示的是它所要考查的知識點是屬于第三章中的語態(tài)。定義了總體上的A~J個章節(jié),則可以在不同的教學(xué)時期,選擇不同章節(jié)屬性的試題來測試,以避免試題不適合教學(xué)進(jìn)度的情況。之所以要對每個章節(jié)分開定義001~111等知識點,是因為由于教學(xué)進(jìn)度不同,雖然是相同的知識點,但是在不同階段對學(xué)生的要求是不一樣的。
· 題目---備注型。這是在最終生成的試卷中真正要出現(xiàn)的部分。
· 答案---備注型。同題目的性質(zhì)一樣,但它們是分別輸出到不同的文檔中相互獨立保存和打印的。
以上描述了存儲五種題型的5張數(shù)據(jù)表中各個字段含義。接下來來介紹一下最后一張數(shù)據(jù)表---登錄表中的屬性設(shè)置。
◘3.1.2 登錄文件
該表中總共設(shè)置了三個字段屬性---用戶名,密碼,訪問次數(shù)。
· 用戶名--字符型,是每條記錄中的主鍵,值唯一,不能重復(fù)。數(shù)字、字母都可以。在系統(tǒng)的使用過程中,具有一定權(quán)限的管理員可以對其進(jìn)行刪除和增加。
· 密碼--用于核準(zhǔn)用戶的權(quán)限,避免一些不合法的人進(jìn)入系統(tǒng)進(jìn)行破壞活動。
· 訪問次數(shù)--整型 用來顯示該用戶已經(jīng)使用過本系統(tǒng)的次數(shù)。
§3.2 tempdb數(shù)據(jù)庫
其中只有一張數(shù)據(jù)表—temp。它用來存儲在抽取試題過程中產(chǎn)生的一些中間數(shù)據(jù)。有2個字段:題目和答案,均為備注型。在系統(tǒng)運行過程中,該表中的數(shù)據(jù)會被不斷的更新。
- 系統(tǒng)總體結(jié)構(gòu)設(shè)計
根據(jù)系統(tǒng)各模塊的實現(xiàn),系統(tǒng)主要結(jié)構(gòu)即流程圖如下所示:
圖4-1總體結(jié)構(gòu)圖
§5.1 用戶登錄模塊
● 功能:該模塊是檢驗用戶的合法性

● 窗口設(shè)計如下:
圖5-1 登錄界面
● 設(shè)計思路:當(dāng)該模塊被加載時,從數(shù)據(jù)庫中的登錄表中讀取已經(jīng)存在的用戶名。將用戶名逐一添加到組合列表框的選項中,以供用戶選擇,(可以避免用戶手動輸入之繁),在用戶選擇了某個用戶以及在密碼框中輸入了密碼之后(以*顯示),在按下“登錄”鍵的時候,系統(tǒng)從數(shù)據(jù)表中找到對應(yīng)該用戶名的記錄,然后檢查所輸入的密碼是否與數(shù)據(jù)庫中的密碼一致,若不一致,則提示密碼錯誤,拒絕登錄;若一致,則顯示該用戶以往登錄的次數(shù),允許進(jìn)行后面的操作。
● 代碼實現(xiàn) (以下代碼中‘后為注釋)
Private Sub Form_Load()
login.Picture = LoadPicture(App.Path & "\login2.jpg")
Adodc1.ConnectionString= “provider=Microsoft.Jet.OLEDB.4.0;DataSource="+App.Path+\datadb.mdb"
Adodc1.RecordSource = "登錄" ‘ 數(shù)據(jù)庫連接
Adodc1.Refresh
Adodc1.Recordset.MoveFirstDo While Not Adodc1.Recordset.EOF
Combo1.AddItem Adodc1.Recordset("用戶名")
Adodc1.Recordset.MoveNext
Loop
End Sub Private Sub denglu_Click()
Adodc1.Recordset.MoveFirstFor p = 1 To userid
Adodc1.Recordset.MoveNext
Next
If Text1.Text <> Adodc1.Recordset("密碼") Then
MsgBox "您輸入的密碼不正確,請重新登錄", vbCritical, "錯誤提示"
Else
cnt = Adodc1.Recordset("訪問次數(shù)") + 1
k = MsgBox("祝賀你成功登錄 " + Chr(13) + "這是您第" & cnt & "次訪問該系統(tǒng)", vbOKOnly, "Congratulations")
Adodc1.Recordset("訪問次數(shù)") = cnt
Adodc1.Recordset.update
End If
If k = 1 Then
enter.Visible = True
Unload Me
Load enter
End If
End Sub
§5.2 系統(tǒng)維護(hù)模塊
功能:對系統(tǒng)的安全等做一些基本的維護(hù),如添加數(shù)據(jù)庫,修改密碼,增加用戶等。由于該模塊功能只有具有一定權(quán)限的管理員才能使用,因此在激活該菜單之前要求輸入管理員密碼。各具體功能設(shè)計如下:
◘5.2.1 新建數(shù)據(jù)庫:用戶通過文件對話框選擇保存數(shù)據(jù)庫的路徑,鍵入數(shù)據(jù)庫名,完成以后就會在選定的路徑下新建一個access數(shù)據(jù)庫。
其實現(xiàn)代碼如下:
Private Sub newdb_Click( )
CommonDialog1.Flags = 0CommonDialog1.ShowSave
newd = CommonDialog1.FileName
Set MSAccess = New Access.Application
MSAccess.Visible = True
MSAccess.NewCurrentDatabase (newd)
End Sub

◘5.2.2 修改密碼:窗口啟動時,從數(shù)據(jù)庫中讀取所有用戶名,添加于列表中,要求用戶輸入原始密碼和新密碼,若原始密碼與數(shù)據(jù)庫中的密碼數(shù)據(jù)一致,則把新密碼中值替換數(shù)據(jù)庫中的原始密碼字段,保存,若輸入的原始密碼不正確,則給出出錯信息。窗口如圖5-2所示:
圖5-2 修改密碼界面
代碼實現(xiàn)同登錄類似,在此略。
◘5.2.3添加用戶:通過向文本框中輸入用戶名和密碼向“登錄”表中追加一條新的記錄,同時設(shè)置該字段的“訪問次數(shù)”值為0。
§5.3 題庫管理模塊
● 功能 包括對庫中試題的瀏覽、刪除、修改、更新、添加等。
● 特點
1.難度、題型、分值、章節(jié)均可根據(jù)學(xué)校實際教學(xué)使用需要任意設(shè)置。
2.提供開放式試題數(shù)據(jù)庫功能,用戶可方便的錄入、編輯、修改和保存自己的試題和試卷,并且能直接加入本系統(tǒng)的數(shù)據(jù)庫,利用本系統(tǒng)進(jìn)行統(tǒng)一管理。
窗口設(shè)計如下:

圖5-3 題庫管理窗口
◘5.3.1 瀏覽 當(dāng)單擊“題庫管理”下的“瀏覽”子菜單時,出現(xiàn)類似如上窗口的界面,從左邊的組合框中選擇科目“英語”及題型,就可以在主窗體中顯示相對應(yīng)的數(shù)據(jù)庫中的內(nèi)容,它是由adodc1(0..4)5個控件對各題型的數(shù)據(jù)表進(jìn)行綁定,然后利用datagrid1(0..4)控件顯示出來。由于題目這個備注型字段中的字符較多,不能全部在字段欄里顯示,加之題目的內(nèi)容是用戶最為關(guān)注的,因此單獨設(shè)立了對應(yīng)的題目區(qū),它也由5個文本框text1(0 ..4)實現(xiàn),當(dāng)用戶選擇了題型后,在程序中,通過設(shè)置各個datagrid控件及文本控件的Zorder值以達(dá)到只向用戶展示所選擇題型的內(nèi)容的出現(xiàn)效果。
Private Sub Combo2_Click()
i = Combo2.ListIndex
Text1(i).ZOrder
DataGrid1(i).ZOrder
Adodc1(i).ZOrder
Adodc1(i).Visible = True
End Sub
◘5.3.2刪除:單擊該子菜單以后,會彈出確認(rèn)窗口,以免誤操作。它將刪除當(dāng)前指向的記錄。
Private Sub delete_Click()
Dim r As Integer
r = MsgBox("確定刪除當(dāng)前記錄?", vbExclamation + vbYesNo)
If r = vbYes Then
i = Combo2.ListIndex
Adodc1(i).Recordset.delete
Adodc1(i).Recordset.MoveNext
If Adodc1(i).Recordset.EOF Then
Adodc1(i).Recordset.MoveLast
End If
End If
End Sub
◘5.3.3添加:單擊該項后,主窗體中會顯示一個新的界面,有5個文本框,用于用戶輸入題目的屬性.
◘5.3.4 更新:在對所要添加的記錄數(shù)據(jù)輸入完以后,再單擊“更新”,一條新的記錄就才添加到數(shù)據(jù)庫中,可以使用“瀏覽”查看新的數(shù)據(jù)庫結(jié)構(gòu)。
Private Sub update_Click()
i = Combo2.ListIndex
Adodc1(i).Recordset.AddNew
Adodc1(i).Recordset("題號") = CInt(Text2(0).Text)
If i = 0 Or i = 4 Then
Adodc1(i).Recordset("知識點") = (Text2(3).Text)
End If
Adodc1(i).Recordset("分值") = CInt(Text2(1).Text)
Adodc1(i).Recordset("難度") = Text2(2).Text
Adodc1(i).Recordset("題目") = Text2(4).Text
Label1.Visible = True
Label2.Visible = True
Label3.Visible = True
Label4.Visible = False
Label5Visible = False
Label6Visible = False
Label7.Visible = False
For i = 0 To 4
DataGrid1(i).Visible = True
Text1(i).Visible = True
Combo1.Visible = True
Combo2.Visible = True
Text2(i).Visible = False
Next i
Label3.Visible = True
End Sub
◘5.3.5 修改:由于已經(jīng)把datagrid控件的屬性設(shè)置為可以修改的,因此可以直接在控件中修改數(shù)據(jù),但是要注意的一點是,僅僅在datagrid中修改過的數(shù)據(jù)并不能保存到數(shù)據(jù)庫中,因此修改完以后需要按“修改”菜單,這樣修改過的記錄在數(shù)據(jù)庫中才會被更新。
Private Sub modify_Click()
i = Combo2.ListIndex
Adodc1(i).Recordset.update
End Sub
§5. 4 自動組卷模塊
◘5.4.1功能: 根據(jù)用戶輸入的題型分布、章節(jié)分布以及難度分布等要求,根據(jù)一定的組卷策略從試題庫中隨機(jī)抽取出滿足條件的試題組成一份使用戶滿意的試卷。
◘5.4.2設(shè)計思路:
首先由用戶選擇試卷中知識點的范圍,即所屬涉及的章節(jié),給出需要的各章節(jié)分布、題型分布(各種題型中分值的百分比)和難度分布。章節(jié)的選擇由具有10個項的組合框給出,用戶選定了某個章節(jié)以后,該章節(jié)就會被添加到一個新的列表中,通過在文本框中輸入數(shù)值來確定章節(jié)分布。題型分布只需在對應(yīng)文本框中輸入值即可。難度有三種級別:容易,中等,難。對應(yīng)的數(shù)值表示所要求的試卷生成后整份試卷中容易、中等和難題的分值,它們對應(yīng)于試題庫中“難度”屬性的值。輸入要求得到確認(rèn)后,開始組卷工作,即從試題庫中抽取滿足條件的試題。根據(jù)一定的組卷策略,組卷過程中產(chǎn)生的一些臨時數(shù)據(jù)放在一個臨時庫文件temp中,同時temp中的數(shù)據(jù)也要不斷的更新,使得最后留在temp庫中的數(shù)據(jù)是滿足條件的試題。當(dāng)完成抽題以后,調(diào)用word應(yīng)用程序,將temp中的記錄逐一的寫入到word文檔中,這樣用戶就可以利用word提供的一些編輯功能對試題做一些編輯調(diào)整和打印存檔。
◘5.4.3組卷策略分析:
組卷策略是指系統(tǒng)進(jìn)行組卷的方式方法。它是題庫系統(tǒng)自動生成有效(對測驗?zāi)繕?biāo)來說)試卷的關(guān)鍵。組卷策略設(shè)計主要涉及成卷要求的數(shù)量化、卷面分?jǐn)?shù)分配、庫中選題等問題的處理。
本系統(tǒng)主要是依托于隨機(jī)函數(shù)實現(xiàn),在考慮滿足各約束條件間的相互制約的過程中又利用動態(tài)優(yōu)先權(quán)和誤差平均分配等策略。
隨機(jī)函數(shù)指的是系統(tǒng)vb提供的隨機(jī)函數(shù),從滿足某些檢索條件的試題庫中隨機(jī)的抽取一題,之后來判斷它的各個屬性。若最終隨機(jī)產(chǎn)生的n個試題中,他們之間的約束條件滿足要求,則可以被做為一份試卷的試題。
動態(tài)優(yōu)先指的在組卷過程中先進(jìn)行大題的選擇,如書面表達(dá),短文改錯等。在組卷過程中局部的約束條件多達(dá)好幾種,在本系統(tǒng)中涉及到的有題型的比例,章節(jié)的比例以及難度的比例。選中一道題,對應(yīng)著這些指標(biāo)中的值就會增加,使它們更接近預(yù)定的分值。在選題的開始階段,不存在約束條件間的牽制問題,因為各項屬性都有很大的取值范圍。但隨著被選題數(shù)的增加,取值范圍的縮小,矛盾便隨之產(chǎn)生,出現(xiàn)了一道待選試題的某項指標(biāo)中達(dá)到了預(yù)定值,而其它項指標(biāo)卻超出了范圍的現(xiàn)象,尤其是分值較高的大題,到后期很難滿足要求,往往會導(dǎo)致選題進(jìn)行到一定程度的時候,徘徊在某一個狀態(tài)下,無法繼續(xù)進(jìn)行下去的局面,為了避免這中情況的發(fā)生,可考慮利用優(yōu)先權(quán)的方法把越不容易選擇的試題放在
前面優(yōu)先選擇,而把選擇題放在最后選擇,主要依靠選擇題的選擇來平衡各約束屬性間的制約。
誤差平均分配:理想的組卷結(jié)果是各項約束值之間百分之百的滿足約束條件,但是事實上,由于隨機(jī)技術(shù)的采用,約束間的互相牽制,以及試題庫中題量的限制和屬性設(shè)置間的重疊等,在組題過程中很難達(dá)到理想的狀態(tài)。如果把條件限制的過于絕對,則有時候往往會因為數(shù)分之差,就需要計算機(jī)重新不斷的篩選,甚至進(jìn)入無休止的循環(huán)狀態(tài),永遠(yuǎn)無法完成抽題,這種代價是不必要的,為了解決上述情況,我們在系統(tǒng)設(shè)計的過程中允許約束條件間可以有一定的誤差,在總分值滿足滿分的條件下,它們之間可以在一定的范圍內(nèi)調(diào)節(jié)。
◘5.4.4 具體實現(xiàn)過程及相應(yīng)代碼:

窗口界面如下:

組卷過程:在這里先給出窗體加載時的代碼,主要是完成一些數(shù)據(jù)庫的綁定:
Private Sub Form_Load()
Image1.Picture = LoadPicture(App.Path & "\zj.gif")
For i = 0 To 4
Adodc1(i).ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;Data
1
基于試題庫的自動組卷系統(tǒng)
Data1.Refresh
Data1.Database.Execute ("DELETE * FROM temp") ‘ 清空臨時庫
Data1.Database.Close Adodc2.Recordset.MoveFirst
While Adodc2.Recordset.EOF <> True
Adodc2.Recordset.delete
Adodc2.Recordset.MoveNext
Wend
lc = lc + 1 ‘lc 用來記錄重復(fù)抽取的次數(shù)
If lc > 5000 Then
msg = MsgBox("抽題失敗,請重試", vbOKCancel)
If msg = 1 Then
lc = 0
GoTo L
Else
End ‘用戶沒有選擇重試,則終止程序
End If
End If
etotalf = 0 ‘etotalf 、mtotal、htotal分別表示
mtotalf = 0 所有已抽取的題目中的容易、中
htotalf = 0 等、較難的總分值
For s = 1 To z
zhjf(zhj(s)) = 0 ‘zhjf() 數(shù)組表示所選擇的章節(jié)
Next
For i = 1 To 4
Adodc1(i).Recordset.Filter = fstr ‘只打開所選擇章節(jié)內(nèi)的試題記錄
cnt(i) = Adodc1(i).Recordset.RecordCount
tl(i) = CInt(Text3(i).Text) \ aval(i) ‘tl( )表示在最終的試卷中某
yushu = CInt(Text3(i).Text) Mod aval(i) 題型的題量
If yushu > aval(i) \ 2 Then
tl(i) = tl(i) + 1
End If
For t = 1 To tl(i)
Randomize
vth(i, t) = Int(Rnd * cnt(i)) + 1 Adodc1(i).Recordset.MoveFirst
For n = 1 To vth(i, t) – 1 ‘將記錄移到隨機(jī)數(shù)所對應(yīng)的
Adodc1(i).Recordset.MoveNext 記錄上
Next
timu = Adodc1(i).Recordset("題目")
Adodc2.Recordset.AddNew
Adodc2.Recordset("題目") = timu ‘將找到的記錄里的題目和答
daan = Adodc1(i).Recordset("答案") 案字段寫進(jìn)臨時庫文件中的題目
Adodc2.Recordset("答案") = daan 和答案字段中
Adodc2.Recordset.update
nandustr = Adodc1(i).Recordset("難度")
echar = Mid(nandustr, 1, 1) ‘取得難度字段各位上的字符
mchar = Mid(nandustr, 2, 1)
hchar = Mid(nandustr, 3, 1)
e(i, t) = CInt(echar) ‘類型轉(zhuǎn)換
m(i, t) = CInt(mchar)
h(i, t) = CInt(hchar)
zj = Asc(Adodc1(i).Recordset("章節(jié)分布")) – 64 ‘ 將章節(jié)中的A~J答應(yīng)
zhjf(zj)=zhjf(zj)+Adodc1(i).Recordset(’’分值’’) 為1~10
Next
Next
‘大題抽取完畢
For i = 1 To 4
For t = 1 To tl(i)
etotalf = e(i, t) + etotalf
mtotalf = m(i, t) + mtotalf
htotalf = h(i, t) + htotalf
Next
Next
xetotalf = CInt(Text2(0).Text) – etotalf ‘ xetotal表示還需要
xmtotalf = CInt(Text2(1).Text) – mtotalf 選擇的容易的題目的分值
xhtotalf = CInt(Text2(2).Text) – htotalf
For j = 1 To z
zhjxtotalf(zhj(j)) = zhjtotalf(zhj(j)) - zhjf(zhj(j)) ‘判斷是否有章節(jié)
If zhjxtotalf(zhj(j)) < 0 Then 中的分值已經(jīng)超過了要求的值
GoTo L
End If
Next
xtotalf = xetotalf + xmtotalf + xhtotalf
If xtotalf < 0 Then
GoTo L
End If
Adodc1(0).Recordset.Filter = fstr ‘開始選擇題的抽取
For j = 1 To z
zhjfx(j) = 0
Next
cnt(0) = Adodc1(0).Recordset.RecordCount
tl(0) = xtotalf \ aval(0)
For t = 1 To tl(0)
Randomize
vth(0, t) = Int(Rnd * cnt(0)) + 1
Adodc1(0).Recordset.MoveFirst
For n = 1 To vth(0, t) - 1
Adodc1(0).Recordset.MoveNext
Next
timu = Adodc1(0).Recordset("題目")
Adodc2.Recordset.AddNew
Adodc2.Recordset("題目") = timu
nandustr = Adodc1(0).Recordset("難度")
echar = Mid(nandustr, 1, 1)
mchar = Mid(nandustr, 2, 1)
hchar = Mid(nandustr, 3, 1)
e(0, t) = CInt(echar)
m(0, t) = CInt(mchar)
h(0, t) = CInt(hchar)
p = Asc(Adodc1(0).Recordset("章節(jié)分布")) - 64
zhjfx(p) = zhjfx(p) + Adodc1(0).Recordset("分值")
Next
xe = 0
xm = 0
xh = 0
For t = 1 To tl(0)
xe = e(0, t) + xe
xm = m(0, t) + xm
xh = h(0, t) + xh
Next
For q = 1 To z
If Abs(zhjxtotalf(zhj(q)) - zhjfx(zhj(q))) > 5 Then
b = True
Exit For
End If
Next
If Abs(xe - xetotalf) > 10 Or Abs(xm - xmtotalf) > 10 Or Abs(xhtotalf - xh) > 10
GoTo L
'Else
msgc = MsgBox("已經(jīng)成功完成抽題")
If msgc = 1 Then
editcmd.Enabled = True
End IfEnd If
End Sub
1