摘 要】文章主要介紹了在基于TCP/IP協(xié)議的B/S網(wǎng)上考試系統(tǒng)中,自動抽取試題的一種方法。網(wǎng)上考試系統(tǒng)由老師設(shè)置考試時間、試卷結(jié)構(gòu),然后根據(jù)設(shè)置的試卷結(jié)構(gòu)從試題庫中隨機(jī)抽取試題組織成試卷,學(xué)生可在網(wǎng)上進(jìn)行考試及成績查詢,系統(tǒng)中關(guān)鍵的技術(shù)之一是在大量題目中抽取適當(dāng)試題組成試卷,為網(wǎng)上正??荚囂峁┝藞詫嵉幕A(chǔ)。 【關(guān)鍵詞】網(wǎng)上考試;算法;二分查找;插入排序 【中圖分類號】 G434 【文獻(xiàn)標(biāo)識碼】 A 【文章編號】 1008-1151(2006)03-0102-02
傳統(tǒng)的考試系統(tǒng)依賴于紙張,考試完畢之后,紙張不利于長期保存,成績的查詢和公布也很困難,而且造成了很大的浪費(fèi)。本考試系統(tǒng)利用現(xiàn)有的計算機(jī)資源,將傳統(tǒng)的考試應(yīng)用到網(wǎng)絡(luò)上,既可以組織注重理論知識的集中式閉卷考試,也可以組織注重實際動手能力的長期開卷考試。試卷的題型包括填空題、單項選擇題、判斷題、讀程序題和編程題,并且分別建立了這幾種題型數(shù)據(jù)庫。如何抽選題庫中的題目組成試卷,是網(wǎng)上考試的關(guān)鍵技術(shù)之一。下面將介紹各種題型組成試卷過程中應(yīng)用的算法。 一、實現(xiàn)流程 網(wǎng)上考試系統(tǒng)中自動抽取試題、組織試卷的過程需要借助數(shù)組來完成,具體思想是,將抽取出來的沒有重復(fù)試題編號寫入數(shù)組中,試題編號按順序存儲,然后一次性到數(shù)據(jù)庫中選擇試題。這樣可以保證試題抽選的唯一性,又可以提高數(shù)據(jù)庫的訪問效率。其操作流程如圖1所示:
 圖1 試題抽選流程圖 二、主要涉及的關(guān)鍵技術(shù) ?。ㄒ唬?shù)據(jù)庫的連接 本網(wǎng)上考試系統(tǒng)使用ASP+SQL SERVER 2000進(jìn)行設(shè)計和開發(fā),SQL SERVER 2000數(shù)據(jù)庫中存儲各種類型的試題,首先建立一個名稱為tk_c的數(shù)據(jù)源,然后使用ASP腳本連接數(shù)據(jù)庫,將連接數(shù)據(jù)庫的代碼寫入一個共有的文件中,其他需要連接數(shù)據(jù)庫的文件直需要引入這個文件即可,引入文件的代碼如下: <!--#include file="opendatabase.asp"--> 連接數(shù)據(jù)庫的代碼如下: set conn=Server.CreateObject("ADODB.Connection") conn.open"dsn=tk_c;uid=sa;pwd=sql;" 登錄SQL SERVER使用sa,密碼為sql。 連接成功后,需要將數(shù)據(jù)庫中符合要求的試題首先提取出來,使用SQL語句查找符合指定考點、指定難度的試題放入集合strecordset中,并計算試題的個數(shù)count,為產(chǎn)生正確的隨機(jī)試題編號使用。 (二)二分查找 將產(chǎn)生的沒有重復(fù)的隨機(jī)題目編號存入數(shù)組st中,使用成熟的二分查找方法判斷數(shù)組中是否已經(jīng)存在此試題編號,二分法查找比順序查找處理效率高,具體代碼如下: Function BinarySearch(st,n,x) var i=0,j=n-1,t; Do While(i<=j) t=(i+j)/2; if(st(t)=x) then BinarySearch =true; else if(st(t)>x) then j=t-1; t=(i+j)/2; //左查找 else i=t+1; t=(i+j)/2; //右查找 end if end if loop BinarySearch=false; End Function ?。ㄈ┎迦肱判?br> 為了能夠?qū)崿F(xiàn)二分查找需要首先將數(shù)組中的數(shù)據(jù)按從小到大的順序存儲,當(dāng)產(chǎn)生一個隨機(jī)編號后,將此隨機(jī)隨機(jī)編號按插入排序法插入數(shù)組。實現(xiàn)代碼如下: Function InsertSort(st, n, x) var i=n-1; Do While(x<st(i)) st(i+1)=st(i); i=i-1; loop //查找并插入排序 st(i)=x; End Function (四)自動抽題的實現(xiàn) 通過調(diào)用上述兩個函數(shù)可自動產(chǎn)生試題,首先判斷試題是否存在,不存在插入數(shù)組st;否則重新產(chǎn)生試題編號。重復(fù)操作,直到滿足試題總數(shù)為止,其具體實現(xiàn)代碼如下: Function rndnum() randomize num=cint(fix(rnd*count)) //產(chǎn)生隨機(jī)編號 n=0 Do While(n<=‘試題總數(shù)‘) if (!BinarySearch(st,n,num)) then InsertSort(st, n, num); n=n+1; else randomize num=cint(fix(rnd*count)) end if loop //查找并插入排序 End Function (五)試卷顯示及特殊字符處理 產(chǎn)生的沒有重復(fù)的試題編號按照從小到大順序放入數(shù)組中后,從頭開始選擇一個試題編號存入變量num中,然后將strecordset的指針放置在開始位置,在移動到num位置,再將指定位置的試題內(nèi)容顯示在網(wǎng)頁上,重復(fù)讀取數(shù)組的試題編號并繼續(xù)顯示在網(wǎng)頁上。 在顯示試題的時候,有很多特殊的字符不能夠正常顯示,需要經(jīng)過處理才能夠按照正常的效果顯示,這些特殊的字符包括空格、“<”,“>”,回車,換行等,可通過下列代碼實現(xiàn): server.htmlencode(st); 或者調(diào)用下列函數(shù): Function trans_code(str) if isNULL(str) then trans_code="" exit function end if l=len(str) result="" for iii = 1 to l select case mid(str,iii,1) case "<" result =result+"<" case ">" result=result+">" case chr(13) result=result+"<br>" case chr(34) result=result+""" case "&" result=result+"&" case chr(32) if iii+1<=l and iii-1>0 then if mid(str,iii+1,1)=chr(32) or mid(str,iii+1,1)=chr(9) or mid(str,iii-1,1)=chr(32) or mid(str,iii-1,1)=chr(9) then result=re?鄄sult+" " else result=result+" " end if else result=result+" " end if case chr(9) result=result+" " case else result=result+mid(str,iii,1) end select next trans_code=result End Function 三、結(jié)論 本抽取試題的實現(xiàn)方法可應(yīng)用在大量試題的數(shù)據(jù)庫中,能夠快速、高效地從題庫中選擇出符合要求的題目并組成試卷,為考試提供了堅實的基礎(chǔ)。此抽題方法已在省級精品課程“基于C++的面向?qū)ο蟪绦蛟O(shè)計”網(wǎng)上考試系統(tǒng)中應(yīng)用,使用效果良好。
|