邱曉紅,楊瑞安,敖紫迎,陳佳麗
(江西理工大學(xué) 軟件工程學(xué)院,南昌 330013)
新冠疫情影響下,各大高校學(xué)生課堂學(xué)習(xí)采用了“停課不停學(xué)”“停課不停教”的遠(yuǎn)程網(wǎng)絡(luò)教學(xué)模式.但與此同時(shí),遠(yuǎn)程網(wǎng)絡(luò)教學(xué)也會(huì)帶來(lái)弊端,它不僅削弱了師生間學(xué)習(xí)交流的“互動(dòng)性”,造成“教”“學(xué)”分離的現(xiàn)象,無(wú)形中增加了學(xué)生學(xué)習(xí)的難度.特別是在編程類學(xué)科的學(xué)習(xí)過(guò)程中,學(xué)生課堂學(xué)習(xí)時(shí)間短、知識(shí)點(diǎn)不易吸收,課后老師能解答的問(wèn)題也有限,課余自主編程學(xué)習(xí)效率又低,碰到難題無(wú)法及時(shí)解決.傳統(tǒng)的代碼缺陷都是人工審查來(lái)完成,因此存在過(guò)度依賴個(gè)人經(jīng)驗(yàn)和低效等問(wèn)題.自動(dòng)化代碼檢測(cè)編程實(shí)踐系統(tǒng)就成為非計(jì)算專業(yè)學(xué)生以及初學(xué)者學(xué)習(xí)編程輔助軟件,既可以提高學(xué)生的編程效率,還可以讓學(xué)生可以自己解決編程問(wèn)題.從國(guó)內(nèi)外研究成果來(lái)看,目前編程實(shí)踐系統(tǒng)有很多種.文獻(xiàn)[1]學(xué)者研究互動(dòng)測(cè)試系統(tǒng),以提高學(xué)生在計(jì)算機(jī)程式設(shè)計(jì)課程的學(xué)習(xí)效果,解決學(xué)生在課后學(xué)習(xí)中缺乏編程和缺陷實(shí)踐的問(wèn)題.文獻(xiàn)[2]提出了一種基于網(wǎng)絡(luò)的學(xué)習(xí)活動(dòng)與Scratch 工具集成的方案來(lái)幫助學(xué)習(xí)者提高編程能力,學(xué)生通過(guò)循序漸進(jìn)學(xué)習(xí)知識(shí)內(nèi)容從而反向輔助自己學(xué)習(xí)程序編程.文獻(xiàn)[3]設(shè)計(jì)一款編程測(cè)試練習(xí)平臺(tái),平臺(tái)中有很多案例程序,可以很好幫助初學(xué)者和上班族閑暇時(shí)間學(xué)習(xí).文獻(xiàn)[4]設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)靈活的、自適應(yīng)的在線高性能計(jì)算學(xué)習(xí)平臺(tái)EasyHPC,平臺(tái)不僅涵蓋學(xué)習(xí)內(nèi)容和經(jīng)典案例,同時(shí)嵌入檢測(cè)工具,加強(qiáng)代碼檢測(cè)技術(shù),在線編程學(xué)習(xí)和解決缺陷問(wèn)題.所以研發(fā)一款輔助學(xué)習(xí)C 語(yǔ)言編程實(shí)踐的系統(tǒng),加強(qiáng)代碼檢測(cè)技術(shù)是當(dāng)前網(wǎng)絡(luò)教學(xué)背景下代替老師的首要任務(wù).根據(jù)文獻(xiàn)[5]和文獻(xiàn)[6]中幾種檢測(cè)工具的比較分析,以及Dev、Visual C++[7]等編譯器的檢測(cè)效果比較,雖然它們可以檢測(cè)識(shí)別大部分錯(cuò)誤,但對(duì)于初學(xué)者常犯的那些代碼缺陷,例如字符混淆、變量名寫(xiě)錯(cuò)、空語(yǔ)句問(wèn)題、運(yùn)算符優(yōu)先級(jí)問(wèn)題、ifelse 不配對(duì)問(wèn)題、Case 語(yǔ)句后不以break 結(jié)尾、數(shù)組越界等,這些錯(cuò)誤編譯器和檢測(cè)工具無(wú)法正確檢測(cè).其中,Dev 對(duì)語(yǔ)法、詞法缺陷上識(shí)別率不高,Visual C++對(duì)語(yǔ)法、語(yǔ)義缺陷上檢測(cè)正存在不足,而且沒(méi)有明確的解釋與修改意見(jiàn),老師在遠(yuǎn)程教學(xué)中也難以面對(duì)多個(gè)學(xué)生且復(fù)雜多樣的問(wèn)題,這就會(huì)導(dǎo)致學(xué)生無(wú)法編程學(xué)習(xí)和解決問(wèn)題.
因此,為了幫助學(xué)生更好的學(xué)習(xí)編程,輔助老師開(kāi)展教學(xué)活動(dòng),研究“輔助編程實(shí)踐系統(tǒng)”來(lái)輔助學(xué)生學(xué)習(xí)編程,解決編程中的常見(jiàn)問(wèn)題.首先,需要對(duì)學(xué)生在編程中容易出現(xiàn)錯(cuò)誤分類,分析代碼詞法、語(yǔ)法和語(yǔ)義缺陷,歸納出不易被編譯器檢測(cè)的缺陷以及代碼知識(shí)規(guī)則;其次,設(shè)計(jì)輔助編程實(shí)踐系統(tǒng),構(gòu)建代碼缺陷分析器,該分析器集成CppCheck[8]、PC-Lint[9]以及GCC 編譯環(huán)境作為智能分析器的靜態(tài)檢測(cè)組成工具,對(duì)學(xué)生編程中常犯代碼缺陷分析,分析這些代碼缺陷的特征抽象模式,利用正則表達(dá)式進(jìn)行抽象表示,并擴(kuò)展到代碼知識(shí)規(guī)則庫(kù)中;然后對(duì)代碼進(jìn)行檢測(cè)處理,與知識(shí)規(guī)則庫(kù)中所有缺陷模式匹配,并給出檢查分析報(bào)告;最后,系統(tǒng)會(huì)根據(jù)檢測(cè)分析報(bào)告給出相應(yīng)的錯(cuò)誤原因和修改意見(jiàn),在遠(yuǎn)程教學(xué)紅很方便的代替老師,達(dá)到一個(gè)電子智慧教師的身份,輔助學(xué)生編程實(shí)踐.同時(shí)還會(huì)提供符合的教學(xué)視頻和練習(xí)習(xí)題幫助學(xué)生鞏固缺少的知識(shí)點(diǎn).
代碼缺陷的本質(zhì)就是程序中有不符合語(yǔ)言標(biāo)準(zhǔn)、違背良好的設(shè)計(jì)規(guī)范和編碼規(guī)范.代碼看似沒(méi)有問(wèn)題,但是運(yùn)行起來(lái)違背開(kāi)發(fā)者的意愿,并有可能導(dǎo)致程序崩潰的陷阱.這里探討的陷阱分為詞法、語(yǔ)法和語(yǔ)義缺陷.
初學(xué)者剛剛接觸編程,對(duì)編程的規(guī)范性還不是很熟悉.有時(shí)候在編程中因?yàn)橹饔^意識(shí)和敲擊鍵盤(pán)的不注意,容易導(dǎo)致代碼名詞寫(xiě)錯(cuò),一般會(huì)有如下錯(cuò)誤情況:漏寫(xiě)字符;字符重復(fù);字符順序顛倒;相似字符混淆.C 語(yǔ)言詞法中常見(jiàn)陷阱如下:=和==混淆;&&、||與&、|混淆;字符和字符串格式混淆;變量名寫(xiě)錯(cuò)導(dǎo)致未定義.
各種字符、關(guān)鍵詞組合不同就產(chǎn)生不同的含義,編譯器對(duì)這些組合語(yǔ)句有都特定的定義和識(shí)別方法.初學(xué)者在編程過(guò)程中,盡管代碼符合語(yǔ)法格式,但結(jié)合上下文,就有可能存在語(yǔ)法缺陷.C 語(yǔ)言語(yǔ)法中常見(jiàn)陷阱如下:if、for、while 語(yǔ)句后接分號(hào)導(dǎo)致空語(yǔ)句;case語(yǔ)句后不以break 結(jié)尾;運(yùn)算符優(yōu)先級(jí)問(wèn)題;“懸掛”else 引發(fā)的配對(duì)問(wèn)題;輸入函數(shù)scanf()漏寫(xiě)取地址符.
在詞法和語(yǔ)法都編寫(xiě)正確的情況下,詞義陷阱也是初學(xué)者常犯的錯(cuò)誤.詞義陷阱主要是指運(yùn)行過(guò)程中出現(xiàn)的邏輯問(wèn)題,這將導(dǎo)致運(yùn)行結(jié)果的不正確性,而這些問(wèn)題大多也難以被編譯器檢測(cè)出來(lái).C 語(yǔ)言語(yǔ)義中常見(jiàn)陷阱如下:未初始化變量或沒(méi)有分配合法的值;可能存在空指針;深拷貝與淺拷貝;存在數(shù)組越界;兩個(gè)整數(shù)求商等于0.
系統(tǒng)集成代碼缺陷分析器中,存儲(chǔ)了C 語(yǔ)言知識(shí)規(guī)則和常見(jiàn)缺陷特征信息,可以智能分析檢測(cè)代碼并幫助學(xué)生編程實(shí)踐.本節(jié)重點(diǎn)論述缺陷分析器、代碼缺陷檢測(cè)以及偏差糾正學(xué)生模型的設(shè)計(jì).
輔助編程實(shí)踐系統(tǒng)主要由人機(jī)交互接口、知識(shí)規(guī)則庫(kù)、代碼缺陷分析器、教師模型、學(xué)生模型、解釋器等6 部分構(gòu)成,如圖1所示.
圖1 輔助編程實(shí)踐系統(tǒng)組成結(jié)構(gòu)
(1)人機(jī)交互接口:人機(jī)交互接口是系統(tǒng)與學(xué)生數(shù)據(jù)交互的模塊,同時(shí)包括自然語(yǔ)言處理技術(shù)的應(yīng)用、人機(jī)對(duì)話的處理、對(duì)領(lǐng)域知識(shí)庫(kù)擴(kuò)展和維護(hù)的接口.
(2)知識(shí)規(guī)則庫(kù):存儲(chǔ)開(kāi)源檢測(cè)工具的內(nèi)置缺陷規(guī)則集,以及擴(kuò)充第1 節(jié)分類中常見(jiàn)的缺陷模式,作為檢測(cè)分析學(xué)生編寫(xiě)程序的重要知識(shí)源.
(3)代碼缺陷分析器:該系統(tǒng)的分析器由開(kāi)源檢測(cè)工具集成GCC 編譯器構(gòu)成.分別可以對(duì)程序進(jìn)行語(yǔ)法、語(yǔ)義、非語(yǔ)法上的錯(cuò)誤進(jìn)行檢測(cè)[10].
(4)教師模型:其主要任務(wù)將教學(xué)視頻和相關(guān)練習(xí)題并通過(guò)接口以適當(dāng)?shù)谋磉_(dá)形式提供給學(xué)生.
(5)學(xué)生模型:對(duì)學(xué)生學(xué)習(xí)和編程實(shí)踐過(guò)程中進(jìn)行全面分析,最終判斷學(xué)生是否達(dá)到專家標(biāo)準(zhǔn)的缺陷糾正能力,從而做出下一步教學(xué)策略[11].
(6)解釋器:分析器檢測(cè)出的缺陷報(bào)告在匹配知識(shí)庫(kù)中的規(guī)則之后,會(huì)由解釋器做出詳細(xì)解釋報(bào)告和修改意見(jiàn),并定位缺陷位置,反饋給學(xué)生.
代碼缺陷分析器同時(shí)利用靜態(tài)檢測(cè)工具和本地動(dòng)態(tài)檢測(cè),并擴(kuò)展一些學(xué)生編程中常犯的缺陷,強(qiáng)化靜態(tài)分析技術(shù).
2.2.1 組成結(jié)構(gòu)
代碼缺陷分析器由規(guī)則集加載器、靜態(tài)檢測(cè)工具、缺陷規(guī)則集合、本地動(dòng)態(tài)檢測(cè)、檢測(cè)結(jié)果解釋器等5 部分構(gòu)成,如圖2所示.
圖2 智能分析器體系結(jié)構(gòu)
(1)規(guī)則集加載器:負(fù)責(zé)把知識(shí)規(guī)則庫(kù)中存儲(chǔ)的一些缺陷規(guī)則和特征信息加載到內(nèi)存中,便于在檢測(cè)時(shí)候匹配錯(cuò)誤缺陷.
(2)靜態(tài)檢測(cè)工具:集成CppCheck、PC-Lint和GCC 編譯環(huán)境[12].PC-Lint是邏輯語(yǔ)義分析的檢測(cè)工具;CppCheck是針對(duì)代碼非語(yǔ)法錯(cuò)誤的檢測(cè)工具;GCC是C 語(yǔ)言編譯器底層編譯程序工具.
(3)缺陷規(guī)則集合:集合中有CppCheck 中的內(nèi)置檢測(cè)類和缺陷模式、PC-Lint 代碼錯(cuò)誤警告列表和GCC 編譯器中的一些語(yǔ)法規(guī)則,還有自定義的擴(kuò)充檢測(cè)類型和缺陷模式[13].
(4)本地動(dòng)態(tài)檢測(cè):根據(jù)擴(kuò)充的缺陷規(guī)則去實(shí)時(shí)檢測(cè)代碼,并用正則表達(dá)式去匹配缺陷,同時(shí)反饋錯(cuò)誤提示報(bào)告給用戶.
(5)檢測(cè)結(jié)果解釋器:匹配知識(shí)庫(kù)中的對(duì)應(yīng)規(guī)則后并給出錯(cuò)誤原因.
2.2.2 知識(shí)規(guī)則庫(kù)
CppCheck:主要存儲(chǔ)CppCheck 檢查后相關(guān)問(wèn)題的描述,分類及建議解決方法.如表1所示.
表1 CppCheck 檢查知識(shí)規(guī)則
GCC 錯(cuò)誤代碼中文對(duì)照:主要存儲(chǔ)相關(guān)編譯錯(cuò)誤代碼其中文解釋.
GCC 錯(cuò)誤代碼解決方案:主要存儲(chǔ)相關(guān)編譯錯(cuò)誤代碼,相似案例代碼,以及建議解決方法.
運(yùn)行時(shí)問(wèn)題:主要存儲(chǔ)運(yùn)行時(shí)問(wèn)題描述、對(duì)應(yīng)操作及它們之間的邏輯關(guān)系.
2.2.3 擴(kuò)展常見(jiàn)代碼缺陷
將第1 節(jié)中的編譯器和檢測(cè)工具無(wú)法檢測(cè)的錯(cuò)誤整理出,分析其缺陷模式并提取抽象模式,利用正則表達(dá)式的進(jìn)行特征表示,如表2所示.
表2 新增缺陷規(guī)則
2.3.1 缺陷檢測(cè)處理框架流程
首先通過(guò)命令行讀入待檢測(cè)文件的路徑,然后遍歷所有文件夾下面的c/cpp 文件,每遍歷一個(gè)c/cpp 文件,對(duì)讀取的程序進(jìn)行預(yù)處理,去除注釋語(yǔ)句.靜態(tài)檢測(cè)工具通過(guò)字符流將程序讀入到預(yù)處理后程序的首部,對(duì)處理后的程序進(jìn)行詞法分析,建立Token 雙鏈表,并對(duì)Token 鏈表進(jìn)行語(yǔ)義分析,通過(guò)循環(huán)調(diào)用檢查類中定義的缺陷模式來(lái)實(shí)現(xiàn)缺陷的檢測(cè),最后通過(guò)定位找出程序中存在缺陷.運(yùn)行流程如圖3所示.
圖3 缺陷檢測(cè)處理框架流程圖
2.3.2 抽象缺陷模式匹配算法
利用缺陷的抽象模式,通過(guò)正則表達(dá)式去匹配字符串,如果匹配成功則返回true,否則匹配不成功,就不存在該缺陷[14,15].缺陷模式匹配算法的偽代碼如算法1.
算法1.缺陷模式匹配算法的偽代碼Procedure Check(code[]/**/,detect[]/**/)/*創(chuàng)建一個(gè)新的鏈表*/Begin:*p=code,*q=defect,Link *s=L While(p是否為空)While(q是否為空)if(p 中的內(nèi)容與q 中的內(nèi)容進(jìn)行正則表達(dá)式匹配是否為true)newNode /*創(chuàng)建一個(gè)新的結(jié)點(diǎn)*/newNode->data=q-data /*將q 中的缺陷模式賦值給s*/s->next=newNode /*尾插法插入新結(jié)點(diǎn)s*/s=newNode /*指針指向新結(jié)點(diǎn)*/End if q=q->next /*q 指針向后移一位*/End while p=p->next/*p 指針向后移一位*/End while End Return L
2.4.1 學(xué)生模型結(jié)構(gòu)
根據(jù)分析,考慮既要全面描述學(xué)生,又便于實(shí)現(xiàn),將覆蓋、偏差、認(rèn)知模型進(jìn)行復(fù)核和簡(jiǎn)化,得到一個(gè)綜合學(xué)生模型結(jié)構(gòu),并集成在系統(tǒng)中.其數(shù)據(jù)結(jié)構(gòu)關(guān)系模型見(jiàn)圖4.
圖4 學(xué)生模型的數(shù)據(jù)結(jié)構(gòu)(關(guān)系模型)
在該模型中,一方面吸收了覆蓋模型的成分,用于計(jì)算和記錄學(xué)生的學(xué)習(xí)進(jìn)度,保證后續(xù)提供的學(xué)習(xí)內(nèi)容和知識(shí)點(diǎn)不會(huì)重復(fù).二是吸收了偏差模型的成分,每次編程學(xué)習(xí)并測(cè)試后都要計(jì)算學(xué)習(xí)偏,即找到本次編程中缺少的知識(shí)點(diǎn)和認(rèn)識(shí)錯(cuò)誤的知識(shí),系統(tǒng)確定需要彌補(bǔ)和加強(qiáng)的知識(shí),并提出需要重新學(xué)習(xí)的內(nèi)容[16].如此反復(fù)編程實(shí)踐直到掌握缺少的知識(shí).三是引入了認(rèn)知模型的成分,每次測(cè)試后都需要分析計(jì)算認(rèn)知能力,調(diào)整重新學(xué)習(xí)內(nèi)容的難度和所有缺少知識(shí)點(diǎn)的側(cè)重點(diǎn).
上述數(shù)據(jù)結(jié)構(gòu)描述了學(xué)生模型的靜態(tài)結(jié)構(gòu),而圖5則描述了學(xué)生模型的動(dòng)態(tài)結(jié)構(gòu).動(dòng)態(tài)結(jié)構(gòu)表現(xiàn)了學(xué)習(xí)中數(shù)據(jù)的動(dòng)態(tài)過(guò)程.可以看出,它跟蹤學(xué)生的學(xué)習(xí)活動(dòng),通過(guò)對(duì)學(xué)生學(xué)習(xí)行為的分析,記錄并調(diào)整學(xué)生的知識(shí)結(jié)構(gòu)、學(xué)習(xí)能力等描述學(xué)生個(gè)性化特征的信息,從此得出教學(xué)策略.其中,決策機(jī)處于中心地位,它的功能是:有關(guān)數(shù)據(jù)庫(kù)的維護(hù)、決策的生成、決策的沖突消除等[17].
圖5 學(xué)生模型的動(dòng)態(tài)結(jié)構(gòu)圖
2.4.2 偏差糾正學(xué)習(xí)
根據(jù)缺陷錯(cuò)誤報(bào)告合理的找出需要學(xué)習(xí)的知識(shí)點(diǎn),并在視頻庫(kù)中選出符合該學(xué)生學(xué)習(xí)的教學(xué)知識(shí)點(diǎn)講解視頻,同時(shí)在習(xí)題庫(kù)中智能匹配出覆蓋全部知識(shí)點(diǎn)的測(cè)試題試卷.偏差糾正學(xué)習(xí)流程如圖6所示.
圖6 偏差糾正學(xué)習(xí)流程
學(xué)生進(jìn)入系統(tǒng)代碼檢測(cè)之后,首先判斷該學(xué)生是否是第一次使用系統(tǒng)進(jìn)行檢測(cè),若是第一次使用就直接推薦代碼中知識(shí)缺陷教學(xué)講解視頻,然后開(kāi)始學(xué)習(xí),配合做習(xí)題進(jìn)行測(cè)試,系統(tǒng)會(huì)在交卷時(shí)給出相應(yīng)知識(shí)點(diǎn)掌握程度和缺陷糾正能力值,若沒(méi)有達(dá)到專家的標(biāo)準(zhǔn),則重新制定教學(xué)策略再次學(xué)習(xí).如果達(dá)到了專家標(biāo)準(zhǔn)可以選擇繼續(xù)練習(xí)編程,發(fā)現(xiàn)新的知識(shí)缺陷.如果不是第一次使用系統(tǒng),則系統(tǒng)會(huì)根據(jù)之前的學(xué)習(xí)認(rèn)知測(cè)評(píng)能力和缺陷報(bào)告重新制定教學(xué)策略和教學(xué)內(nèi)容.
2.4.3 偏差糾正認(rèn)知能力計(jì)算
學(xué)生在學(xué)習(xí)完對(duì)應(yīng)的教學(xué)視頻之后,首先會(huì)通過(guò)相應(yīng)的練習(xí)測(cè)驗(yàn)題來(lái)鞏固所學(xué)的知識(shí),然后再進(jìn)行測(cè)試.該知識(shí)點(diǎn)測(cè)試題目一般由單選題、判斷題、填空題、編程題四大部分組成.題庫(kù)中至少要能測(cè)試“識(shí)記”“理解”“應(yīng)用”“分析”“綜合”“評(píng)價(jià)”幾項(xiàng)認(rèn)知能力中的一項(xiàng)能力.具體過(guò)程如下:
(1)學(xué)生在做測(cè)試題時(shí)對(duì)于每一道題都有各項(xiàng)認(rèn)知能力指標(biāo),如果這道題答對(duì)則能力值為1,答錯(cuò)能力值為-1,不答就為0.學(xué)生在做完每一套測(cè)試題后都會(huì)得到一張測(cè)試記錄表,如表3所示.
表3 不同認(rèn)知能力 (Rij)的測(cè)試記錄表
(2)學(xué)生答完測(cè)試題就可以得到每道題的各項(xiàng)能力的正確率矢量:
每一道題的6 項(xiàng)指標(biāo)都如這樣表示就可以構(gòu)成整張?jiān)嚲硭蓄}目認(rèn)知能力的評(píng)價(jià)矩陣:
其中,a11-a16表示第1 道題的6 項(xiàng)認(rèn)知能力評(píng)價(jià)值,a21-a26表示第2 道題的6 項(xiàng)能力評(píng)價(jià)值,以此類推.
(3)定義每道題的相對(duì)權(quán)值為W=(W1,W2,···,Wn).
(4)每道題的權(quán)值由專家或者出題者給出:
權(quán)重w1,w2,···,wn,其中,wi為第i道題的權(quán)重,wi∈[0,1],0≤i≤n.
(5)計(jì)算測(cè)試后的最終認(rèn)知能力評(píng)價(jià)結(jié)果矢量:
(6)最后計(jì)算出該學(xué)生對(duì)于該部分的知識(shí)點(diǎn)和知識(shí)缺陷糾正綜合能力值:
其中,Q為各項(xiàng)指標(biāo)能力的綜合權(quán)值,這也由專家給出.將計(jì)算出學(xué)生的認(rèn)知模型和試卷專家給出的難易程度以及知識(shí)點(diǎn)覆蓋率做出綜合判斷,最后決定該學(xué)生是否已經(jīng)掌握該部分知識(shí)點(diǎn)和知識(shí)缺陷糾正能力.
下面程序的主要功能是判斷從控制臺(tái)輸入flag 來(lái)分別執(zhí)行不同的功能,功能有求兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)、計(jì)算一個(gè)數(shù)是否為質(zhì)量、求解兩個(gè)數(shù)的商,對(duì)一個(gè)數(shù)組進(jìn)行冒泡排序.
#include<stdlib.h>#include<st dio.h>#include<string.h>#include<sys/types.h>#include<dirent.h>//求最大公約和最小公倍int dump(double m,double n){int k=0,t,a,b;a=m;b=n;if(m<n);{t=m;m=n;n=t;}while(k!=0)k=m%n;m=n;n=k;printf("最大公約數(shù):%d ",m);printf("最小公倍數(shù):%d ",a*b/m);return 0;}//求質(zhì)數(shù)intzhishu(double k){for(inti=2;i<k;i++);{
int s=i%2;if(s=0){printf("%s","不是質(zhì)數(shù)");break;}}return 0;}//求兩個(gè)數(shù)的商intalg(double m,double n){if(m>0&n<0){printf("%d",m/n);}else{printf("請(qǐng)輸入兩個(gè)正整數(shù):");}}//冒泡排序Intinit_change(){int array[8]={49,38,65,97,76,13,27,49};inti,j,al;int key;for (i=0;i<8;i++){key=0;a1=array[9];for (j=0;j+1<8-i;j++){if (array[j]>array[j+1]){key=1;swap(&array[j],&array[j+1]);}}if (key==0)break;}return 0;}int main(){floatm,n;scanf("%f",m);scanf("%f",n);int flag;scanf("%d",&flag);if(flag&&m&&n!=0){switch(flag){case 1:init_dump(m,n);case 2:init_zhishu(m);case 3:init_alg(m,n);case 4:init_change();default:printf("%s","結(jié)束");}}return 0;}
使用Dev 去編譯程序代碼,編譯結(jié)果顯示是沒(méi)有任何警告和錯(cuò)誤,說(shuō)明編譯器Dev 無(wú)法檢測(cè)出學(xué)生編程中非語(yǔ)法錯(cuò)誤.使用Visual C++編譯器去編譯程序代碼,編輯結(jié)果顯示出一些警告信息,其中包含了部分代碼中存在的錯(cuò)誤和語(yǔ)法規(guī)則問(wèn)題,但是同時(shí)也檢測(cè)出一些不應(yīng)該存在的錯(cuò)誤,并且只說(shuō)明了錯(cuò)誤原因,沒(méi)有解釋說(shuō)明如何修改錯(cuò)誤.所以Visual C++在檢測(cè)正確識(shí)別率和覆蓋率性能上都不是很樂(lè)觀.Dev與Visual編譯結(jié)果如圖7所示.
圖7 Dev與Visual 編譯結(jié)果效果圖
而使用智能分析器能檢測(cè)出很多語(yǔ)法和邏輯上的錯(cuò)誤,第1 節(jié)總結(jié)的缺陷都是初學(xué)者容易犯的錯(cuò)誤,編譯器根本無(wú)法全部檢測(cè)這些缺陷,這款輔助工具就可以幫助初學(xué)者檢測(cè)出問(wèn)題,說(shuō)明在檢測(cè)覆蓋率和識(shí)別正確率得到了很大的提升.代碼檢測(cè)報(bào)告如圖8所示.
圖8 檢測(cè)結(jié)果報(bào)告
分別對(duì)Dev、Visual C++、本文中的智能分析器檢測(cè)新增缺陷的性能做出比較,性能比較結(jié)果如表4所示.
表4 性能對(duì)比分析表
對(duì)于上一步檢測(cè)結(jié)果報(bào)告每一個(gè)知識(shí)點(diǎn)錯(cuò)誤都有對(duì)應(yīng)的習(xí)題測(cè)試和教學(xué)視頻鏈接,學(xué)生點(diǎn)擊鏈接之后,可以通過(guò)學(xué)習(xí)教學(xué)視頻和習(xí)題測(cè)試鞏固學(xué)習(xí)缺失的知識(shí)點(diǎn).效果圖如圖9和圖10所示.
圖9 視頻學(xué)習(xí)截圖
圖10 習(xí)題測(cè)試截圖
視頻學(xué)習(xí)過(guò)程中同時(shí)可以返回繼續(xù)編程并修改自己的錯(cuò)誤,系統(tǒng)會(huì)重新檢查代碼,匹配重新編程之后的錯(cuò)誤教學(xué)視頻.視頻學(xué)習(xí)之后學(xué)生可以開(kāi)始習(xí)題測(cè)試,測(cè)試結(jié)束之后會(huì)由系統(tǒng)計(jì)算出缺陷糾正認(rèn)知能力值從而判斷學(xué)生對(duì)這些知識(shí)點(diǎn)是否已經(jīng)掌握,如果沒(méi)有達(dá)到專家的標(biāo)準(zhǔn),系統(tǒng)就會(huì)重新匹配符合學(xué)生能力的測(cè)試題繼續(xù)學(xué)習(xí),如果達(dá)到了專家標(biāo)準(zhǔn)學(xué)生就可以繼續(xù)編程發(fā)現(xiàn)其他的知識(shí)點(diǎn)缺陷.
目前,該系統(tǒng)在測(cè)試中獲得了學(xué)生的一致好評(píng),檢測(cè)能力強(qiáng),智能分析錯(cuò)誤并給出修改意見(jiàn),大部分學(xué)生自主編程實(shí)踐能力得到提升.但是代碼缺陷分析器主要還是針對(duì)編程初學(xué)者的易犯錯(cuò)誤給出了智能提示和相應(yīng)修改建議,相比其他的編譯器在覆蓋率和識(shí)別率都有顯著提高,但對(duì)于有幾年編程經(jīng)驗(yàn)的程序員可能就不太適用.這時(shí)就需要重新擴(kuò)展知識(shí)庫(kù)并豐富數(shù)據(jù)庫(kù)的推理規(guī)則,做到和現(xiàn)在很多高級(jí)語(yǔ)言的編譯器一樣能夠提示很多邏輯語(yǔ)義上的錯(cuò)誤.因此,該系統(tǒng)還存在一些不足之處,需要更好的擴(kuò)展知識(shí)庫(kù)和強(qiáng)化推理機(jī)制,讓更多的初學(xué)者體會(huì)到智能編程實(shí)踐的優(yōu)點(diǎn).