姚文龍
(廣西第一工業學校, 廣西 南寧 530023)
目前,很多學校的考試方式基本還是采用紙質試卷的考試方式,考完之后由教師逐一批改試卷。這種方式的優點的可以保留學生做題的痕跡,以便以后查閱。缺點是當考試的次數比較多時,有時可能還要求多備幾份試題,由教務部門在考試前隨機抽取一份,這樣教師出題和批改的工作量就會相當大。隨著現在計算機的普及,對于標準化類型的試題,完全可以考慮使用網絡智能化方式進行考試,使用程序的進行隨機抽題、考試和即時改卷。可以節省紙張,并且減輕的教師的工作量。2011年,我校計算機專業的學生參加了全國系統的一個設計比賽,需要對參加多個競賽的學生進行訓練,智能化考試非常適合這種情況,網絡智能化考試的系統就是在此背景下開發實現的。
網絡智能化考試可以采用兩種模式:客戶機―服務器(CS)模式和瀏覽器―服務器(BS)模式。C/S要求第一臺考試機都要安裝一個考試端軟件。我們的考試系統首先考慮在使用上應當簡單易用,對教師和學生的操作要求不高,只要在教師機上進行簡單的安裝和設置就可以使用。所以在結構上使用Web結構的B/S方式,這樣硬件上只要求考試用計算機聯網就可以了,軟件上則只要求每臺計算機安裝有瀏覽器。具體技術上考慮易于安裝,使用PHP語言編寫動態網頁和數據處理,用PHP內置支持的SQLite數據庫保存數據,前端使用jQuery,JSON和Html顯示試題,并且將學生的考試結果生成報表。這樣,只要在教師上安裝一個 WampServer軟件,就完成了運行環境的安裝,再把程序復制進去就完成了整個環境的配置了。在考試管理上可以使用電子表格錄入試題,然后用Delphi編寫程序將試題導入到SQLite數據庫。
系統結構確定之后,考慮最簡單的處理方式,在數據庫中使用兩個表進行數據的存儲:試題表和成績表。其中試題表則用于存儲試題的相關信息,包括課程,題目,正確答案和ABCD四個選項,可以處理單項選擇題、多項選擇題和判斷題這幾個標準題型。成績表則是存儲學生的考試成績,包括學生姓名,成績和考試的時間這些信息。
數據存儲使用SQLite,SQLite是一個單文件的數據庫,PHP內置支持,用程序將試題并導入之后,在考試時教師只要將這個數據庫文件復制入去就可以開始考試了,不需要再進行其它的設置,更加方便使用,這也是為什么選擇SQLite數據庫,而不是MySQl或者SQLServer的原因。
對于考試的題目的管理考慮使用電子表格準備數據,這里不采用PHP網頁的管理方式,而是使用電子表格模板來準備數據,然后用用 Delphi設計程序導入的管理題目數據到SQLite數據庫的用戶表中。因為電子表格符合人們的使用習慣,相對于直接使用PHP編程在網頁中一行行錄入的方式,雖然另行編寫錄入程序在開發時比較麻煩,但用戶使用時很方便,因為導入和管理都是教師機上進行,用Delphi編寫程序處理數據也不難處理。
整體結構如下,前端由Html,javaScript處理數據的顯示,后臺由PHP編寫相應的頁面進行數據和存取處理:

第一步,使用 Navicat for SQLite數據庫工具,建立SQLite數據庫,再在其中建立試題和成績兩個表。
第二步,使用Delphi設計試題表的管理程序,實現導入數據,管理數據功能,這樣可以避開用管理網頁的不便。
這里的關鍵技術是在Delphi中調用管理SQLite數據,這時是采用 SQLiteTable3.pas,sqlite3udf.pas,SQLite3.pas三個單元來實現。
下面的代碼用來操作SQLite數據庫顯示到表格中。sldb ∶= TSQLiteDatabase.Create('radtest.sqlite');sSQL ∶= 'select * from radtm ';
sltb ∶= sldb.GetTable(UTF8Encode(sSQL));第三步,將 sltb內存表的數據通過循環轉入到ClientDataSet再實現綁定到控件中。
數據的導入則是使用 TExcelApplication;TExcelWorkbook; TExcelWorksheet;三個單元,連接電子表格,然后取出單元格的數據,再寫入到ClientDataSet中,保存時使用循環將數據寫到SQLite數據庫中。
第四步,是系統的主要的部分,用 PHP技術結合JavaScript實現隨機抽題和考試、批改功能。登記頁面如下:

當用戶選擇項目,填寫用戶名后,點擊進入考場。使用location.href將用戶名和科目傳給考試出題頁radtest.htm。在該頁面中用javaScript先取出傳來的參數,然后使用Ajax方式從后臺調用PHP程序獲取試題數據:
javaScript代碼:
kc = decodeURI(getUrlPara("kc"));
un = decodeURI(getUrlPara("un"));
$.getJSON("radtest.php", {
cmd∶ "getTM",
kc∶encodeURI(kc)
},prodojson);
function prodojson(json){
//……
}
PHP代碼:
include_once("conn_sqlite.inc.php");
$kc = urldecode($_GET["kc"]);
$useTMcount = 100; //題量
$querys = sprintf('SELECT title,ra,rb,rc,rd,da,tp,js,rtx,rap,rbp,rcp,rdp FROM radtm where kc="%s"ORDER BY random() limit %d', $kc, $useTMcount);
$results = $dbs->prepare($querys);
$results->execute();
$dbs = null;
$arr4s = array();
foreach ($results as $row) {
$arr4s[] = $row;
}
echo json_encode($arr4s);
在prodojson中取得PHP傳來的JSON數據,首先保存到items二維數組,然后逐一分析題型,構造考試頁面顯示。多選題使用checkbox類型的表單元素,單選題或判斷題則使用 radio類型的表單元素。并使用JavaScript函數進行倒計時,考試的頁面如下:

當考試時間到時,或者用戶點擊提交時,進行試卷的批改,將用戶的選擇項與items二維數組中的正確答案元素進行比較,進行正誤提示,同時突出顯示相應的正確答案。最后得出本次的練習成績,并將成績記錄到數據庫的成績表中。
另外,如果點擊查看成績記錄,會顯示一個報表,顯示已經提交的所有練習人員的成績,方便個人進行對比。

因篇幅關系,以上只是列出了關鍵部分代碼。用比較簡單的方式,實現了自動隨機智能出題,考試和批改功能,以及成績記錄功能。整個系統混合使用了Delphi,SQLite,PHP,jQuery,JSON,Html技術。
網絡智能化考試系統編寫完成后,交給我校參加競賽訓練的教師和學生使用,學生和教師都覺得使用上很方便,出題靈活多變,省去了手工出題批改的麻煩,也節省了大量的紙張,經過練習,選手在比賽中也取得了比較好的成績。
對這類BS方式的架構,一般都會考慮全部使用網頁方式進行維護,但在使用中發現網頁方式對于批量數據導入的處理很不方便。在此使用混合處理方式,各取其優點,在使用上方便靈活,達到比較好的效果。
在簡單的練習測試使用的基礎上,只要在其中加入用戶管理功能,就可以實現登錄考試的功能,可以用于自動網絡化考試抽題與批改。如能進一步加入考試記錄表,就可以保留考生的答案選項,進行備案和考后查閱。
如上所述,在將來的考試方式中,對于標準化部分題目的考試,完全可以使用網絡方式進行,節省紙張和時間,考試結果也更快速和準確,對教師來說,只要將試題準備好就可以發,可以省去出試卷,和考后的試卷批改這些麻煩,其它工作都由考試系統去完成了,大大提高了教師的工作效率,實現教學考試的現代化,具有重大開發意義。
[1] (澳)Luke Welling ——PHP 和 MySQL Web 開發(第四版)[M].機械工業出版社,2009.
[2] (印)Vijay Joshi——PHP與jQuery [M].人民郵電出版社,2011.