林 渤, 薛 斌, 林逸滔, 胡建鵬
(上海工程技術大學 電子電氣工程學院, 上海 201620)
隨著社會不斷發展,對于以應用型人才培養為辦學目標的眾多本科院校,如何在學生人數逐年增加、上機實驗課指導老師無暇輔導所有學生的情況下提高教學質量,已成為了C語言程序設計課程迫在眉睫需解決的問題[1]。目前程序設計課程的教學培養目標多是學習程序設計的思想和方法,通過大量實踐編程練習來掌握程序設計的流程與技巧,只有通過大量的練習才能了解和避免程序中常出現的Bug。目前已有很多此類系統,如PTA輔助教學平臺,側重于在線考試,交互性不強,在教學方面無法針對于每一位同學進行錯誤分析[2];Leetcode平臺側重于有一定基礎的學生進行算法練習,學生不能主動提交各類錯誤報告,系統也無法收集學生詳細的錯誤信息[3];codecode.net平臺適合于計算機專業的學生,專業程度相對較高,初學者不易掌握[4]。為此,本文設計和開發了更有針對性的在線實驗系統,面向非計算機專業的初學者用戶,簡潔易用,可快速上手,并提供錯誤分析和查詢功能,實現了學生的自助和互助;同時進行實驗在線提交并生成實驗報告,教師可以查看各種實驗數據,關注學生的學習進展。
本系統使用B/S架構,采用三層結構。B/S架構的跨平臺性好,能夠做到一次開發,處處運行。從結構上,系統可以分為視圖層、業務層和持久層三層。功能模塊上可以分為系統管理模塊,在線編譯執行模塊,自動評分模塊,實驗報告生成提交模塊,錯誤采集查詢模塊等五大模塊。系統架構圖如圖1所示。
系統主要實現了程序在線編譯執行、學生自助評估、錯誤分析與查詢、實驗報告生成等功能。數據庫的實體關系圖如圖2所示。其中,學生表用來存放學生的信息;教師表用來存放教師的信息;錯誤分析表記錄了學生提交的各種錯誤信息;實驗小結表存放實驗小結及實驗報告上傳信息;實驗題目表用來存放每一個具體實驗題目的信息,多個實驗題目組合成一次實驗,一個課程則可發布多次實驗;測試用例表用來存放測試用例信息,一個實驗題目可有多個測試用例;而實驗提交表用來存放代碼提交信息,用于生成實驗報告。
(1)在線編譯執行,學生自助評估。系統給學生端用戶提供了在線編譯執行代碼的功能,支持網頁端用戶輸入的交互功能,用戶可以隨時隨地在瀏覽器中編寫執行代碼,還可以對編譯和執行過程進行時間控制并加以提示,防止用戶執行非法代碼,同時對編譯執行的結果進行解析,做到與Dev-C++的編譯信息一致,在此基礎上增加了解析字段,幫助學生更好的理解報錯信息。執行代碼后,系統會給出由輸入輸出結果相似度(輸入輸出結果與輸出樣例之間的編輯距離/輸出樣例字符串長)的評估結果,給出與測試用例的相似度。

圖1 系統架構

圖2 實體關系圖
(2)錯誤采集、錯誤分析及查詢功能。在實驗提交界面集成了錯誤采集功能,學生可以在調試程序時將錯誤信息填入到表單中完成錯誤采集,包括語法錯誤、邏輯錯誤和運行時錯誤。系統支持學生提交多個錯誤分析,并且為了優化學生填寫表單時的操作,還提供了一系列的快捷按鈕,如可以將第一個語法錯誤自動填入表單中,減少手動填寫的操作。所有采集的這些錯誤信息經過整理后形成常見錯誤數據庫,基于這個數據庫給學生提供錯誤查詢功能。
(3)實驗提交和報告生成。在生成報告頁面,學生可以預覽實驗報告。在第一次生成報告時,系統會自動跳轉至報告底部的實驗小結,學生按照要求填寫實驗心得,默認為PDF文件,也可打印。確認無誤后可以上傳至教師端,文件會自動命名為學號-姓名-班級-實驗名.pdf。
(4)教師端功能。系統提供基礎的登錄和注銷功能,教師可以對實驗、題目、班級、學生、公告等信息進行管理。根據教學需要對發布的實驗以及題庫增刪改查。根據需要及時發布公告,查看學生代碼的提交情況以及實驗報告的提交記錄。也可將發布的一個實驗復制到其他班級,減少教師需要同步發布多個實驗的操作。對于新添加的班級,系統支持批量導入學生名單,只需將學生名單的xls文件上傳即可完成批量導入。同時系統提供了閱讀模式,可以按照實驗閱讀,也可以按照學號閱讀,反映班級和學生的學習情況。
本系統采用云端部署的方式,縮短了部署、配置、調試的時間,不需要運維人員以及硬件服務器,減少了成本,滿足了同時服務更多學生的需求,以達到預期的教學效果。下面介紹一些關鍵的技術和算法:
(1)前端WEB界面。WEB界面使用Thymeleaf模板引擎渲染。CSS庫選擇了支持響應式的BootStrap,JS庫選擇了jQuery,能夠加快前端開發的速度。在線編輯器使用CodeMirror插件,它支持代碼縮進、高亮顯示等功能,并且提供了十分豐富的API供用戶使用。
(2)后臺編譯運行。代碼編譯執行的交互功能使用Ajax技術,可以在不重新加載整個網頁的情況下刷新局部信息。代碼和其他信息提交到網站之后,程序會將代碼部分保存成*.c文件,輸入部分保存為*.txt文件,然后調用系統命令單獨打開一條線程執行編譯命令。編譯成功后創建一個線程池,將需要執行的任務加入到線程池中,同時執行時間控制程序,限制運行時間。運行成功后執行自動評分業務,對輸入輸出結果與測試用例比對得到評估結果,將所有信息返回給網頁。提交實驗時會將所有信息寫入數據庫后返回提示信息。后臺執行編譯時還要注意安全問題。安全方面包括依賴環境構建、沙盒、行身份(包括GID、UID),執行時間限制包括運行時間和CPU時間,文件系統壓力等一系列安全問題。
(3)執行結果自助評估。使用levenshtein distance(又叫編輯距離)算法進行相似度計算,實現執行結果自助評估。編輯距離是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。一般來說,編輯距離越小,兩個字符串的相似度越大。算法基本原理:假設使用d[i,j]個步驟(可以使用一個二維數組保存這個值),表示將串s[ 1…i] 轉換為 串t[ 1…j]所需要的最少步驟個數,那么在最基本的情況下,即在i等于0時,也就是說串s為空,那么對應的d[i,j]就是增加j個字符,使得s轉化為t,在j等于0時,也就是說串t為空,那么對應的d[i,0] 就是減少i個字符,使得s轉化為t。
經過將近一個學期的運行,在線實驗系統取得了較好的教學效果。通過對兩個多月內所得到的數據進行分析,對系統收集到的所有提交的數據進行整理,篩選出其中的有效數據進行分析后發現,提交的數據中能最終運行成功的比率在逐步提高,如圖3所示。

圖3 提交成功率趨勢圖
通過對學生們提交的錯誤進行分析后發現,錯誤類型仍大多集中在語法錯誤上,錯誤類型柱狀如圖4所示。而其中最主要的語法錯誤,在總體上也呈減少趨勢,如圖5所示。
通過對系統中實驗問題的發布時間和收集的每一個學生用戶的提交時間進行整理、分析,得出系統的平均耗時趨向,如圖6所示。一般會在課上布置4個左右實驗題,大多數同學是無法在半節課里全部完成并提交實驗報告的,需要他們課下繼續完成,圖6顯示學生提交報告總的花費時間也在波動中逐漸減少,雖然不是完成實驗的凈時間,但這個趨勢在一定程度上也說明學生完成實驗任務的效率是越來越高的。

圖4 錯誤類型柱狀圖

圖5 語法錯誤數量趨勢圖

圖6 課外實驗平均耗時
本文設計的C語言在線實驗系統主要面向非電專業學生及各類程序設計的初學者,旨在將實驗過程數字化、在線化,形成學生自助互助的網上學習社區。目前在線編譯執行和輔助查錯等模塊已經完成并投入實際使用。通過使用本系統,大大提高了學生的學習效率,減輕教師的教學負擔。在未來的工作中,將繼續優化輔助糾錯功能,增加代碼靜態分析糾錯功能,語法錯誤以外的很多錯誤很難通過動態編譯執行去判斷,需要引入代碼靜態分析技術來實現邏輯錯誤和運行時錯誤的輔助分析。