基于vb做的vb試題組卷系統
0.png (52.8 KB, 下載次數: 91)
下載附件
2018-6-27 16:15 上傳
全部資料51hei下載地址:
VB058試題庫自動組卷系統計算機畢業設計.rar
(552.88 KB, 下載次數: 32)
2018-6-27 12:21 上傳
點擊文件名下載附件
vb試題組卷系統 下載積分: 黑幣 -5
目 錄
摘要........2
英文摘要.2
第一章 引言 .......3
第二章 系統分析....3
2.1 試題庫分析..3
2.2 組卷分析..4
2.3 系統簡介..5
第三章 數據庫設計....6
3.1 系統數據庫..6
3.2 臨時數據庫..7
第四章 系統總體結構設計......8
第五章 模塊設計及實現.......9
5.1 用戶登錄模塊..9
5.2 系統維護模塊....10
5.2.1 新建數據庫...10
5.2.2 修改密碼 ..11
5.2.3 添加用戶11
5.3題庫管理模塊...11
5.4自動組卷模塊...13
5.4.1 功能 ..14
5.4.2 設計思路14
5.4.3 組卷策略分析....14
5.4.4 代碼實現....16
5.4.5 試卷編輯22
結束語23
參考文獻...23
考試是教師檢查學生學習情況的必要手段,但出卷卻是一種繁重的智力和體力勞動,傳統的標準化試卷命題,需要由教學專家組成一個命題班子,根據許多優秀教師多年的教學經驗,從貫徹教學大綱要求,到試卷意圖的組織,經過反復的推敲,才能完成一份標準化的試卷。這樣的命題方式不僅工作任務繁重而且試卷的標準化程度、難易程度、題量大小等各方面難以控制,難以形成有效的試題庫,給試題和試卷的管理帶來很多問題和困難。鑒于這種情況,利用計算機進行試卷的自動生成并逐步積累形成有效的試題庫,對試題和試卷的管理將變得高效而便捷,對提高工作效率,使試卷管理逐步走向正規化自動化將起到十分重要的作用。同時使出卷工作變得輕松愉快,從很大程度上減輕了教師利用傳統的出卷方式組卷的繁重工作量,大大節省了老師的工作時間,便于教師有更多的時間和精力致力于教學方法的研究。今日, 隨著計算機的應用的普及和硬件設備性能和軟件制作水平的提高,為研制開發高性能的試題管理軟件提供了條件。
作為在教學第一線的老師,往往需要及時了解學生對某一章節知識掌握的情況,經常需要對學生進行形成性測驗和終結性測試,來發現教學中的問題,從而調整教學進度,改進教學方法。不少軟件開發者看到了教育工作者在這一領域的需求相繼推出了一批與試題管理有關的操作軟件,其中不乏非常出色的作品。但是從試題管理這一方面來看,用戶反應平淡,感覺中意的不多。我們不禁要問:為什么是這樣的結局?老師們最需要的是什么呢? §2.1 試題庫分析 在試題庫方面,老師最需要的是對試題庫管理的自主性。老師們渴望能自由地操縱試題庫,具體表現在以下三個方面: (1)自主初始化試題庫;
(2)自主維護試題庫;
(3)自主設計試卷。 ※自主初始化試題庫
即用戶擁有創建新試題庫的權力,用戶能夠根據自己的需要,設計試題的儲存方案以及試題的屬性名和各屬性值,實現試題庫用戶個性化設計,讓試題庫真正成為用戶自己的試題庫。。用戶不喜歡這一種不能自主控制的試題分類方案,用戶希望自主地初始化試題庫。 ※自主維護試題庫
即用戶具有添加、修改和刪除試題的權力,實現試題庫的可擴充性和開放性,使用戶對試題庫具有至高無上的支配權。現在已經推出的幾乎所的試題管理軟件都不具備這樣的功能,用戶所使用的試題被程序制作者預先寫在某個文件中,這些文件不是隱藏得讓用戶難以找到就是經過加密處理,用戶根本就不可能通過其它方式(比如Word、Access、WPS等)打開并看到它,更談不上對它的擴充、修改和對某個試題的刪除了。由于用戶沒有自主維護試題庫的權力,新試題無法錄入,陳舊試題無法刪除,這樣的試題庫在較短的時間內就逐漸老化、失去活力。用戶需要自主地維護試題庫,希望及時地更新試題庫。 ※自主設計試卷 現有的某些試題管理軟件不僅不支持試題庫中試題的修改,生成的試卷也不可以修改,連加一個空格修改字體都不行,試卷保存后不能為其它系統(比如Word、WPS等)識別,只能從打印機上輸出,這種方案沒有多少實用性。 試題庫要保證一定的規模,給隨機選擇以較大的范圍。建立題庫是一個復雜的系統工程,首先要建立系統的數學模型,然后確定試題的屬性指標以及試題的組成結構,再組織大批量的優秀學科教師編寫試題,為了保證這些試題的科學性和有效性,對每一題試題進行抽樣測試,對試題參數標注的有效性進行校正,建立起一個實用的題庫系統,另外,應該對題庫的管理實行一定程度上的開放性,以不斷提高題庫的質量和可維護性。建立題庫是一項相當復雜的系統工程,不僅開發需要大量的人力和時間,而且還要花費相當的時間和人力物力去維護調整,才能真正在教育中發揮作用。 §2.2 組卷分析 一般地說,對題庫系統組織試卷的要求是根據出卷者的需求產生一份對于測驗目標(如教學評價、學生能力水平評價等)有價值的測驗試卷。因此,在組卷時,用戶要提出組卷要求,通常包括題目內容范圍、題目類型、題目數量和測驗目標等方面。這些要求應轉化成試卷每個題目的量化參數才能被系統使用。例如按照測驗目標各知識點內容所占比例數,各層次的目標(記憶、理解、綜合、應用等)分別由哪些題型反映,每種題型在試卷中的數量,各難度級在卷中所占比例,難度等要求。量化工作可以由人工完成,然后按一定格式送入系統中。也可以由系統在一定程度上自動完成量化轉換,形成相應的組卷參數。 要解決的一個首要問題是組卷策略的選擇。它在很大程度上決定著系統的成敗與否。組卷策略的實質是將對人比較直觀明了的組卷參數變換成計算機能夠直接操作的試題屬性項,然后根據這些屬性項,在題庫中抽取試題組成試卷。因此,完整的組卷策略應該由三部份組成:試題屬性項定義、組卷參數的定義、變換算法的說明。所謂計算機組卷至少應該保證以下幾個方面的平衡方可考慮試卷的可接受性: a) 整卷的題型比例要合理 d) 要保證隨機性 一種做法是,讓出題者按照一定格式描述試卷編制計劃信息,如卷內題目在題型和難度上的分布,知識點內容在各目標層次上的分布(包括數量),然后通過一定算法變換成試卷試題的具體要求。另外一種做法是將課程目標與內容信息在系統中建立一個目標/內容分布關系表。 在題庫中按上述量化的組卷要求查找符合條件的題目進行出題組卷,一般都采用匹配方法。精確匹配可以組出完全符合量化標準的試卷,但有時會出現組卷策略無法實現的情況(即查不到完全符合條件要求的題目)。為了避免這種情況,設計組卷策略時要考慮怎樣解決它。常用的辦法之一是形成并試用新的組卷策略,這種做法會帶來時間上的浪費。另一種辦法是把精確匹配改成近似匹配。采用近似匹配時應事先規定所選題目在內容、目標、題型與難度等各指標上是否可以與出題要求不完全一致,能不能有一一定的模糊度。若模糊度為0表示必須精確匹配;而非零值則青示可有多大的變異度。在后種條件下,若找不到完全符合要求的題目,就可以在模糊度許可范圍內查找近似匹配的題目。 §2.3本系統簡介:基于以上諸因素的考慮,設計了本系統:本系統以高一的英語教育為背景進行設計,其意旨在于提供一個適合于形成性測試和階段性測試的自動組卷系統。本系統能快速方便地提供各種要求的試卷,幫助教師把握教學的進度,及時地反饋教學中的問題,以改進教學方法和調整教學重點。 功能:本系統主要有2大功能模塊組成:一,題庫管理;二,自動組卷。具體的功能及實現將在后面做詳細介紹。 特點:1.易用性:人機交互界面友好,不要求使用者具有太多的計算機知識 2.先進性:前端自動組卷+后端題庫管理+優選試題 3.合理性:結合國家教材,符合教學大綱。 4.實用性:教師減負第一步,幫助教師從煩瑣的出卷工作中解脫出來 實現工具:基于試題庫的自動組卷系統即以強大的試題數據庫作為后臺支持,由于Access是目前比較流行的一種數據庫軟件,它允許并很容易地用多種方式進行篩選、分類和更新數據,因此本系統中采用Access來構建系統數據庫。作為與用戶做交互界面的前臺,本系統采用Visual Basic 6.0作為開發工具,它具有豐富的控件、先進的ADO數據訪問技術、數據報表輸出技術等。
第三章 數據庫的設計 數據庫的庫結構對于整個系統的性能起著重要作用。它是本系統的基礎。一個題庫將存放大量的題目,這些題目在計算機內如何存儲將直接影響題庫系統的工作效率和效果,因此題庫結構的設計是題庫系統設計開發的關鍵一環。題庫結構設計時要考慮題庫的基本特征。題庫結構設計最基礎的工作應包括確定題目類型、規定試題屬性及題庫總體數據結構的確立等幾方面。題庫是計算機輔助測驗系統的基礎。一個大的測驗系統的題庫應能容納足夠數量的題目,這些題目在題庫中的組織、分類及其特征信息的確立與描述將直接影響系統的工作效率與效果。 本系統總共構建了2個數據庫文件:系統數據庫datadb和臨時數據庫temp。 §3.1 datadb 數據庫 因為本系統是以英語教學為例,因此構建了一個用于存儲英語試題及相關屬性的試題數據庫。在程序中設置別名為datadb。在該庫中共建立了6張表,其表名分別為: a:選擇題 b:完型填空 c:閱讀理解 d:短文改錯 e:書面表達 f:登錄 ◘3.1.1 試題文件 a~e是對應于英語中常見的五種題型的試題文件表。為了通用起鑒,為每張表設置了相同的字段,依次為題號、分值、難度、章節分布、題目以及答案6個屬性。 · 題號---整型,設置為主鍵,即為試題庫中題目的編號; · 分值----整型,是該題的分數; · 難度----字符型,它的設置采用了3位編碼:用三個數字來表示該題的難度。對于不同的表,它的含義略微不同。在完型填空、短文改錯中,左起第一位、第二、第三位依次表示在該題中較容易、中等難度、較難得分的題目總分值(比如在完型填空中,有25小題,若每題為1分,則難度系數為988表示的意思為有9題是容易的題目,有8題為中等的,另外的8題是較難的題目),對于書面表達這種大題,沒有小題的設置,則難度系數的含義稍有差異(若書面表達的總分為20分,則難度為875表示8分是比較容易得到的,7分是中等水平的學生才能獲得的,而最后的5分則是較少部分的學生才能的到。)對于選擇題而言,它每題的分值較少,因此不再對分值拆分,只在相對難度位置上出現該題分值,如100表示該題屬于容易題,總分為1分,010表示該題為中等題。雖然各表中的難度屬性的含義看似有上述的差異,但是對于表達難度這個概念而言,它們所能實現的功能是一樣的,因此在程序中對于每個表中的難度做同樣的處理。 · 章節分布----字符型。在該系統設計的過程中,通過對高一的英語教材的分析和研究,把整個年級階段的知識點按教學進度劃分為十個章節,用A~J表示,在A~J之后用數字表示的則是該章節中所涉及的細微的知識點。(001:虛詞;010實詞;011: 時態;100:語法;101:結構;110:語態;111:情景意境),比如某選擇題的的章節分布為C110表示的是它所要考查的知識點是屬于第三章中的語態。定義了總體上的A~J個章節,則可以在不同的教學時期,選擇不同章節屬性的試題來測試,以避免試題不適合教學進度的情況。之所以要對每個章節分開定義001~111等知識點,是因為由于教學進度不同,雖然是相同的知識點,但是在不同階段對學生的要求是不一樣的。 · 題目---備注型。這是在最終生成的試卷中真正要出現的部分。 · 答案---備注型。同題目的性質一樣,但它們是分別輸出到不同的文檔中相互獨立保存和打印的。 以上描述了存儲五種題型的5張數據表中各個字段含義。接下來來介紹一下最后一張數據表---登錄表中的屬性設置。 ◘3.1.2 登錄文件 該表中總共設置了三個字段屬性---用戶名,密碼,訪問次數。 · 用戶名--字符型,是每條記錄中的主鍵,值唯一,不能重復。數字、字母都可以。在系統的使用過程中,具有一定權限的管理員可以對其進行刪除和增加。 · 密碼--用于核準用戶的權限,避免一些不合法的人進入系統進行破壞活動。 · 訪問次數--整型 用來顯示該用戶已經使用過本系統的次數。 §3.2 tempdb數據庫 其中只有一張數據表—temp。它用來存儲在抽取試題過程中產生的一些中間數據。有2個字段:題目和答案,均為備注型。在系統運行過程中,該表中的數據會被不斷的更新。 根據系統各模塊的實現,系統主要結構即流程圖如下所示: 圖4-1總體結構圖 §5.1 用戶登錄模塊 ● 功能:該模塊是檢驗用戶的合法性 
● 窗口設計如下: 圖5-1 登錄界面 ● 設計思路:當該模塊被加載時,從數據庫中的登錄表中讀取已經存在的用戶名。將用戶名逐一添加到組合列表框的選項中,以供用戶選擇,(可以避免用戶手動輸入之繁),在用戶選擇了某個用戶以及在密碼框中輸入了密碼之后(以*顯示),在按下“登錄”鍵的時候,系統從數據表中找到對應該用戶名的記錄,然后檢查所輸入的密碼是否與數據庫中的密碼一致,若不一致,則提示密碼錯誤,拒絕登錄;若一致,則顯示該用戶以往登錄的次數,允許進行后面的操作。 ● 代碼實現 (以下代碼中‘后為注釋) 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 = "登錄" ‘ 數據庫連接 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("訪問次數") + 1 k = MsgBox("祝賀你成功登錄 " + Chr(13) + "這是您第" & cnt & "次訪問該系統", vbOKOnly, "Congratulations") Adodc1.Recordset("訪問次數") = cnt Adodc1.Recordset.update End If If k = 1 Then enter.Visible = True Unload Me Load enter End If End Sub §5.2 系統維護模塊 功能:對系統的安全等做一些基本的維護,如添加數據庫,修改密碼,增加用戶等。由于該模塊功能只有具有一定權限的管理員才能使用,因此在激活該菜單之前要求輸入管理員密碼。各具體功能設計如下: ◘5.2.1 新建數據庫:用戶通過文件對話框選擇保存數據庫的路徑,鍵入數據庫名,完成以后就會在選定的路徑下新建一個access數據庫。 其實現代碼如下: 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 修改密碼:窗口啟動時,從數據庫中讀取所有用戶名,添加于列表中,要求用戶輸入原始密碼和新密碼,若原始密碼與數據庫中的密碼數據一致,則把新密碼中值替換數據庫中的原始密碼字段,保存,若輸入的原始密碼不正確,則給出出錯信息。窗口如圖5-2所示: 圖5-2 修改密碼界面 代碼實現同登錄類似,在此略。 ◘5.2.3添加用戶:通過向文本框中輸入用戶名和密碼向“登錄”表中追加一條新的記錄,同時設置該字段的“訪問次數”值為0。 §5.3 題庫管理模塊 ● 功能 包括對庫中試題的瀏覽、刪除、修改、更新、添加等。 ● 特點 1.難度、題型、分值、章節均可根據學校實際教學使用需要任意設置。 2.提供開放式試題數據庫功能,用戶可方便的錄入、編輯、修改和保存自己的試題和試卷,并且能直接加入本系統的數據庫,利用本系統進行統一管理。 窗口設計如下: 
圖5-3 題庫管理窗口 ◘5.3.1 瀏覽 當單擊“題庫管理”下的“瀏覽”子菜單時,出現類似如上窗口的界面,從左邊的組合框中選擇科目“英語”及題型,就可以在主窗體中顯示相對應的數據庫中的內容,它是由adodc1(0..4)5個控件對各題型的數據表進行綁定,然后利用datagrid1(0..4)控件顯示出來。由于題目這個備注型字段中的字符較多,不能全部在字段欄里顯示,加之題目的內容是用戶最為關注的,因此單獨設立了對應的題目區,它也由5個文本框text1(0 ..4)實現,當用戶選擇了題型后,在程序中,通過設置各個datagrid控件及文本控件的Zorder值以達到只向用戶展示所選擇題型的內容的出現效果。 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刪除:單擊該子菜單以后,會彈出確認窗口,以免誤操作。它將刪除當前指向的記錄。 Private Sub delete_Click() Dim r As Integer r = MsgBox("確定刪除當前記錄?", 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 更新:在對所要添加的記錄數據輸入完以后,再單擊“更新”,一條新的記錄就才添加到數據庫中,可以使用“瀏覽”查看新的數據庫結構。 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 修改:由于已經把datagrid控件的屬性設置為可以修改的,因此可以直接在控件中修改數據,但是要注意的一點是,僅僅在datagrid中修改過的數據并不能保存到數據庫中,因此修改完以后需要按“修改”菜單,這樣修改過的記錄在數據庫中才會被更新。 Private Sub modify_Click() i = Combo2.ListIndex Adodc1(i).Recordset.update End Sub §5. 4 自動組卷模塊 ◘5.4.1功能: 根據用戶輸入的題型分布、章節分布以及難度分布等要求,根據一定的組卷策略從試題庫中隨機抽取出滿足條件的試題組成一份使用戶滿意的試卷。 ◘5.4.2設計思路: 首先由用戶選擇試卷中知識點的范圍,即所屬涉及的章節,給出需要的各章節分布、題型分布(各種題型中分值的百分比)和難度分布。章節的選擇由具有10個項的組合框給出,用戶選定了某個章節以后,該章節就會被添加到一個新的列表中,通過在文本框中輸入數值來確定章節分布。題型分布只需在對應文本框中輸入值即可。難度有三種級別:容易,中等,難。對應的數值表示所要求的試卷生成后整份試卷中容易、中等和難題的分值,它們對應于試題庫中“難度”屬性的值。輸入要求得到確認后,開始組卷工作,即從試題庫中抽取滿足條件的試題。根據一定的組卷策略,組卷過程中產生的一些臨時數據放在一個臨時庫文件temp中,同時temp中的數據也要不斷的更新,使得最后留在temp庫中的數據是滿足條件的試題。當完成抽題以后,調用word應用程序,將temp中的記錄逐一的寫入到word文檔中,這樣用戶就可以利用word提供的一些編輯功能對試題做一些編輯調整和打印存檔。 ◘5.4.3組卷策略分析: 組卷策略是指系統進行組卷的方式方法。它是題庫系統自動生成有效(對測驗目標來說)試卷的關鍵。組卷策略設計主要涉及成卷要求的數量化、卷面分數分配、庫中選題等問題的處理。 本系統主要是依托于隨機函數實現,在考慮滿足各約束條件間的相互制約的過程中又利用動態優先權和誤差平均分配等策略。 隨機函數指的是系統vb提供的隨機函數,從滿足某些檢索條件的試題庫中隨機的抽取一題,之后來判斷它的各個屬性。若最終隨機產生的n個試題中,他們之間的約束條件滿足要求,則可以被做為一份試卷的試題。 動態優先指的在組卷過程中先進行大題的選擇,如書面表達,短文改錯等。在組卷過程中局部的約束條件多達好幾種,在本系統中涉及到的有題型的比例,章節的比例以及難度的比例。選中一道題,對應著這些指標中的值就會增加,使它們更接近預定的分值。在選題的開始階段,不存在約束條件間的牽制問題,因為各項屬性都有很大的取值范圍。但隨著被選題數的增加,取值范圍的縮小,矛盾便隨之產生,出現了一道待選試題的某項指標中達到了預定值,而其它項指標卻超出了范圍的現象,尤其是分值較高的大題,到后期很難滿足要求,往往會導致選題進行到一定程度的時候,徘徊在某一個狀態下,無法繼續進行下去的局面,為了避免這中情況的發生,可考慮利用優先權的方法把越不容易選擇的試題放在 前面優先選擇,而把選擇題放在最后選擇,主要依靠選擇題的選擇來平衡各約束屬性間的制約。 誤差平均分配:理想的組卷結果是各項約束值之間百分之百的滿足約束條件,但是事實上,由于隨機技術的采用,約束間的互相牽制,以及試題庫中題量的限制和屬性設置間的重疊等,在組題過程中很難達到理想的狀態。如果把條件限制的過于絕對,則有時候往往會因為數分之差,就需要計算機重新不斷的篩選,甚至進入無休止的循環狀態,永遠無法完成抽題,這種代價是不必要的,為了解決上述情況,我們在系統設計的過程中允許約束條件間可以有一定的誤差,在總分值滿足滿分的條件下,它們之間可以在一定的范圍內調節。
◘5.4.4 具體實現過程及相應代碼: 
窗口界面如下:  組卷過程:在這里先給出窗體加載時的代碼,主要是完成一些數據庫的綁定: 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
基于試題庫的自動組卷系統 Source=" + App.Path + "\datadb.mdb;" Next Adodc1(0).RecordSource = "選擇題" Adodc1(1).RecordSource = "書面表達" Adodc1(2).RecordSource = "短文改錯" Adodc1(3).RecordSource = "閱讀理解" Adodc1(4).RecordSource = "完型填空" For i = 0 To 4 Adodc1(i).Refresh Adodc1(i).Recordset.Filter = adFilterNone Next Data1.DatabaseName = App.Path & "\tempdb.mdb" Data1.RecordSource = "temp" Adodc2.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\tempdb.mdb" Adodc2.RecordSource = "temp" Adodc2.RefreshData1.DatabaseName = App.Path & "\tempdb.mdb" Data1.RecordSource = "temp" End Sub 1. 首先用戶在界面上輸入各種約束條件:章節分布、題型分布、難度分布。檢查深入無誤以后,單擊確定按扭(否則可以按“重置”按扭進行重新設置)進行組卷。 2. 組卷。“確定”按扭的代碼如下:(之后將給出具體的介紹和解釋) Private Sub zujuan_Click() Dim zj As Integer aval(0) = 1 ,aval(1) = 20 aval(2) = 15,aval(3) = 8 aval(4) = 25 fstr = "" For j = 1 To z - 1 szhj(j) = Chr(zhj(j) + 64) fstr = fstr & "章節分布 like '" & szhj(j) & "*'" & "or " Next fstr = fstr & "章節分布 like '" & Chr(zhj(j) + 64) & "*'" L: Data1.DatabaseName = App.Path & "\tempdb.mdb" Data1.RecordSource = "temp" 1
基于試題庫的自動組卷系統 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 用來記錄重復抽取的次數 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() 數組表示所選擇的章節 Next For i = 1 To 4 Adodc1(i).Recordset.Filter = fstr ‘只打開所選擇章節內的試題記錄 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 ‘將記錄移到隨機數所對應的 Adodc1(i).Recordset.MoveNext 記錄上 Next timu = Adodc1(i).Recordset("題目") Adodc2.Recordset.AddNew Adodc2.Recordset("題目") = timu ‘將找到的記錄里的題目和答 daan = Adodc1(i).Recordset("答案") 案字段寫進臨時庫文件中的題目 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) ‘類型轉換 m(i, t) = CInt(mchar) h(i, t) = CInt(hchar) zj = Asc(Adodc1(i).Recordset("章節分布")) – 64 ‘ 將章節中的A~J答應 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)) ‘判斷是否有章節 If zhjxtotalf(zhj(j)) < 0 Then 中的分值已經超過了要求的值 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("章節分布")) - 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("已經成功完成抽題") If msgc = 1 Then editcmd.Enabled = True End IfEnd If End Sub 1
基于試題庫的自動組卷系統 部分解釋如下:其中的aval0~aval4 表示對應的選擇題、書面表達、短文改錯、閱讀理解、完型填空中每題的平均分數。數組zhj(1 to 10)由combo1(即章節選擇列表框)的代碼中定義zhj(z + 1) = Combo1.ListIndex + 1,z =z+1;用來表示所選中的章節,取值范圍是1~10 例如zhj(2)=4 表示選擇的第2種章節類型是第4章。fstr 用來做過濾變量,即若用戶選擇了第一、三、八章3個章節的時候,在后面的組卷過程中,只是從這三章的試題中抽取試題,而不是從整個數據表中搜索,大題即完型填空、書面表達、短文改錯、閱讀理解的抽取試題方法相同:text3(i)中得到的數值為對應的題型I的試題總分值。tl(i)表示為了滿足text3(i)的條件需要抽取的題量。利用隨機函數vth(i, t) = Int(Rnd * cnt(i)) + 1 依次從試題庫中抽取試題,cnt(i)是所選中章節中的題型I的總題量,vth(I,t)表示題型I中 第t題在數據表(經過filter以后的表)中的位置,然后數據表中的記錄從第一條到最后一條之間掃描,找到對應的記錄vth(I,t)的位置,利用recordset(“題目”)和recordset(“答案”)的方法把所找到的記錄中的題目和答案字段復制到臨時庫文件temp中(它由程序中的adodc2控件綁定)。然后把記錄的其他一些屬性保存起來,后面將用它們來判斷約束條件的成立與否。具體提取的屬性值如下:難度----在數據庫中我們已經解釋過“難度”字段的含義,現在就用三個變量來分別提取該字段中的三個位的值,e(i, t) = CInt(echar)表示所選取的題型I的第t題的難度屬性中對應的容易的分值,m(i, t) 、h(i, t)則依次答應中等和較難的分值;章節----因為在數據庫中利用A~J表示章節,所以在程序中需要利用Asc(Adodc1(i).Recordset("章節分布")) – 64 把屬性中的A~J轉化成相對應的1~10, 使之與zhjf(1 to10)中下標匹配,zhjf()表示已抽取的題目中某章節占的總分數,例如zhjf(2)=30,表示第2章已抽取的總分數為30分。當大題一次遍歷抽取之后,把所有已抽取的題目中的容易、中等、較難的分值做累加,用xetotlaf、metotalf、htotalf表示。xetotalf=text2(0)-etotalf 、xmtotalf=text2(1)-mtotalf、xhtotalf=text2(2)-htotalf得出需要從選擇題題抽取的題目難度分布。zhjtotalf(1to10 )表示的是在界面中輸入的對各章節分布的要求,用代碼中的zhjtotalf(zhj(j)) - zhjf(zhj(j)) 就可以求得在選擇題中可以在各章節中抽取的分數,用zhjxtotalf()表示,若數組zhjxtotalf()中的某一個值小于零,則重新開始大題的抽題。因為這意味著在抽取大題的過程中,某個章節的比重已經超出了預定的值。最后開始選擇題的抽取。選擇題的隨機抽取過程與大題一致,在此不再解釋,主要介紹一下涉及最后一些約束條件判斷的變量。zhjfx() 表示實際抽取出來的選擇題中各章節的分數,Abs(zhjxtotalf(zhj(q)) - zhjfx(zhj(q)))是否大于5作為判斷本次隨機抽取過程有效性的標準之一,若大于5,則視抽題失敗,重新開始新一輪的選擇;若小于則再判斷其他條件是否滿足。用xe、xm、xh表示實際抽取出來的選擇題中各難度的值的分布。用Abs(xe - xetotalf) > 5來判斷實際抽取的選擇題與要求的在容易題上的誤差,類似有Abs(xm - xmtotalf) > 5 、Abs(xhtotalf –xhtotalf)的定義。如果以上三個限制條件中有一個不滿足,則視為抽題失敗,重新開始隨機抽題過程,若總的循環次數超過了某個值,如5000,則視無法按預定義要求組卷,要求退出系統重新設置參數。在又一輪的循環之前,有一項需要做的工作是把temp數據表中的數據清空,因為這都是些中間數據,它們已經被判定為不滿足條件的,繼續存儲在表中,會給后面的組卷工作帶來錯誤,因此要刪除。當出現提示“完成抽題”的提示后,單擊確定,界面上的“編輯試卷”按扭置為可編輯,進入組卷的最后一個環節。 ◘5.4.5 試卷編輯。 將臨時庫文件中的試題記錄逐條的讀入word文檔中。具體操作是:先建立一個word OLE自動化對象 ,利用其的insert方法將記錄從數據表中讀取出來插入到文檔中。在此過程中,通過判斷tl()的值在適當的時候插入題型的標題和題號,如在選擇題試題插入完之后應該插入一行文本“完型填空”。用戶可以對其進行試題做一些調整以及打印、存檔。實現代碼如下: Private Sub editcmd_Click() For c = 0 To 4 ttl = ttl + tl(c) Next bh = 1 Dim objWord As Object Set objWord = CreateObject("word.basic") objWord.appshow objWord.filenew Adodc2.Recordset.MoveLast objWord.Insert "第一大題 選擇題" & Chr(13) For j = 1 To ttl If j <= tl(0) Then objWord.Insert "(" & bh & ")" & " " & Adodc2.Recordset("題目") & Chr(13) Else objWord.Insert Adodc2.Recordset("題目") & Chr(13) End If If j = tl(0) + tl(4) Then objWord.Insert "第三大題 閱讀理解" & Chr(13) If j = tl(0) + tl(4) + tl(3) Then objWord.Insert "第四大題 短文改錯" & Chr(13) If j = tl(0) + tl(1) + tl(3) + tl(2) Then objWord.Insert "第五大題 書面表達" & Chr(13) Adodc2.Recordset.MovePrevious bh = bh + 1 Next End Sub
結束語: 自動組卷并不是一個新的領域,但它仍處在需要不斷的完善的階段之中。由于各個學科的不同,基于試題庫的自動組卷系統在數據庫設計等方面會有些許的差異,本系統的實現實質上是拋張引玉。本文介紹和完成了一個具體的組卷系統的開發,它具有一定的實際應用價值,然而由于在時間、能力、技術等諸方面的不足,在算法優化和庫結構的設計上還有一些有待于改進的地方,還有許多功能有待于日后來增強。這是本人第一次真正的做軟件開發,在一次次的發現問題、解決問題的過程中,學到了許多專業知識以及處理事務的方法,為以后的學習和工作積累了豐富的經驗,這是本人認為比這個完成軟件更具有意義價值的。
|