【正文】
顯示給用戶(hù))。 SQL 語(yǔ)句簡(jiǎn)介 SQL 是一種面向數(shù)據(jù)庫(kù)的通用數(shù)據(jù)處理語(yǔ)言規(guī)范,能完成以下幾類(lèi)功能:提取查詢(xún)數(shù)據(jù),插入修改刪除數(shù)據(jù),生成修改和刪除數(shù)據(jù)庫(kù)對(duì)象,數(shù)據(jù)庫(kù)安全控制,數(shù)據(jù)庫(kù)完整性及數(shù)據(jù)保護(hù)控制。 ADO 的底層是 OLE DB,不僅能訪(fǎng)問(wèn)關(guān)系數(shù)據(jù)庫(kù) ,也能訪(fǎng)問(wèn)非關(guān)系型數(shù)據(jù)庫(kù)。在輸出窗口中雙擊錯(cuò)誤提示時(shí),光標(biāo)會(huì)自動(dòng)指向出現(xiàn)錯(cuò)誤的代碼所在行應(yīng)方便快速找出錯(cuò)誤。與使用 C 和 Windows SDK 開(kāi)發(fā) Windows 應(yīng)用程序相比,使用 Visual C++ 建立一個(gè)完美的 Windows 應(yīng)用程序所花費(fèi)的時(shí)間要少得多。 Visual C++ 是 Microsoft Visual 的一個(gè)子集,他對(duì)低版本開(kāi)發(fā)程序兼容。 Visual C++ 在不犧牲靈活性、性能和控制力度的同時(shí),給 C++帶來(lái)更高水平的生產(chǎn)效率。當(dāng)考生的一個(gè)程序被評(píng)分后,就可以對(duì)考生的下一個(gè)程序或下一個(gè)考生開(kāi)始評(píng)分。 對(duì)被評(píng)程序運(yùn)行過(guò)程中可能存在的死循環(huán)進(jìn)行識(shí)別。 ( 7) 變量的初始化 可以在定義時(shí)對(duì)變量或數(shù)組指定初始值;靜態(tài)變量或外部變量如未初始化,系統(tǒng)自動(dòng)使其初值為零 (對(duì)數(shù)值型變量 )或空 (對(duì)字符型數(shù)據(jù) );對(duì)自動(dòng)變量或寄存器變量 ,若未初始化,則其初值為一不可預(yù)測(cè)的數(shù)據(jù);只有靜態(tài)或外部數(shù)組才能初始化。注意:外部數(shù)據(jù)定義只能用 extern 或 static,而不能用 auto 或 register。 ( 4) 表達(dá)式 算術(shù)表達(dá)式 (整型表達(dá)式、實(shí)型表達(dá)式 );邏輯表達(dá)式 (用邏輯運(yùn)算符連接的整型量,結(jié)果為一個(gè)整數(shù) 0 或 1,邏輯表達(dá)式可以認(rèn)為是整型表達(dá)式的一種特 殊形式 );字位表達(dá)式;強(qiáng)制類(lèi)型轉(zhuǎn)換表達(dá)式 (用 類(lèi)型 運(yùn)算符使表達(dá)式的類(lèi)型進(jìn)行強(qiáng)制轉(zhuǎn)換 );逗號(hào)表達(dá)式;賦值表達(dá)式 (將賦值號(hào) =右側(cè)表達(dá)式的值賦給賦值號(hào)左邊的變量 );條件表達(dá)式;指針表達(dá)式 (對(duì)指針類(lèi)型的數(shù)據(jù)進(jìn)行運(yùn)算 )。大、小寫(xiě)的字母分別認(rèn)為是 兩個(gè)不同的字符。代碼優(yōu)化的任務(wù)是對(duì)前階段產(chǎn)生的中間代碼進(jìn)行等價(jià)變換或改造,以期獲得更為高效即省時(shí)間和空間的目標(biāo)代碼。 詞法分析階段的任務(wù)是對(duì)構(gòu)成源程序的 字符串 從左到右進(jìn)行掃描和分解,根據(jù)語(yǔ)言的 詞法規(guī)則 ,識(shí)別出一個(gè)一個(gè)具有獨(dú)立意義的 單詞 ( 也稱(chēng) 單詞符號(hào) , 簡(jiǎn)稱(chēng)符號(hào) )。它主要 介紹 編譯程序的基本構(gòu)造、一般設(shè)計(jì)方法和常用實(shí)現(xiàn)技術(shù),講解編譯程序自動(dòng)構(gòu)造的原理和工具。因此有必要提出一種基于完整源程序分析且能采用機(jī)器閱卷的考試題型及評(píng)卷算法,吸取以前機(jī)器評(píng)卷系統(tǒng)的優(yōu)點(diǎn) ,運(yùn)用其部分設(shè)計(jì)思路 ,結(jié)合了自己的思想設(shè)計(jì)完善編程考試機(jī)器評(píng)卷系統(tǒng)。在編程考試中,一方面,由于考生人數(shù)多,必須采用機(jī)器評(píng)卷;另一方面,由于考生之間水平差距較大,針對(duì)同一問(wèn)題編寫(xiě)的程序千姿百態(tài)。編譯、連接、運(yùn)行都可能出錯(cuò),尤其是運(yùn)行過(guò)程可能會(huì)產(chǎn)生死循環(huán),因此,目前還沒(méi)有采用完整的源程序作為機(jī)器評(píng)卷的依據(jù)。加強(qiáng)自身對(duì)計(jì)算機(jī)系統(tǒng)知識(shí)運(yùn)用能力的鍛煉。具體內(nèi)容包括:形式語(yǔ)言、有窮自動(dòng)機(jī)原理及詞法分析程序的自動(dòng)構(gòu)造、自上而下和自下而上的語(yǔ)法分析、語(yǔ)法制導(dǎo)翻譯及中間代碼生成,目標(biāo)程序運(yùn)行時(shí)的存儲(chǔ)組織策略及代碼生成等等。語(yǔ)法分析的任務(wù)是在詞法分析的基礎(chǔ)上 , 根據(jù)語(yǔ)言的 語(yǔ)法規(guī)則 從 單詞符號(hào)串 中識(shí)別出各種 語(yǔ)法單位 ( 如表達(dá)式、說(shuō)明、語(yǔ)句等 ) ,并進(jìn)行 語(yǔ)法檢查 ,即檢查各種語(yǔ)法單位在語(yǔ)法構(gòu)上的正確性。編譯程序在工作過(guò)程中需要建立一些表格,以登記源程序中所提供的或在編譯過(guò)程中所產(chǎn)生的一些信息,編譯各個(gè)階段的工作都涉及到構(gòu)造、查找、修改或存取有關(guān)表格中的信息,因此,在編譯程序中必須有一組管理各種表格的程序。不同的系統(tǒng)對(duì)標(biāo)識(shí)符的字符數(shù)有不同的規(guī)定,一般允許 7個(gè)字符。 ( 5) 數(shù)據(jù)定義 對(duì)程序中用到的所有變量都需要進(jìn)行定義。 ( 6) 函數(shù)定義 形式為:存儲(chǔ)類(lèi)別 數(shù)據(jù)類(lèi)型 函數(shù)名 (形參表列 );形參說(shuō)明;函數(shù)體。 本文主要研究?jī)?nèi)容 對(duì)考生編制的每個(gè)源程序的分析過(guò)程包括編譯、連接、運(yùn)行和結(jié)果評(píng)分。為了避免因考生的被評(píng)程序中可能含有死循環(huán)而使評(píng)卷無(wú)法繼續(xù),算法中采取修改定時(shí)中斷的方法。 為便于機(jī)器閱卷,可在試題類(lèi)型上做如下要求: (1)源程序中主程序與所有子程序均存入同一文件且只能取規(guī)定的文件名; (2)所有的輸入均由與試題相應(yīng)的某一文件提供; (3)所有的輸出結(jié)果均按指定的格式存入一個(gè)與試題相應(yīng)的文件中。除了 IntelliSense Technology(智能感應(yīng)技術(shù))和 Edit and Continue(即編即調(diào))等顯著縮短開(kāi)發(fā)時(shí)間的新特性外, Visual C++ 還為 Web 開(kāi)發(fā)和企業(yè)開(kāi)發(fā)提供更良好的支持。它有如下的特點(diǎn): (1) Visual C++ 提供了用于開(kāi)發(fā) Windows 環(huán)境下的應(yīng)用程序和簡(jiǎn)捷、快速的開(kāi)發(fā)環(huán)境。 (3) Visual C++ 還提供了一個(gè)高度集成的工具集,使得在開(kāi)發(fā)應(yīng)用程序的全過(guò)程中都保證了較高的效率。 Visual C++支持?jǐn)帱c(diǎn)調(diào)試,同時(shí)也可以在調(diào)試窗口觀察有關(guān)變量的值,以方便查找出有關(guān)的邏輯錯(cuò)誤。 ADO 對(duì) OLE DB 的包裝是相當(dāng)成功的,相對(duì)于 OLE DB 中眾多的接口來(lái)說(shuō), ADO 對(duì)象模型簡(jiǎn)明扼要,沒(méi)有一點(diǎn)多余的東西,并且其功能還要比 DAO 強(qiáng)大的多。 本文用到的 SQL 語(yǔ)句主要為 select 語(yǔ)句和 insert 語(yǔ)句。 a) 某種語(yǔ)言的解析:本模塊是系統(tǒng)中最重要的模塊也是最難實(shí)現(xiàn)的模塊是其他模塊的基礎(chǔ)。顯示風(fēng)格模擬 VC++ 的界面設(shè)計(jì)。因此,在本課題中評(píng)卷系統(tǒng)的設(shè)計(jì)遵守兩大原則:盡量體現(xiàn)人性化設(shè)計(jì)對(duì)于小錯(cuò) 誤、小問(wèn)題不給予嚴(yán)重的扣分;模擬 VC++ 的編譯功能,已其檢查的出的錯(cuò)誤為評(píng)分標(biāo)準(zhǔn)。 首先,程序?qū)?duì)用戶(hù)打開(kāi)的 C語(yǔ)言編程試卷 .C 文件,進(jìn)行詞法和語(yǔ)法的分析。在符號(hào)表的基礎(chǔ)上,程序能夠?qū)季磉M(jìn)行類(lèi)型匹配等表復(fù)雜的錯(cuò)誤的檢查。評(píng)分結(jié)束后根據(jù)分?jǐn)?shù)寫(xiě)出對(duì)應(yīng)的評(píng)語(yǔ),為了方便分?jǐn)?shù)的管理,將對(duì)應(yīng)的分?jǐn)?shù)、評(píng)語(yǔ)、源程序名存入到數(shù)據(jù)庫(kù)中。這就需要實(shí)現(xiàn)幾個(gè)核心的算法,例如語(yǔ)法分析、詞法分析、類(lèi)型匹配等等。為了方便用戶(hù)的使用,在系統(tǒng)主界面中還添加一些類(lèi) VC++編輯器的輔助功能,例如關(guān)鍵字高亮、錯(cuò)誤行數(shù)提示等。到此數(shù)據(jù)庫(kù)就建立好了,將改 Access 文件改名 C語(yǔ)言考試評(píng)分成績(jī) .mdb。 表 成績(jī)表 字段含義 字段名 數(shù)據(jù)類(lèi)型 C 語(yǔ)言源程序標(biāo)題 題目 Text 程序得分 分?jǐn)?shù) Int 評(píng)語(yǔ) 評(píng)語(yǔ) Text MFC 連接數(shù)據(jù)庫(kù) 本系統(tǒng)在進(jìn)行數(shù)據(jù)庫(kù)連接時(shí)采用的是 ADO 方式進(jìn)行連接。 接下來(lái)詳細(xì)介紹連接過(guò)程: COM 庫(kù)的初始化 我 們 可以 使 用 AfxOleInit() 來(lái)初 始 化 COM 庫(kù), 這 項(xiàng)工 作通 常 在CWinApp::InitInstance()的重載函數(shù)中完成, 代碼: BOOL CADOTest1App::InitInstance() { AfxOleInit()。 HRESULT hr。///連接數(shù)據(jù)庫(kù) //上面一句中連接字串中的 Provider 是針對(duì) ACCESS2021 環(huán)境的,對(duì)于 ACCESS97, //需要改為: Provider=。///顯示錯(cuò)誤信息 } 在這段代碼中我們是通過(guò) Connection 對(duì)象的 Open 方法來(lái)進(jìn)行連接數(shù)據(jù)庫(kù)的 。 插入操作采用的是 Connection 對(duì)象的 Execute 方法執(zhí)行 SQL 命令 。 5) 關(guān)閉記錄集與連接 記錄集或連接都可以用 Close()方法來(lái)關(guān)閉: m_pRecordsetClose()。是否發(fā)生錯(cuò)誤給出出錯(cuò)的對(duì)象名稱(chēng)與出錯(cuò)的位置程序運(yùn)行通過(guò)結(jié)束 圖 上圖中描述了本系統(tǒng)程序運(yùn)行主算法的數(shù)據(jù)流程。 首先,系統(tǒng)需要獲取 C 語(yǔ)言源程序的代碼信息。 完成第一步之后,系統(tǒng)已經(jīng)得到了一個(gè)關(guān)于 C 語(yǔ)言源程序的字符串存儲(chǔ)結(jié)構(gòu)。例如,在 C 語(yǔ)言源程序中存在 /n 字符,如果在本系統(tǒng)中直接將 /n 不進(jìn)行分析進(jìn)行下述語(yǔ)法樹(shù)建立操作時(shí),語(yǔ)法樹(shù)的生出讀到 /n 會(huì)自動(dòng)換行,產(chǎn)生錯(cuò)誤。具體算法為查找到 token的類(lèi)型返回不同的顏色,在輸出界面中顯示出來(lái)。語(yǔ)法分析較之詞法分析更為復(fù)雜因?yàn)閮H從局部無(wú)法完全準(zhǔn)確的進(jìn)行判斷。首先,將每一個(gè)語(yǔ)法元素看做是一個(gè)基本的樹(shù)對(duì)象。下文將針對(duì)每一個(gè)具體功能模塊進(jìn)行詳細(xì)講述 。不同的系統(tǒng)對(duì)標(biāo)識(shí)符的字符數(shù)有不同的規(guī)定,一般允許 7 個(gè)字符。\n39。\39。 C 語(yǔ)言關(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 類(lèi)型的定義分為以下 5 類(lèi)與 C 語(yǔ)言相對(duì)應(yīng)。 Cscaner 實(shí)現(xiàn)詞法分析的查找與反向查找是通過(guò)函數(shù) CMapCString, LPCSTR, enum TokenType, enum TokenType來(lái)實(shí)現(xiàn)的。( _ 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)。具體實(shí)現(xiàn)如下: 首先定義數(shù)據(jù)結(jié)構(gòu) CTreeNode,結(jié)構(gòu) CtreeNode 是建立語(yǔ)法樹(shù)的基礎(chǔ)。 // point to father node CTreeNode* sibling。 ExpKind exp。 CString szScope。 ? Grammar 分析與函數(shù)返回: 1. programdeclaration_list 2. declaration_listdeclaration_list declaration | declaration 3. declarationvar_declaration | fun_declaration 4. var_declarationtype_specifier ID(, ...)`。` 14. `printf` `(` `` STRING `` `)` `。amp。` var `=` expression `)` pound_stmt 36. goto_stmt`goto` ID `。` | `return` expression `。 ? Class BucketListRec: 主要成員變量與作用如下表: 數(shù)據(jù)類(lèi)型 變量名 含義 CString name 變量名 CString scope 函數(shù)域 enum TokenType type Token 類(lèi)型 int memloc 變量?jī)?nèi)存地址 BOOL bArray 是否正在檢查 LineListRec* lineno 行號(hào) 表達(dá)式 語(yǔ)句 表達(dá)式 for 語(yǔ)句 表達(dá)式 語(yǔ)句 復(fù)合語(yǔ)句 語(yǔ)句 語(yǔ)句 聲明 BucketListRec* next 鏈表中的下一項(xiàng) 表 2 BucketListRec 成員變量含義表 BucketListRec 類(lèi)是用于語(yǔ)法分析的一個(gè)重要輔助類(lèi),它記錄每一個(gè)變量或函數(shù)名的具體情況。它包含一個(gè)主要的成員變量: BucketListRec* hashTable[SIZE] 另外在 CsymbolTable 類(lèi)中還有一個(gè)重要的函數(shù) PrintSynbalTable ( LPCTSTR lpszPathName),參數(shù) lpszPathName 輸入文件名, PrintSynbalTable 實(shí)現(xiàn)通過(guò)一個(gè)遞歸函數(shù)輸出符號(hào)表到文件 lpszPathName。 考試成績(jī)的入庫(kù) 考試成績(jī)的入庫(kù),主要分為以下三個(gè)部分:分?jǐn)?shù)的得出、根據(jù)分?jǐn)?shù)書(shū)寫(xiě)評(píng)語(yǔ)、獲取題目對(duì)應(yīng)的分?jǐn)?shù)、評(píng)語(yǔ)并添加到數(shù)據(jù)庫(kù)中。由本文的第三部分可以看出,解析是一個(gè)復(fù)雜的過(guò)程,可能出現(xiàn)的錯(cuò)誤也是多樣化的。 CODE: extern CCProgrammeExaminationGradeSystemApp theApp。 OutputErrMsg( error in line %d: function 39。系統(tǒng)按照解析的順序依次扣分,在解析完成之后即得出考試的最終成績(jī)。 改函數(shù)輸入評(píng)分成績(jī),即返回對(duì)應(yīng)的評(píng)語(yǔ)。amp。 score=80) { PY = 程序基本上是正確的,請(qǐng)注意 C語(yǔ)言的語(yǔ)法 。希望以后努力改進(jìn) 。 ? 對(duì)應(yīng)數(shù)據(jù)的獲?。? 分?jǐn)?shù)的獲取 ,考試分?jǐn)?shù)由全局變量 保存,在程序結(jié)束部分直接讀取其值。,39。),fileName,strpy)。為其添加成員變量 m_list。 //列數(shù); int nRecordCount=0。//添加行 rstMoveNext()。 n++) { rstMoveFirst()。 i++) { CellText=(char*)(_bstr_t)rstGetFields()GetItem((long)i)Value。 } } ? 在初始化對(duì)話(huà)框時(shí)初始化列表屬性并調(diào)用顯示