【正文】
最高的首選工具。 (2) Visual C++ 提供了 MFC類,開發(fā)者只需要做少量的工作就可以得到功能齊全的 Windows 應(yīng)用程序。 ADO 基于 COM,提供編程語言可利用的對 象,它不僅面向 Visual C++,同時還提供面向其他開發(fā)工具的應(yīng)用,如 Visual Basic、 VJ 等,甚至還提供面向諸如 VBScript、 JavaScript 等腳本語言的應(yīng)用。編程考 試是計算機(jī)等相關(guān)專業(yè)的常見考試,其具體要求為對指定的題目設(shè)計算法并使用考試所規(guī)定的編程語言(如: C 語言、 JAVA 語言、 python 語言)編寫程序?qū)崿F(xiàn)其設(shè)計的算法以完成題目的要求。例如在程序中某一處發(fā)生用戶丟失標(biāo)點(diǎn)符號,這個現(xiàn)象對于評卷來說是一個小問題,但是對于程序來說就是一個大的問題(語法錯誤程序無法通過編譯)。其作用與原理在后文中講繼續(xù)詳細(xì)說明。 圖 評卷系統(tǒng)總體框架圖 系統(tǒng)目標(biāo) 本系統(tǒng)為編程考試的機(jī)器評卷。 本系統(tǒng)用 VC開發(fā),連接數(shù)據(jù)庫采用 ADO方式與 Access 進(jìn)行連接。 ADO 數(shù)據(jù)庫開發(fā)的基本流程 , 它的基本步驟如下: 1)初始化 COM 庫,引入 ADO 庫定義文件 2)用 Connection 對象連接數(shù)據(jù)庫 3)利用建立好的連接,通過 Connection、 Command 對象執(zhí)行 SQL 命令,或利用 Recordset 對象取得結(jié)果記錄集進(jìn)行查詢、處理。///創(chuàng)建Connection 對象 if(SUCCEEDED(hr)) { hr = m_pConnectionOpen(Provider=。 并為其創(chuàng)建 Recordset 對 象 的 實(shí) 例 : (), SQL命令的執(zhí)行可以采用多 種 形 式 , 本 文 采 用 了 Recordset 對 象 進(jìn) 行 查 詢 取 得 記 錄 集 。///關(guān)閉連接 本系統(tǒng)在設(shè)計對 Access 進(jìn)行操作時為了方便將上 述操作寫成了一個類。存儲到 MFC 為文件提供的專用 BUFFER 中,注意這個時候文件的存儲是以一個一個字符的形式存儲的。在完成上述查找翻譯詞法檢測之后,在這個部分還有一個特殊的功能。 語法樹結(jié)構(gòu)的定義是本步驟的重點(diǎn)。標(biāo)識符必須以字母或下劃線開頭。39。amp。 語法分析: 本系統(tǒng)中語法分析的功能是由類 Cparser 來完成的。 NodeKind nodekind。 // is this an array declaration int iArraySize。` | `。` 38. continue_stmt`continue` `。 符號表的建立也是由兩個主要類來實(shí)現(xiàn)的。 分?jǐn)?shù)的得出 在評分系統(tǒng)中分?jǐn)?shù)的得出是最為重要的部分,但不是最核心的部分。 // add it to function declaration list ( t )。評語的書寫即完成這個數(shù)據(jù)分析的功能,使整個系統(tǒng)更加合理,體現(xiàn)出人性化設(shè)計。 } if (score90 amp。 } return PY。,39。 CString FieldName。 } for(int n=0。 ()。jm_RecordsetPtrGetFields()GetCount()。 (3) 所有的輸出結(jié)果均按指定的格式存入一 個與試題相應(yīng)的文件中 1 對考生編制的每個源程序的分析過程包括編譯、連接、運(yùn)行和按結(jié)果評分。先檢查有無相應(yīng)的源程序 , 沒有 , 則記 0 分 , 否則進(jìn)行編譯、連接。 { count+ + 。 5. 程序的運(yùn)行與調(diào)試 程序的運(yùn)行 程序運(yùn)行后打開需要評閱的 C語言源程序的主界面如下圖: 圖 程序主界面 用戶選擇好需要評閱的程序后, C語言源程序會顯示在系統(tǒng)的主界面上,關(guān)鍵字高亮。 6. 結(jié)論與展望 本文中所設(shè)計的編程考試機(jī)器評卷系統(tǒng)能夠自動地對 C 語言編程考試的源程序進(jìn)行解析,模擬 VC++ 的設(shè)計風(fēng)格,鈕邊框規(guī)范統(tǒng)一,顏色淡雅、清爽,整體有新穎感。 Christopher Tolkien AINULINDAL? The Music of the Ainur There was Eru, the One, who in Arda is called Il 鷙 atar。 for desire grew hot within him to br ing into Being things of his own, and it seemed to him that Il 鷙 atar took no thought for the Void, and he was impatient of its emptiness. Yet he found not the Fire, for it is w ith I l 鷙 atar. But being alone he had begun to conceive thoughts of his own unlike those of his brethren. Some of these thoughts he now wove into his music, and straightway discord arose about him, and many that sang nigh him grew despondent, and their thought was disturbed and their music faltered。 Then the voices of the Ainur, like unto harps and lutes, and pipes and trumpets, and viols and ans, and like unto countless choirs singing with words, began to fashion the theme of Il 鷙 atar to a great music。在日后的工作學(xué)習(xí)中,將結(jié)合人工智能等相關(guān)算法以改進(jìn)本系統(tǒng)中的評分算法,務(wù)求更加完善。從檢測結(jié)果上看,本系統(tǒng)能夠正確地判斷所有 C 語言單純的語法、詞法、類型匹配等錯誤,并準(zhǔn)確地給出得分功能強(qiáng)大。//3 連接到原 8 號中斷 3 } 界面設(shè)計風(fēng)格說明 為了模擬 VC++ 的風(fēng)格,本程序使用了當(dāng)前比較流行的界面庫 ,并修改了CrystalView 的高亮顯示方式, 仿照著名的 linux下的編輯工具 emacs 進(jìn)行開發(fā)。 //3 關(guān)中斷 3 246。其中主 循環(huán)又嵌有一個子循環(huán) , 它用于對同一個考生的各道題評分。 程序死循環(huán)的中斷處理算法 考試類型與評卷算法的描述 在設(shè)計這個算法時,為便于機(jī)器閱卷 , 本文中對試卷類型的要求做出以下規(guī)定: (1) 源程序中主程序與所有子程序均存入同一文件且只能取規(guī)定的文件名 。 m_RecordsetPtr=(strSQL)。 i++) { CellText=(char*)(_bstr_t)rstGetFields()GetItem((long)i)Value。//添加行 rstMoveNext()。為其添加成員變量 m_list。,39。希望以后努力改進(jìn) 。amp。系統(tǒng)按照解析的順序依次扣分,在解析完成之后即得出考試的最終成績。 CODE: extern CCProgrammeExaminationGradeSystemApp theApp。 考試成績的入庫 考試成績的入庫,主要分為以下三個部分:分?jǐn)?shù)的得出、根據(jù)分?jǐn)?shù)書寫評語、獲取題目對應(yīng)的分?jǐn)?shù)、評語并添加到數(shù)據(jù)庫中。 ? Class BucketListRec: 主要成員變量與作用如下表: 數(shù)據(jù)類型 變量名 含義 CString name 變量名 CString scope 函數(shù)域 enum TokenType type Token 類型 int memloc 變量內(nèi)存地址 BOOL bArray 是否正在檢查 LineListRec* lineno 行號 表達(dá)式 語句 表達(dá)式 for 語句 表達(dá)式 語句 復(fù)合語句 語句 語句 聲明 BucketListRec* next 鏈表中的下一項 表 2 BucketListRec 成員變量含義表 BucketListRec 類是用于語法分析的一個重要輔助類,它記錄每一個變量或函數(shù)名的具體情況。` var `=` expression `)` pound_stmt 36. goto_stmt`goto` ID `。` 14. `printf` `(` `` STRING `` `)` `。 CString szScope。 // point to father node CTreeNode* sibling。( _ a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)。 C 語言關(guān)鍵字如下表: auto double int struct break else long switch case enum register typedef char extern return union Const float short unsigned Continue for signed void Default goto sizeof volatile Do if static while 表 1 C 關(guān)鍵字表 Token 類型的定義分為以下 5 類與 C 語言相對應(yīng)。\n39。下文將針對每一個具體功能模塊進(jìn)行詳細(xì)講述 。語法分析較之詞法分析更為復(fù)雜因?yàn)閮H從局部無法完全準(zhǔn)確的進(jìn)行判斷。例如,在 C 語言源程序中存在 /n 字符,如果在本系統(tǒng)中直接將 /n 不進(jìn)行分析進(jìn)行下述語法樹建立操作時,語法樹的生出讀到 /n 會自動換行,產(chǎn)生錯誤。 首先,系統(tǒng)需要獲取 C 語言源程序的代碼信息。 5) 關(guān)閉記錄集與連接 記錄集或連接都可以用 Close()方法來關(guān)閉: m_pRecordsetClose()。///顯示錯誤信息 } 在這段代碼中我們是通過 Connection 對象的 Open 方法來進(jìn)行連接數(shù)據(jù)庫的 。 HRESULT hr。 表 成績表 字段含義 字段名 數(shù)據(jù)類型 C 語言源程序標(biāo)題 題目 Text 程序得分 分?jǐn)?shù) Int 評語 評語 Text MFC 連接數(shù)據(jù)庫 本系統(tǒng)在進(jìn)行數(shù)據(jù)庫連接時采用的是 ADO 方式進(jìn)行連接。為了方便用戶的使用,在系統(tǒng)主界面中還添加一些類 VC++編輯器的輔助功能,例如關(guān)鍵字高亮、錯誤行數(shù)提示等。評分結(jié)束后根據(jù)分?jǐn)?shù)寫出對應(yīng)的評語,為了方便分?jǐn)?shù)的管理,將對應(yīng)的分?jǐn)?shù)、評語、源程序名存入到數(shù)據(jù)庫中。 首先,程序?qū)τ脩舸蜷_的 C語言編程試卷 .C 文件,進(jìn)行詞法和語法的分析。顯示風(fēng)格模擬 VC++ 的界面設(shè)計。 本文用到的 SQL 語句主要為 select 語句和 insert 語句。 Visual C++支持?jǐn)帱c(diǎn)調(diào)試,同時也可以在調(diào)試窗口觀察有關(guān)變量的值,以方便查找出有關(guān)的邏輯錯誤。它有如下的特點(diǎn): (1) Visual C++ 提供了用于開發(fā) Windows 環(huán)境下的應(yīng)用程序和簡捷、快速的開發(fā)環(huán)境。 為便于機(jī)器閱卷,可在試題類型上做如下要求: (1)源程序中主程序與所有子程序均存入同一文件且只能取規(guī)定的文件名; (2)所有的輸入均由與試題相應(yīng)的某一文件提供; (3)所有的輸出結(jié)果均按指定的格式存入一個與試題相應(yīng)的文件中。 本文主要研究內(nèi)容 對考生編制的每個源程序的分析過程包括編譯、連接、運(yùn)行和結(jié)果評分。 ( 5) 數(shù)據(jù)定義 對程序中用到的所有變量都需要進(jìn)行定義。編譯程序在工作過程中需要建立一些表格,以登記源程序中所提供的或在編譯過程中所產(chǎn)生的一些信息,編譯各個階段的工作都涉及到構(gòu)造、查找、修改或存取有關(guān)表格中的信息,因此,在編譯程序中必須有一組管理各種表格的程序。具體內(nèi)容包括:形式語言、有窮自動機(jī)原理及詞法分析程序的自動構(gòu)造、自上而下和自下而上的語法分析、語法制導(dǎo)翻譯及中間代碼生成,目標(biāo)程序運(yùn)行時的存儲組織策略及代碼生成等等。編譯、連接、運(yùn)行都可能出錯,尤其是運(yùn)行過程可能會產(chǎn)生死循環(huán),因此,目前還沒有采用完整的源程序作為機(jī)器評卷的依據(jù)。因此有必要提出一種基于完整源程序分析且能采用機(jī)器閱卷的考試題型及評卷算法,吸取以前機(jī)器評卷系統(tǒng)的優(yōu)點(diǎn) ,運(yùn)用其部分設(shè)計思路 ,結(jié)合了自己的思想設(shè)計完善編程考試機(jī)器評卷系統(tǒng)。 詞法分析階段的任務(wù)是對構(gòu)成源程序的 字符串 從左到右進(jìn)行掃描和分解,根據(jù)語言的 詞法規(guī)則 ,識別出一個一個具有獨(dú)立意義的 單詞 ( 也稱 單詞符號 , 簡稱符號 )。大、小寫的字母分別認(rèn)為是 兩個不同的字符。注意:外部數(shù)據(jù)定義只能用 extern 或 static,而不能用 auto 或 register。 對被評程序運(yùn)行過程中可能存在的死循環(huán)進(jìn)行識別。 Visual C++ 在不犧牲靈活性、性能和控制力度的同時,給 C++帶來更高水平的生產(chǎn)效率。與使用 C