肖仁鋒 李興福
(濟南職業(yè)學(xué)院,山東 濟南 250103)
近年來,為了保證考試的公平性和統(tǒng)一性,也為了試題建設(shè)的規(guī)范化,學(xué)校正在興起題庫建設(shè),需要組織多位教師進行出題、審核等工作。目前,這項工作基本還是靠相關(guān)教師多年的經(jīng)驗積累來人工完成。從出題人的角度來看,人工完成試題庫建設(shè),工作量大且容易出錯,大大降低了題庫建設(shè)的工作質(zhì)量;從試題質(zhì)量的角度來分析,如果需要形成多套試題,就會出現(xiàn)重復(fù)率高等問題,無法保證考試的公平性。因而,在題庫建設(shè)工作中,如何提高試題的質(zhì)量,如何將教師從繁重的重復(fù)工作中解放出來,是亟待解決的問題。本文中提到的試題生成系統(tǒng),正是在這種情境下,依據(jù)實際的工作情況,利用現(xiàn)有的編程工具,設(shè)計實施的基于C#的試題自動生成系統(tǒng)[1]。
考慮到系統(tǒng)的通用性和易用性,本系統(tǒng)使用的操作系統(tǒng)平臺為Windows7及其后續(xù)相關(guān)產(chǎn)品,比如Windows8、Windows10等;以C#作為系統(tǒng)開發(fā)的程序語言,選用Visual Studio 2008作為語言處理程序,系統(tǒng)也支持更新的Visual Studio環(huán)境。為了保證準(zhǔn)確性,系統(tǒng)開發(fā)完成后,曾在多個版本中測試過,均能運行正常。而數(shù)據(jù)庫管理系統(tǒng)則使用了最為常見的SQL Server,既能滿足數(shù)據(jù)庫開發(fā)的需求,通用性又強。
在系統(tǒng)設(shè)計時,系統(tǒng)采用了三層的設(shè)計模式,即:表現(xiàn)層(UI)、業(yè)務(wù)邏輯層(BLL)和數(shù)據(jù)訪問層(DAL)。表現(xiàn)層主要的作用是提供一個系統(tǒng)與使用者之間的接口,規(guī)范系統(tǒng)的頁面布局,用于數(shù)據(jù)的寫入和輸出,既可以把使用者的意圖寫入系統(tǒng)中,也可以將使用者想要看到的數(shù)據(jù)展示出來;而業(yè)務(wù)邏輯層是設(shè)計模式的中間模塊,上接表現(xiàn)層,下連數(shù)據(jù)訪問層,是上、下兩層的連接器,這一層的性質(zhì)與另外兩層明顯不同,另外兩層是單純的功能實現(xiàn),而這一層則是復(fù)雜的、繁雜的業(yè)務(wù)邏輯處理和實現(xiàn)。在一些簡單軟件中,這一層的功能和地位并不明顯,甚至被忽略,但是在大型的、復(fù)雜的軟件中,該層卻是非常重要的??梢哉f,軟件的效率和后期的維護工作就取決于開發(fā)人員在這一層的設(shè)計是否足夠高端。在本系統(tǒng)中,該層并不復(fù)雜,主要用于實現(xiàn)了驗證和一些常規(guī)的計算、統(tǒng)計功能。最后的層次是數(shù)據(jù)訪問層。顧名思義,它的作用是通過對數(shù)據(jù)庫的訪問,實現(xiàn)對試題數(shù)據(jù)的增加、刪除、修改、查詢等操作。通過分層次的系統(tǒng)設(shè)計開發(fā),實現(xiàn)了“高內(nèi)聚低耦合”的思想,提高了系統(tǒng)開發(fā)的效率,為今后系統(tǒng)的升級和維護奠定了良好的基礎(chǔ)。在本系統(tǒng)中由于業(yè)務(wù)邏輯關(guān)系并不復(fù)雜,因此,業(yè)務(wù)邏輯層的實現(xiàn)就相對簡單,這里主要介紹表現(xiàn)層和數(shù)據(jù)訪問層的設(shè)計和實現(xiàn)[2]。
本系統(tǒng)是一個試題自動生成系統(tǒng),大致功能分為兩大模塊:題目管理和試題生成。在題目管理模塊中,首先根據(jù)常見的試題類型分別建立了相關(guān)的類,主要的試題類型有判斷題、選擇題、填空題、簡答題和綜合題。在每類題目中都涉及了題目的增加、刪除、修改、查找等常規(guī)管理操作。雖然系統(tǒng)在開發(fā)時只做了這些類型的題目處理,但是有了這些題型做基礎(chǔ),再開發(fā)其他題型的模塊,比如名詞解釋、論述題等,就變得比較容易了。在試題生成模塊中,根據(jù)實際的工作需要,設(shè)計了三種試題的生成模式:直接抽題模式、自定義抽題模式和高級抽題模式。直接抽題模式是最簡單也是最直接的抽題方式,抽題人不需要任何操作,直接點擊生成試題按鈕即可,試題生成系統(tǒng)會根據(jù)設(shè)計好的既定模式生成試題,并生成相關(guān)的答案;自定義抽題模式允許抽題人根據(jù)自己的需要選擇相關(guān)的題型和數(shù)量,然后再生成試題和答案;高級抽題模式是為了滿足抽題人的更高要求而設(shè)計的。首先是將抽題的過程分開了,按照題型分步抽題,當(dāng)系統(tǒng)抽出的題目不能滿足抽題人的要求時可以根據(jù)需要進行替換,直到抽題人滿意為止,然后點擊“寫入緩存”按鈕,將選好的題目保存下來,接著更換另外一種題型,繼續(xù)選擇相應(yīng)的題目,待最后所有題目選擇完畢,選擇“生成試題”按鈕,可以將緩存中的所有題目寫入Word文檔中,生成試題和答案。另外,在高級抽題模式中,還設(shè)置了過濾功能,可以根據(jù)題目所屬的知識范疇過濾題目,知識范疇對應(yīng)于某個課程的章節(jié),對應(yīng)數(shù)據(jù)庫中的point字段。比如學(xué)完了網(wǎng)絡(luò)課程第一章,需要做一個階段性測試,則可以將知識范疇選為第一章,那么過濾出來的題目就都是第一章的。該項功能是為了更好地滿足使用者的一些個性化需求而設(shè)置,增加了選題的靈活性。
圍繞常見的題目類型,在系統(tǒng)的設(shè)計開發(fā)中,共涉及五種題型:判斷題、選擇題、填空題、簡答題和綜合題。其中,前四種題型在技術(shù)實現(xiàn)上基本類似,而綜合題則與前四種完全不同。由于綜合題涉及較多的題目介紹,甚至有的題目中會有圖像,在處理過程中會相對復(fù)雜一點。下面根據(jù)在設(shè)計開發(fā)的過程中遇到的重點問題做詳細(xì)介紹。
在開發(fā)過程中,遇到的主要問題有四個:數(shù)據(jù)預(yù)處理問題、題目重復(fù)問題、圖像處理問題、題目輸出問題。
在題目增加模塊中,本系統(tǒng)設(shè)計了兩種方式增加新題目:錄入和導(dǎo)入。錄入方式就是將已有的題目的詳細(xì)情況(包括題干、答案、科目及對應(yīng)的知識點),根據(jù)提示寫入相應(yīng)的文本框中,然后點擊“增加”按鈕將題目寫入數(shù)據(jù)庫中;導(dǎo)入是指將題目事先寫入Excel文檔中,由系統(tǒng)自動導(dǎo)入。在錄入方式中,如果所有的選項是直接錄入的不會有問題,但是如果題目的題干和答案是從別的文檔中復(fù)制粘貼過來的,就容易產(chǎn)生問題。尤其是從網(wǎng)頁上直接粘貼下來的題目,會有很多問題。最突出的問題就是很多數(shù)據(jù)帶有一些網(wǎng)絡(luò)的格式或者一些特殊符號,會造成輸出格式的混亂,在生成試題時,后期對試題維護處理時的工作量變大、工作效率降低。
為了解決這個問題,需要在寫入數(shù)據(jù)庫之前對數(shù)據(jù)進行處理,將特殊的格式和多余的無用字符去掉,也就是數(shù)據(jù)的預(yù)處理,或者可以稱之為數(shù)據(jù)清洗。實現(xiàn)這一目標(biāo)的方法有很多種,可以使用trim()方法,該種方法比較簡單,但是經(jīng)過測試,效果不理想;也可以使用replace()方法,替換數(shù)據(jù)中的指定字符,這種辦法需要自定義一個方法,將其處理過程寫在方法中,由于這里的數(shù)據(jù)清洗比較簡單,過程并不復(fù)雜,就是將數(shù)據(jù)轉(zhuǎn)換為字符串,使用replace()函數(shù),替換掉一些指定的字符。因此,本系統(tǒng)就采用了這種辦法。當(dāng)然,就其原理而言,不僅這些方法可以去掉這些特殊字符和標(biāo)記,采用SQL中的一些語句,等數(shù)據(jù)寫入數(shù)據(jù)庫后,統(tǒng)一修改也是可以的,但是這種方法是在數(shù)據(jù)錄入后,可能會有漏掉的,查找起來相對麻煩一些。因此,本系統(tǒng)并沒有采用這種辦法[3]。
在數(shù)據(jù)預(yù)處理的過程中還要防止數(shù)據(jù)冗余,也就是防止重復(fù)題的出現(xiàn)。由于向題庫中錄入的題目會越來越多,難免出現(xiàn)將相同的題目再次錄入的情況,為了避免這種問題,本系統(tǒng)也在數(shù)據(jù)錄入數(shù)據(jù)庫之前,進行了一次遍歷,看數(shù)據(jù)庫中是否有題干完全相同的題目,如果數(shù)據(jù)已經(jīng)存在了,則不再錄入,以防止出現(xiàn)重復(fù)題。
總之,數(shù)據(jù)的預(yù)處理需要耗費一定的時間,導(dǎo)致題目錄入變慢,但卻減少了后期的維護時間,提升了整體的效率,也提高了試題的質(zhì)量。
本系統(tǒng)是自動試題生成系統(tǒng),從數(shù)據(jù)庫中抽取題目的時候,首先是由系統(tǒng)產(chǎn)生一個隨機數(shù),并以這個隨機數(shù)作為題目的編號在數(shù)據(jù)庫中抽取相應(yīng)的題目,而隨機數(shù)的生成是有范圍的,這樣當(dāng)抽取的題量過大時,難免會產(chǎn)生重復(fù)的隨機數(shù),因而需要在抽取過程中處理數(shù)字重復(fù)的問題,具體的處理過程如下:
1.首先采用Random()函數(shù)來生成一個隨機的數(shù)字SelectNum,數(shù)字的范圍跟數(shù)據(jù)庫中現(xiàn)存的題量相關(guān),不能超過現(xiàn)有題目數(shù)量,不然會出現(xiàn)產(chǎn)生的數(shù)字抽不到題目。
2.判斷該數(shù)字SelectNum是否已經(jīng)存在。方法是將該數(shù)字與已經(jīng)抽取的題號逐個進行比較,也就是遍歷已經(jīng)存在的題號數(shù)組tempsetpd,如果數(shù)組為空,則證明是第一次抽題,可以直接跳到第3步;如果是在數(shù)組中找到了抽取的數(shù)字,則證明該題目已經(jīng)抽取過,不能再抽取;如果遍歷整個數(shù)組都沒找到抽取的數(shù)字,則證明尚未抽取過該題目,可以抽取該題號的題目。
3.將抽取到的題目寫入緩沖區(qū),以備后續(xù)輸出使用。同時,需要將SelectNum寫入題號數(shù)組tempsetpd,以備后續(xù)的比較使用。
4.循環(huán)上邊的過程,繼續(xù)抽取下一個題目。
經(jīng)過上述過程的處理,如果數(shù)字不重復(fù),則可以選擇該習(xí)題,并把該題目放入緩沖區(qū),用于后續(xù)的輸出;否則就重新產(chǎn)生隨機數(shù),繼續(xù)上述的操作,直到找到合適的題目,以生成試題和答案。經(jīng)過上述過程的處理,抽取的試題不會出現(xiàn)重復(fù)。
在綜合題中,題目的題干和答案都采用圖像的方式來處理。通常情況下,對圖像的處理有兩種方式:第一種是將圖像存在指定的文件夾中,數(shù)據(jù)庫中寫入圖像的路徑;第二種是將圖像進行數(shù)據(jù)轉(zhuǎn)換直接寫入數(shù)據(jù)庫中。二者各有所長,在這里選擇第二種方式。這種方式在數(shù)據(jù)處理時相對復(fù)雜,但是后期的維護卻相對簡單。下面以增加題目時對圖像的數(shù)據(jù)處理為例,介紹圖像處理過程。
1.創(chuàng)建具體的題目對象,此處要注意對象中相關(guān)屬性的類型,在定義類時將相關(guān)的返回值類型定義為byte,具體代碼為public byte[] Options,用于接收圖像數(shù)據(jù)。
2.需要在界面中設(shè)置輸入的數(shù)據(jù)類型為圖像,可以將題干中的圖像和答案中的圖像輸入到系統(tǒng)中。
3.將題目對象中的圖像數(shù)據(jù)傳輸?shù)絽?shù)列表中,具體代碼為:SqlParameter("@options",SqlDbType.Image);parameters[2].Value = model.Answer。
4.借助DBHelperSQL中的方法,將參數(shù)列表中的數(shù)據(jù)寫入數(shù)據(jù)庫,即可完成題目的增加。
題目輸出問題是指試題選擇完成后,將試題生成文件的問題。通常的處理方式有兩種:一種是將試題寫入記事本;另一種是將試題寫入Word文檔。由于第一種只能處理文本信息,而試題生成系統(tǒng)中的綜合題是需要輸出圖像的,因此在這里選擇將試題直接輸出Word文檔。由于綜合題與其他四種類型題目的處理方式不同,在輸出時也做了區(qū)別處理,因此寫入時用了不同的處理方式。具體過程如下:
1.在系統(tǒng)中創(chuàng)建一個Word文檔對象WordDoc。
2.將數(shù)據(jù)庫中抽取的題目數(shù)據(jù)寫入WordDoc中,具體語句為WordDoc.Paragraphs.Last.Range.Text += sbzdyzh.ToString()。
3.將題目中的圖像數(shù)據(jù)進行轉(zhuǎn)換后,輸出到WordDoc中,具體轉(zhuǎn)換語句為:
Imagezhimg = Image.FromStream(new MemoryStream((byte[])
(dszdyzh.Tables[0].Rows[k]["options"])));
Bitmapzhtu = new Bitmap(zhimg, 100, 100);
stringsfpath= "D://TEMP/" + DateTime.Now.ToFileTime() + ".jpg";
zhtu.Save(sfpath, ImageFormat.Jpeg);
myselzh.EndKey(refuniform, ref ObjNoth2);
WordDoc.InlineShapes.AddPicture(sfpath, ref ObjNoth, ref ObjNoth, ref ObjNoth);
4.關(guān)閉WordDoc對象。
試題生成系統(tǒng)建成后,可以根據(jù)需要自行抽題。通過測試,該試題生成系統(tǒng)可以在10秒內(nèi)生成一套涵蓋判斷、選擇、填空、簡答和綜合題等五種題型的完整試題,同時生成答案,將教師從煩瑣復(fù)雜的出題工作中解放出來,并可以作為題庫建設(shè)的重要工具。
雖然該試題生成系統(tǒng)能夠?qū)崿F(xiàn)正常的抽題功能,有力地促進了題庫建設(shè)工作,但是在很多方面還存在不足,比如統(tǒng)計功能、智能化設(shè)置等都未能涉及,這將是今后優(yōu)化試題生成系統(tǒng)開發(fā)工作的重點方向。