
摘? 要:本文針對目前計算機專業畢業生就業難的問題,提出開發一個程序設計類課程在線學習系統,有助于減輕教師的工作量、增加學生的代碼量,從而提高學生的編程能力,但程序設計題的主觀性較強,大多數在線評閱的準確率難以令人滿意;本文就程序設計題的在線評閱技術進行探討,給出了程序設計題自動評閱模塊的實現方法、評閱目標和原則,以及題目測試數據的要求、靜態評閱實現的方法、語法錯誤檢測方法,還給出了運行結果自動評閱的實現方法等;評閱的技術具有一般性,可以應用到C語言、C++和Java等語言的自動評閱上。
關鍵字:程序設計題;在線評閱;靜態評閱;C語言
中圖分類號:TP311.1? ? ? 文獻標識碼:A 文章編號:2096-4706(2019)08-0104-03
Abstract:In view of the difficult employment of computer graduates at present,this paper puts forward that the development of an online learning system of programming courses can help reduce the workload of teachers,increase the amount of code for students,and thus improve the programming ability of students. However,the subjectivity of programming problems is strong,and the accuracy of most online reviews is difficult to be satisfied. This paper discusses the online evaluation technology of program design questions,and gives the realization method of automatic evaluation module of program design questions,the goal and principle of evaluation,the requirement of test data,and the realization method of static evaluation. The method of syntax error detection and the realization method of automatic evaluation of running results are also given in this paper. The technology of review is general and can be applied to automatic review in C language,C++ language and Java language.
Keywords:programming questions;online evaluation;static evaluation;C language
1? 現狀及問題
據不完全統計,我國軟件人才總量不足,結構也不合理,軟件測試專業人員缺口高達20萬,Java軟件工程師每年的缺口為15萬左右,各行各業對計算機人才的需求不減,而計算機專業卻是高校應屆生就業率較低的專業之一。對于計算機類專業的畢業生,有很多公司抱怨其實踐能力較差,高校培養出來的人才難以符合企業需求。社會需要的是編程能力強、開發水平高、掌握新技術的計算機應用創新型人才。因此在教學方面急需轉變傳統教學方式,增強學生編程實踐能力,以培養適應市場需求的應用型人才。
為了適應社會對計算機專業人才的需求,我院與企業雙主體共同培養計算機專業人才,計算機科學與技術專業和數據科學與大數據技術專業成為首批合作的專業。校企協同育人的模式有利于培養適應社會需求的應用型人才,但這也帶來了新的挑戰。在專業課程模塊上將會開設更多與企業需求的前沿技術相關的課程,如數據挖掘技術與應用、神經網絡與深度學習應用和智能機器人等課程,這些課程的學習都要求學生具備較好的編程能力。C語言、C++和Java程序設計等是計算機及大數據專業的重要基礎課程,學好這些課程將為后續專業課程的學習打下堅實基礎。如何提高學生的基礎編程能力?在教學中可以通過增加學生的編程代碼量來提高學生的編程能力,然而傳統的教學方式勢必會加重教師的教學負擔,開發一個程序設計類課程在線學習系統有助于減輕教師的工作量、增加學生的代碼量,從而提高學生的編程能力。由于程序設計題的主觀性較強,現有的自動評閱準確率難以令人滿意,目前能用于教學與考試的系統并不多,針對這一情況,本文就程序設計題的在線評閱技術進行探討。
2? 自動評閱模塊
自動評閱模塊是程序設計題在線評閱系統的重要組成部分,該模塊能夠實現對學生提交的程序進行自動評閱。該模塊實現的功能包括:接收學生提交的程序、對程序進行去掉注釋處理、靜態評閱、輸出語句標準化、動態評閱,并將評閱結果返回給學生且保存到數據庫等。在線評閱系統接收提交的程序后,Web服務器與判分的守護進程創建Socket連接,并將程序以及測試數據發送給守護進程;自動評閱系統首先將提交的程序中所有的注釋全部去掉,然后對必須包含的關鍵字進行匹配,并計算靜態相似度。對提交程序中的printf輸出語句格式控制進行標準化處理;然后編譯、運行學生程序,輸入測試數據,再判斷輸出的結果是否正確,可通過反復多次運行學生程序來提高判分的準確率。
評判系統滿足以下目標和原則:
(1)實現并行評閱,對同時提交的程序可以同時進行判分,且相互之間不影響結果。
(2)在評閱過程中,控制每個判分進程資源的使用,合理分配服務器的內存和CPU資源。
(3)評閱的可靠性,保證判分的準確率在測試中超過某個值。
3? 題目輸入輸出要求
輸入值是用來檢測學生程序是否正確。輸入值對學生來說是看不到的,輸入值可以設置若干組,后臺判分程序根據輸入的組數來執行程序,每執行一次程序輸入一組值。設置多組輸入值的好處是避免出現對某些題目的誤判。例如:
題目:用C語言編寫一個命題公式賦值計算器,通過鍵盤輸入一組賦值,實現自動計算命題邏輯公式的真值。
該題輸出的結果只有兩種情況:1或0,如果只有一組輸入值,那么學生只需在程序中輸出1或0就可以得分。設置了多組值,且輸出結果有的為0,有的為1,這樣不管是學生的程序輸出1還是0都會被判分進程判為0分。
在動態評閱時,系統將多次運行學生程序,根據所有的運行結果來進行判分。輸出值也是分為多組的,每組輸出值是對應一組輸入值的,輸出值是出題老師事先根據輸入值計算出來的標準結果。用輸出值與運行學生的程序進行關鍵字的對比來計算動態相似度,輸出值也相當于標準答案。
4? 在線評閱的關鍵技術
4.1? 靜態評閱
靜態評閱目的是檢查程序是否包含必要的關鍵字或者框架,這樣可以限制學生使用某些知識來解決問題。例如,題目中要求使用自定義的結構體,那么提交的程序中必須包含有struct{}這樣的框架,否則該程序被檢測為沒有按照題目要求完成,被判為0分。在判斷關鍵字前首先去掉注釋,避免提交的程序中含有大量注釋,造成誤判。靜態評閱的處理流程圖:
將程序去掉注釋后,還需要進一步檢測程序中是否包含某些關鍵字,檢測關鍵字的算法如下:
(2)從程序文件中使用fgets()讀取新的一行到字符數組str中,轉(3),讀取失敗,轉(4);
(3)在關鍵序列S中循環將關鍵字取出,每次循環使用strstr()函數檢測關鍵字是否存在于str字符串中。如果strstr()函數返回指針非空,則i=i+1,并從序列S中刪除該關鍵字;
(4)關鍵字檢測結束,i為程序中包含關鍵字的個數。
4.2? 語法錯誤檢測
程序的語法錯誤是自動評閱中常見的錯誤,因此學生的程序提交到服務器后首先要進行語法上的檢查,造成語法錯誤主要有兩方面的原因:一是程序本身存在書寫上的錯誤,導致編譯無法通過;二是編譯器的差異造成編譯無法通過;如對于C語言來說,編譯器的類型比較多,如VC++,VS2010、VS2015等,也有Linux環境運行的編譯器gcc等,這些差異會造成在一個編譯器能編譯通過,但另一個編譯器無法通過。因此,自動評閱系統應給出錯誤的理由或提示。
如何檢測提交的程序是否有語法錯誤呢?最直接的方法是通過調用服務器上編譯器的命令檢測,如在linux系統下C語言在判分程序中使用system函數調用shell命令進行編譯,C語言函數system()調用gcc命令編譯學生提交的程序。使用system()函數調用命令的格式如下:
如果編譯通過,將會生成可執行文件,說明程序沒有語法上的錯誤,否則,后面步驟不再執行,該題直接判為0分。
4.3? 無限運行程序的終止
有時在運行提交的程序時,會出現這樣的情況,死循環、要求輸入大量的數據等,如下面兩個程序片段:
在這種情況下,該進程是不會自動終止的,這種情況下往往需要限制提交程序的運行時間,采用非正常終止的手段。
4.4? 運行結果的評閱
本文采用了多組測試值,對提交的程序進行多次測試,目的是提高評閱的正確率。對評閱結果分以下三種情況:
(1)每一組測試結果都正確,則提交程序是正確的。
(2)部分測試值結果錯誤,說明提交的程序不完全正確。
(3)所有測試值得到的結果是錯誤的,則該程序錯誤。
在動態評閱方法上,判斷程序是否正確的方法是對比程序運行結果。對比的方法有兩種,一是完全匹配法,二是關鍵字匹配法。
完全匹配方法,即運行提交的程序后,得到的運行結果與標準答案進行匹配,當結果完全一致,那么程序是正確的,否則程序是錯誤。
關鍵字匹配法,標準答案中只給出主要的關鍵字,如果運行結果包含所有的必要關鍵字,那么我們認為是正確的。
如題目:輸入整數n,計算并輸出n!;實現的代碼如下:
后臺給出的標準答案是只輸出n!的值,并沒有其他字符。從上面的代碼可以看出程序輸出了提示的語句“請輸入n的值:”,如果采用完全匹配方法程序是錯誤的。如果采用關鍵字匹配法,提交的程序是正確的。目前很多系統采用的是完全匹配的方法,這種評閱方法對輸出有嚴格要求;對于關鍵字匹配法的實現方法是首先要盡量去除無關的輸出字符,然后再檢測輸出結果中的關鍵字,這種評閱方法放寬了輸出的要求。
5? 結? 論
本文對程序設計題的自動評閱的一般方法進行了探討,一些方法已經被應用到C語言自動評閱系統上;國內很多自動評閱系統在評閱后學生只能看到對或錯的兩種結果,學生往往難以修改程序;作為練習系統,我院開發的在線評閱系統增加了錯誤提示功能,學生可以根據不同的錯誤類型對程序進行修改,同時減輕了教師輔導工作量;本文提及的技術也可以應用到C++、Java等語言的自動評閱系統的開發中。
參考文獻:
[1] 林寧,左悅.基于Linux的C語言編程題在線評分平臺的搭建 [J].福建電腦,2018,34(9):45-46.
[2] 何文廣,周珂,熊剛強,等.VB.NET程序設計題動態評閱技術研究 [J].實驗室研究與探索,2017,36(11):122-125.
[3] 劉悅芳.依據程序依賴關系匹配度的C語言程序設計題評分方法 [J].電子技術與軟件工程,2019(1):238.
作者簡介:林寧(1981-),男,漢族,廣西北流人,講師,碩士,研究方向:軟件理論與應用、信號與信息處理、算法分析。