C++課程自動評測係統的設計與實現
行業科技
作者:高偉
【摘要】根據C++課程教學的需要,對自動評測係統的功能和核心實現技術進行了分析和探討,為程序語言類輔助教學軟件的開發提供了技術參考。
【關鍵詞】評測係統,shell腳本,JSP,cron服務
1、引言
程序語言課程是一種對實踐性要求很強的技能學習,很多學生在程序語言的學習中,缺乏程序設計能力,編程不熟練,而產生這一現象的主要原因是程序訓練量不夠,然而如果加大程序設計的作業量,教師要對每個學生的作業進行編譯、檢查,進行錯誤的統計和分析,這無疑會是一個巨大的負擔。自動評測係統的出現正好解決了這個問題,它保證了判題的及時性和準確性。學生上傳程序後馬上就能看到評判結果,否定的結果可以督促學生查找原因,及時糾正;肯定的結果可以進一步激發學生編程的積極性,提高編程興趣。教師則可以將節省下來的判作業的時間用於進一步的教學研究。
現有的自動評測係統多采用ACM競賽模式,一般遵循“注冊—登錄—選題—上傳程序—查看結果和排名”的操作步驟,隻有普通用戶和管理員身份,沒有教師的參與。教師無法對課堂學生進行統一要求,也無法獲取學生的解題情況。這樣的係統適合學生課下自主練習,不適合教學使用,因此開發一個和課程教學相配合的自動評測係統變得非常必要。
2、係統功能設計
本係統的功能模塊主要分為學生、教師和管理員三大部分。
考慮到教學的需要,設計了作業和測試兩種形式。平時的教學過程中教師布置作業,指定一些典型題目,供學生上機練習,鞏固課堂所學;每隔一段時間教師對學生進行階段性測試,這時可以布置測試,指定章節、知識點、難度,讓學生隨機抽取題目,還可以通過固定IP的方式,讓每個學生隻能在一台機器上登錄,同時隱藏過去所有的作業和測試,這樣既保證測試的公平性,又能有效避免學生作弊的情況。
學生登錄係統後,會看到已完成的作業/測試、正在進行的作業/測試,已完成的作業/測試已經過了截止時間,無法提交程序;對於正在進行的作業/測試,學生可以提交程序。選擇題號,上傳程序,等待片刻,即可看到評判結果:正確、編譯有錯、運行超時、運行結果不對等提示。
為方便資源共享,每一位教師都有權向題庫中增加題目、修改題目;教師可以為本課堂學生布置作業/測試;查看、修改和刪除作業/測試;統計作業中每個題目的正確率;對於已經完成的作業/測試,可以手動進行評判,並題寫評語,導出學生成績。
管理員負責管理學生和教師信息,可逐個添加學生,也可以通過上傳Excel文件批量添加學生;每個學生都有自己的課序號,每個教師也有自己的課序號,同一課序號的屬於一個課堂;考慮到C++課程的課堂數比較多,為方便統一標準,在管理員中增加了統一布置作業/測試的功能,可同時為多個課堂布置。
3、係統核心實現
係統基於B/S模式,主要采用JSP技術開發,運行平台選用Linux作為操作係統,Apache Tomcat作為服務器,MySQL作為後台數據庫,C++編譯器選用GCC/G++。
程序評判功能是整個係統的核心,指的是學生提交源程序後,自動判斷源程序的對錯,並將結果實時反饋給學生。評判過程采用黑盒測試,一個題目最多設有4組測試數據,對於每組測試數據,將學生程序的運行結果和正確結果進行比對,隻有全部都在誤差允許範圍內,才判定程序正確。具體的評判過程利用Linux係統中的shell腳本實現,而測試數據的獲取、shell腳本的執行、評判結果的反饋則在JSP中實現。
3.1 shell腳本的處理過程
shell腳本就像是早期DOS年代的批處理文件(.bat),最簡單的功能就是將許多Linux指令彙整在一起,讓使用者很輕易的就能夠去處理複雜的動作,而且shell script還提供數組、循環、條件與邏輯判斷等重要功能,讓用戶也可以直接以shell來撰寫程序。
首先通過g++命令對源程序編譯、連接,如果編譯連接未通過,返回代表編譯有錯的數字0;如果編譯連接通過,則會生成可執行程序。接下來從測試數據中分離出每組輸入數據和正確輸出,針對每組測試數據運行程序。這時可以利用管線命令將輸入數據提供給可執行程序,管線命令可以將前一個指令標準輸出數據作為後一個指令的標準輸入,它使用的界定符號是“|”,使用形式為:res=`echo -e "$x" |"$2"`,其中變量x保存的是輸入數據,參數2是可執行程序的文件名,這條語句的作用是利用echo命令讀出變量x的內容,將其傳給可執行程序進行處理,可執行程序的輸出數據保存到變量res中。獲得輸出數據後,比較輸出數據和正確答案是否一致,如果不一致,判斷是否在誤差允許範圍內,如果沒在誤差允許範圍內,則認定程序運行結果不對,返回錯誤的測試數據組數(1~4)。如果運行結果正確,進行下一組測試數據的測試。全部測試完畢,均正確,返回代表程序正確的數字5。