【正文】
CFMT_CENTER, 150)。 } show(m_RecordsetPtr)。 程序死循環(huán)的中斷處理算法 在設(shè)計(jì)這個(gè)算法時(shí),為便于機(jī)器閱卷, 本文中對(duì)試卷類(lèi)型的要求做出以下規(guī)定:(1) 源程序中主程序與所有子程序均存入同一文件且只能取規(guī)定的文件名。 (2) 所有的輸入均由與試題相應(yīng)的某一文件提供。(3) 所有的輸出結(jié)果均按指定的格式存入一個(gè)與試題相應(yīng)的文件中1 對(duì)考生編制的每個(gè)源程序的分析過(guò)程包括編譯、連接、運(yùn)行和按結(jié)果評(píng)分。由于編譯、連接、運(yùn)行考生的被評(píng)程序都是在評(píng)卷程序的召喚下進(jìn)行的, 因此控制被評(píng)程序相應(yīng)進(jìn)程的運(yùn)行是評(píng)卷算法的主要任務(wù)。為了避免因考生的被評(píng)程序中可能含有死循環(huán)而使評(píng)卷無(wú)法繼續(xù), 算法中采取了修改定時(shí)中斷的方法。當(dāng)被評(píng)程序相應(yīng)進(jìn)程運(yùn)行足夠長(zhǎng)時(shí)間后仍未結(jié)束, 則判定它含有死循環(huán), 可強(qiáng)行終止它, 然后對(duì)該程序記分。 當(dāng)考生的一個(gè)程序被評(píng)分后, 就可以對(duì)該考生的下一個(gè)程序或下一個(gè)考生開(kāi)始評(píng)分,算法的形式描述如下: BEGINHANDL ER I←1 WH IL E I≤考生人數(shù)DO BEGIN 取第I 個(gè)考生試題信息 SCORE←0。 J←1 WH IL E J ≤第I 考生試題數(shù)DO BEGIN MARKON E ( I, J ) J ←J+ 1 END 考生I 成績(jī)SCORE 入庫(kù) I←I+ 1 END 恢復(fù)8 號(hào)中斷向量 END COMM EN T 子過(guò)程MARKON E 的算法 PROCEDUREMARKON E ( I, J ) BEGIN IF 不能找到第I 個(gè)考生第J 題的源程序P IJ THEN S IJ←0 EL SE IF P IJ 編譯有錯(cuò)THEN S IJ←0 EL SE IF P IJ 連接有錯(cuò)THEN S IJ ←0HANDL ER //使8 號(hào)中斷向量指向中斷服務(wù)程序 I←1 T←0 運(yùn)行被評(píng)程序P IJ IF 不能找到結(jié)果文件THEN S IJ ←0 EL SE 將結(jié)果與標(biāo)準(zhǔn)答案比對(duì)以確定 S IJ END SCORE←SCORE+ S IJ END COMM EN T 8 號(hào)中斷服務(wù)程序HANDL ER 的算法 BEGIN 關(guān)中斷 IF 被中斷進(jìn)程是被評(píng)程序相應(yīng)進(jìn)程THEN BEGIN T←T+ 1 IF T 超過(guò)限度THEN BEGIN 獲取當(dāng)前被評(píng)程序相應(yīng)進(jìn)程的PSP 段地址修改中斷服務(wù)程序的返回地址 END END 開(kāi)中斷 鏈接到原8 號(hào)中斷服務(wù)程序 END在主算法中, 包括重新設(shè)置8 號(hào)中斷向量、主循環(huán)(用于為每個(gè)考生評(píng)分)、恢復(fù)8 號(hào)中斷向量。其中主循環(huán)又嵌有一個(gè)子循環(huán), 它用于對(duì)同一個(gè)考生的各道題評(píng)分。子過(guò)程MARKON E 的作用是對(duì)指定考生的指定題評(píng)分。先檢查有無(wú)相應(yīng)的源程序, 沒(méi)有, 則記0 分, 否則進(jìn)行編譯、連接。若編譯或連接有錯(cuò), 則該題記0 分, 否則運(yùn)行該被評(píng)程序待該程序運(yùn)行完畢, 檢查有無(wú)指定的輸出文件, 若無(wú), 則記0 分, 否則將該文件內(nèi)容與標(biāo)準(zhǔn)答案比較并記分。 而中斷服務(wù)子程序HANDL ER 用來(lái)檢查考生的被評(píng)程序相應(yīng)進(jìn)程已持續(xù)運(yùn)行的時(shí)間, 若超過(guò)限度, 則立即終止該被評(píng)程序相應(yīng)進(jìn)程, 返回評(píng)卷程序。 及其實(shí)現(xiàn)被評(píng)程序相應(yīng)進(jìn)程可能出現(xiàn)死循環(huán), 按常規(guī)程序設(shè)計(jì)方法, 號(hào)中斷的方法, 規(guī)定一個(gè)時(shí)間上限, 當(dāng)被評(píng)程序相應(yīng)進(jìn)程連續(xù)運(yùn)行時(shí)間超過(guò)這一上限時(shí), 便將該被評(píng)程序相應(yīng)進(jìn)程終止, 使評(píng)卷程序?qū)碱}記分后繼續(xù)對(duì)下一題評(píng)分. 要從時(shí)鐘中斷服務(wù)程序返回后接著結(jié)束被評(píng)程序相應(yīng)進(jìn)程并返回其父進(jìn)程(即運(yùn)行中的評(píng)卷程序) 需解決兩個(gè)問(wèn)題: 一是要知道被評(píng)程序相應(yīng)進(jìn)程在內(nèi)存中的PSP 段地址,二是修改中斷服務(wù)程序返回到被評(píng)程序相應(yīng)進(jìn)程的返回地址, 將它改為PSP: 01 從文獻(xiàn)[ 2 ]中可知,DOS 中斷管理程序在每個(gè)進(jìn)程的PSP: 0 處存放了一條指令, 它引出DOS 的終止服務(wù)程序, 語(yǔ)言編寫(xiě)的, 但修改中斷服務(wù)程序本身的返回地址需要使用匯編語(yǔ)言[ 3 ]。 本文采用了在C 語(yǔ)言中直接嵌入?yún)R編指令的方法[ 4 ]. 以下為修改后的8 號(hào)中斷服務(wù)子程序。代碼實(shí)現(xiàn)如下:CODE void interrup t handler (void) { disable () 。 //3 關(guān)中斷3 246?! f (usp = 1)//3 usp 是一標(biāo)志當(dāng)前進(jìn)程是否為被評(píng)程序相應(yīng)進(jìn)程的全程變量3 246。 { count+ + 。 //3 count 即算法描述中的全程變量T3 246?! f (count= 5460)//3 已達(dá)5分鐘, 中斷1092次約1分鐘3 246?! count= 0?! ?*3 下面修改中斷服務(wù)程序的返回地址, 為強(qiáng)制終止被評(píng)進(jìn)程作準(zhǔn)備3*/asm {push bppush dipush esmov bp, spmov word p tr[bp+ 24 ], 0push axpush bxmov ah, 62hint 21hmov di, bxpop bxpop axmov [bp+ 26 ], dipop espop dipop bp } } } enable () 。 //3 開(kāi)中斷3 oldhandler () 。//3 連接到原8號(hào)中斷3 } 界面設(shè)計(jì)風(fēng)格說(shuō)明為了模擬VC++,并修改了CrystalView的高亮顯示方式,仿照著名的linux下的編輯工具emacs進(jìn)行開(kāi)發(fā)。界面友好,美觀(guān)。 5. 程序的運(yùn)行與調(diào)試程序運(yùn)行后打開(kāi)需要評(píng)閱的C語(yǔ)言源程序的主界面如下圖: 用戶(hù)選擇好需要評(píng)閱的程序后,C語(yǔ)言源程序會(huì)顯示在系統(tǒng)的主界面上,關(guān)鍵字高亮。點(diǎn)擊評(píng)分按鈕后在輸出欄中可以看到C語(yǔ)言源程序的錯(cuò)誤被檢測(cè)出來(lái),系統(tǒng)會(huì)自動(dòng)打分,一切完成之后系統(tǒng)給出提示。 由于本系統(tǒng)的核心為對(duì)C語(yǔ)言源程序進(jìn)行解析,得到其錯(cuò)誤數(shù)目與錯(cuò)誤類(lèi)型。判斷錯(cuò)誤是否對(duì)整個(gè)程序原理造成重大影響由此給出評(píng)分。因此,程序調(diào)試的主要任務(wù)為,調(diào)試C語(yǔ)言程序中的錯(cuò)誤是否能夠正確地被檢測(cè)出來(lái)。l 函數(shù)輸入類(lèi)型不匹配:l GOTO函數(shù)標(biāo)簽錯(cuò)誤: GOTO函數(shù)標(biāo)簽錯(cuò)誤檢測(cè)l 標(biāo)點(diǎn)符號(hào)錯(cuò)誤:由于篇幅的原因,在這里就不再對(duì)C語(yǔ)言源程序中所有錯(cuò)誤的檢測(cè)進(jìn)行一一地列舉了。從檢測(cè)結(jié)果上看,本系統(tǒng)能夠正確地判斷所有C語(yǔ)言單純的語(yǔ)法、詞法、類(lèi)型匹配等錯(cuò)誤,并準(zhǔn)確地給出得分功能強(qiáng)大。但是由于系統(tǒng)始終是根據(jù)算法來(lái)檢測(cè)錯(cuò)誤,不可能對(duì)所有的錯(cuò)誤類(lèi)型錯(cuò)誤原因做到完全精準(zhǔn)的判斷(VC++編譯器也是如此),這是本系統(tǒng)以后需要解決的重要問(wèn)題也是所有機(jī)器評(píng)卷系統(tǒng)都存在的問(wèn)題。6. 結(jié)論與展望本文中所設(shè)計(jì)的編程考試機(jī)器評(píng)卷系統(tǒng)能夠自動(dòng)地對(duì)C語(yǔ)言編程考試的源程序進(jìn)行解析,模擬VC++,鈕邊框規(guī)范統(tǒng)一,顏色淡雅、清爽,整體有新穎感。在大部分情況下能夠檢測(cè)出編程考試中源程序的錯(cuò)誤并根據(jù)錯(cuò)誤酌情進(jìn)行扣分,體現(xiàn)了人性化地設(shè)計(jì)思想。通過(guò)大量測(cè)試完成了課題需要實(shí)現(xiàn)的所有功能。但如同所有的智能化系統(tǒng)一樣,機(jī)器的智能化永遠(yuǎn)不能完全代替人的作用。智能系統(tǒng)自動(dòng)系統(tǒng)的運(yùn)行往往是遵循一定算法的,這樣就不可能做到由人操作時(shí)的精準(zhǔn),與人性化。如何使本系統(tǒng)更加人性化更加智能化,判別出更多的復(fù)雜類(lèi)型的錯(cuò)誤,是本系統(tǒng)需要改進(jìn)的地方。在日后的工作學(xué)習(xí)中,將結(jié)合人工智能等相關(guān)算法以改進(jìn)本系統(tǒng)中的評(píng)分算法,務(wù)求更加完善。參考文獻(xiàn)[1] [M].北京:電子工業(yè)出版社, 2005: 120133.[2] [M].北京:清華大學(xué)出版社, 2002: 1518.[3] [M].北京:人民郵電出版社, 2000: 8996.[4] [M].北京:電子工業(yè)出版社, 2006: 100108.[5] [M].北京:人民郵電出版社, 2004: 6670.[6] [M].北京:電子工業(yè)出版社, 2003: 2146.[7] [M].北京:中國(guó)青年出版社, 2003: 3050.[8] [M].天津:機(jī)械工業(yè)出版社, 2006: 6688.[9] Deborah. Email Principle and Analysis[M]. USA: University of California Press, 2002: 3356.[10] Patrick. Malicious Email and Antispam Technology and Research[M]. USA: University of Chicago Press, 2003: 6589.致 謝本文是在導(dǎo)師的幫助下完成的,在進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)同學(xué)和朋友也給予了我很大的幫助,特別是在我剛開(kāi)始接觸編程的時(shí)候遇到了很多的問(wèn)題,在同學(xué)和朋友的幫助下問(wèn)題一一得到解決,再此特別感謝他們的幫助。