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