




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編程考試機(jī)器評(píng)卷系統(tǒng)1 前言1.1 課題背景及意義目前全國(guó)計(jì)算機(jī)應(yīng)用能力等級(jí)考試及各省的高校計(jì)算機(jī)教學(xué)水平考試都有上機(jī)操作考試,編程考試是其主要內(nèi)容之一。在編程考試中,一方面,由于考生人數(shù)多,必須采用機(jī)器評(píng)卷;另一方面,由于考生之間水平差距較大,針對(duì)同一問(wèn)題編寫的程序千姿百態(tài)。編譯、連接、運(yùn)行都可能出錯(cuò),尤其是運(yùn)行過(guò)程可能會(huì)產(chǎn)生死循環(huán),因此,目前還沒有采用完整的源程序作為機(jī)器評(píng)卷的依據(jù)?,F(xiàn)在已投入使用的采用機(jī)器評(píng)卷的考試題型有填寫問(wèn)題的結(jié)果和填寫少量語(yǔ)句兩種。前一種題型的缺點(diǎn)一是容易舞弊,二是有些問(wèn)題不編程也可得到結(jié)果;后一種題型的缺點(diǎn)是,難以看出考生獨(dú)立解決問(wèn)題的能力。因此有必要提出一種基于
2、完整源程序分析且能采用機(jī)器閱卷的考試題型及評(píng)卷算法,吸取以前機(jī)器評(píng)卷系統(tǒng)的優(yōu)點(diǎn),運(yùn)用其部分設(shè)計(jì)思路,結(jié)合了自己的思想設(shè)計(jì)完善編程考試機(jī)器評(píng)卷系統(tǒng)。加強(qiáng)自身對(duì)計(jì)算機(jī)系統(tǒng)知識(shí)運(yùn)用能力的鍛煉。此編程考試機(jī)器評(píng)卷系統(tǒng)通過(guò)對(duì)考生編制的每個(gè)源程序的分析過(guò)程給出評(píng)分。1.2 課題相關(guān)技術(shù)的研究現(xiàn)狀1.2.1編譯原理簡(jiǎn)介在計(jì)算機(jī)科學(xué)的課程中,編譯原理占有非常重要的位置,它是每個(gè)優(yōu)秀的計(jì)算機(jī)專業(yè)人員必修的一門課程。它主要介紹編譯程序的基本構(gòu)造、一般設(shè)計(jì)方法和常用實(shí)現(xiàn)技術(shù),講解編譯程序自動(dòng)構(gòu)造的原理和工具。具體內(nèi)容包括:形式語(yǔ)言、有窮自動(dòng)機(jī)原理及詞法分析程序的自動(dòng)構(gòu)造、自上而下和自下而上的語(yǔ)法分析、語(yǔ)法制導(dǎo)翻譯及
3、中間代碼生成,目標(biāo)程序運(yùn)行時(shí)的存儲(chǔ)組織策略及代碼生成等等。并結(jié)合教授內(nèi)容,安排學(xué)生在剖析一個(gè)簡(jiǎn)單的編譯程序的基礎(chǔ)上,完成編譯程序的有關(guān)實(shí)驗(yàn)。經(jīng)過(guò)本課程的學(xué)習(xí),要求學(xué)生不但掌握一般高級(jí)語(yǔ)言編譯程序的初步設(shè)計(jì)和實(shí)現(xiàn)的基本技能,并能為不同模式和不同領(lǐng)域的語(yǔ)言的實(shí)現(xiàn)方案尋找解決途徑,另外還能運(yùn)用編譯程序構(gòu)造的原理和技術(shù)完成相關(guān)軟件工具的設(shè)計(jì)和開發(fā)工作。詞法分析階段的任務(wù)是對(duì)構(gòu)成源程序的字符串從左到右進(jìn)行掃描和分解,根據(jù)語(yǔ)言的詞法規(guī)則,識(shí)別出一個(gè)一個(gè)具有獨(dú)立意義的單詞( 也稱單詞符號(hào), 簡(jiǎn)稱符號(hào) )。語(yǔ)法分析的任務(wù)是在詞法分析的基礎(chǔ)上, 根據(jù)語(yǔ)言的語(yǔ)法規(guī)則從單詞符號(hào)串中識(shí)別出各種語(yǔ)法單位( 如表達(dá)式、說(shuō)
4、明、語(yǔ)句等 ) ,并進(jìn)行語(yǔ)法檢查,即檢查各種語(yǔ)法單位在語(yǔ)法構(gòu)上的正確性。語(yǔ)義分析與中間代碼的生成。語(yǔ)義分析的任務(wù)是首先對(duì)每種語(yǔ)法單位進(jìn)行靜態(tài)的語(yǔ)義審查,然后分析其含義,并用另一種語(yǔ)言形式 (比源語(yǔ)言更接近于目標(biāo)語(yǔ)言的一種中間代碼或直接用目標(biāo)語(yǔ)言 ) 來(lái)描述這種語(yǔ)義。代碼優(yōu)化的任務(wù)是對(duì)前階段產(chǎn)生的中間代碼進(jìn)行等價(jià)變換或改造,以期獲得更為高效即省時(shí)間和空間的目標(biāo)代碼。編譯程序在工作過(guò)程中需要建立一些表格,以登記源程序中所提供的或在編譯過(guò)程中所產(chǎn)生的一些信息,編譯各個(gè)階段的工作都涉及到構(gòu)造、查找、修改或存取有關(guān)表格中的信息,因此,在編譯程序中必須有一組管理各種表格的程序。圖1.1編譯程序的總體結(jié)構(gòu)圖
5、1.2.2 c語(yǔ)言基本語(yǔ)法總結(jié)(1)標(biāo)識(shí)符 由字母、數(shù)字和下劃線組成。標(biāo)識(shí)符必須以字母或下劃線開頭。大、小寫的字母分別認(rèn)為是兩個(gè)不同的字符。不同的系統(tǒng)對(duì)標(biāo)識(shí)符的字符數(shù)有不同的規(guī)定,一般允許7個(gè)字符。(2)注釋/和/必須成對(duì)出現(xiàn);注釋不能嵌套;注釋可出現(xiàn)在程序的任何位置。(3) 常量整型常量十進(jìn)制常數(shù)(八進(jìn)制常數(shù)、十六進(jìn)制常數(shù)、長(zhǎng)整型常數(shù));字符常量(用單引號(hào)括起來(lái)的字符);字符串常量(用雙引號(hào)括起來(lái)的字符序列);浮點(diǎn)型常量(小數(shù)形式、指數(shù)形式)。(4) 表達(dá)式算術(shù)表達(dá)式(整型表達(dá)式、實(shí)型表達(dá)式);邏輯表達(dá)式(用邏輯運(yùn)算符連接的整型量,結(jié)果為一個(gè)整數(shù)0或1,邏輯表達(dá)式可以認(rèn)為是整型表達(dá)式的一種特
6、殊形式);字位表達(dá)式;強(qiáng)制類型轉(zhuǎn)換表達(dá)式(用類型運(yùn)算符使表達(dá)式的類型進(jìn)行強(qiáng)制轉(zhuǎn)換);逗號(hào)表達(dá)式;賦值表達(dá)式(將賦值號(hào)=右側(cè)表達(dá)式的值賦給賦值號(hào)左邊的變量);條件表達(dá)式;指針表達(dá)式(對(duì)指針類型的數(shù)據(jù)進(jìn)行運(yùn)算)。(5) 數(shù)據(jù)定義對(duì)程序中用到的所有變量都需要進(jìn)行定義。對(duì)數(shù)據(jù)定義其類型,需要時(shí)要指定其存儲(chǔ)類別。類型標(biāo)識(shí)符可用:int、short、long、unsigned、char、float、double、struct 結(jié)構(gòu)體名、union 共用體名等;存儲(chǔ)類別可用:auto、static、register、extern(如不指定存儲(chǔ)類別,作auto處理)。注意:外部數(shù)據(jù)定義只能用extern或st
7、atic,而不能用auto或register。(6) 函數(shù)定義形式為:存儲(chǔ)類別數(shù)據(jù)類型函數(shù)名(形參表列);形參說(shuō)明;函數(shù)體。函數(shù)的存儲(chǔ)類別只能用extern或static。函數(shù)體是用花括弧括起來(lái)的,可包括數(shù)據(jù)定義和語(yǔ)句。(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ù)組才能初始化。1.3 本文主要研究?jī)?nèi)容對(duì)考生編制的每個(gè)源程序的分析過(guò)程包括編譯、連接、運(yùn)行和結(jié)果評(píng)分??刂票辉u(píng)程序相應(yīng)進(jìn)程的運(yùn)行。由于編譯、連接、運(yùn)行考生的
8、被評(píng)程序都是在評(píng)卷程序的召喚下進(jìn)行的,因此控制被評(píng)程序相應(yīng)進(jìn)程的運(yùn)行是評(píng)卷算法的主要任務(wù)。對(duì)被評(píng)程序運(yùn)行過(guò)程中可能存在的死循環(huán)進(jìn)行識(shí)別。為了避免因考生的被評(píng)程序中可能含有死循環(huán)而使評(píng)卷無(wú)法繼續(xù),算法中采取修改定時(shí)中斷的方法。當(dāng)被評(píng)程序相應(yīng)進(jìn)程運(yùn)行足夠長(zhǎng)時(shí)問(wèn)后仍未結(jié)束,則判定它含有死循環(huán),可強(qiáng)行終止它。然后對(duì)該程序記分。當(dāng)考生的一個(gè)程序被評(píng)分后,就可以對(duì)考生的下一個(gè)程序或下一個(gè)考生開始評(píng)分。為便于機(jī)器閱卷,可在試題類型上做如下要求:(1)源程序中主程序與所有子程序均存入同一文件且只能取規(guī)定的文件名;(2)所有的輸入均由與試題相應(yīng)的某一文件提供;(3)所有的輸出結(jié)果均按指定的格式存入一個(gè)與試題相應(yīng)
9、的文件中。2.開發(fā)平臺(tái)及工具簡(jiǎn)介2.1 visual c+簡(jiǎn)介:幾乎所有世界級(jí)的軟件,從業(yè)界領(lǐng)先的web瀏覽器到面向任務(wù)的企業(yè)應(yīng)用,都是使用microsoft visual c+開發(fā)系統(tǒng)來(lái)開發(fā)的。要用c+來(lái)開發(fā)windows和web上的高性能應(yīng)用程序,visual c+是效率最高的首選工具。visual c+ 6.0在不犧牲靈活性、性能和控制力度的同時(shí),給c+帶來(lái)更高水平的生產(chǎn)效率。除了intellisense technology(智能感應(yīng)技術(shù))和edit and continue(即編即調(diào))等顯著縮短開發(fā)時(shí)間的新特性外,visual c+ 6.0還為web開發(fā)和企業(yè)開發(fā)提供更良好的支持。m
10、icrosoft visual c+ 6.0專業(yè)版的健壯的構(gòu)件開發(fā)、強(qiáng)大的數(shù)據(jù)庫(kù)工具和完備的internet支持將使您從中受益,創(chuàng)建出策略性的商務(wù)解決方案來(lái)。visual studio c+6.0采用一種非常巧妙的方法將原本非常復(fù)雜的windows編程步驟封裝起來(lái),使編程人員可以輕松容易地編寫windows應(yīng)用程序。visual c+6.0是microsoft visual studio6.0的一個(gè)子集,他對(duì)低版本開發(fā)程序兼容。它有如下的特點(diǎn):(1) visual c+6.0提供了用于開發(fā)windows環(huán)境下的應(yīng)用程序和簡(jiǎn)捷、快速的開發(fā)環(huán)境。利用visual c+6.0開發(fā)windows應(yīng)用程
11、序具有很高的效率。(2) visual c+6.0提供了mfc類,開發(fā)者只需要做少量的工作就可以得到功能齊全的windows應(yīng)用程序。與使用c和windows sdk開發(fā)windows應(yīng)用程序相比,使用visual c+6.0建立一個(gè)完美的windows應(yīng)用程序所花費(fèi)的時(shí)間要少得多。(3) visual c+6.0還提供了一個(gè)高度集成的工具集,使得在開發(fā)應(yīng)用程序的全過(guò)程中都保證了較高的效率。集成化便于程序開發(fā),開發(fā)者可以同時(shí)在編輯、建立、調(diào)試等不同任務(wù)之間快速切換,甚至可以同時(shí)進(jìn)行。(4)調(diào)試方便:在程序調(diào)試時(shí),在遇到編譯錯(cuò)誤時(shí),會(huì)在輸出窗口顯示出錯(cuò)誤類型、行號(hào)及錯(cuò)誤提示等信息。在輸出窗口中雙
12、擊錯(cuò)誤提示時(shí),光標(biāo)會(huì)自動(dòng)指向出現(xiàn)錯(cuò)誤的代碼所在行應(yīng)方便快速找出錯(cuò)誤。visual c+支持?jǐn)帱c(diǎn)調(diào)試,同時(shí)也可以在調(diào)試窗口觀察有關(guān)變量的值,以方便查找出有關(guān)的邏輯錯(cuò)誤。2.2 ado技術(shù)1) ado的技術(shù)特點(diǎn) ado的全稱是activex data object,它是微軟公司為數(shù)據(jù)庫(kù)應(yīng)用程序開發(fā)的新接口。ado基于com,提供編程語(yǔ)言可利用的對(duì)象,它不僅面向visual c+,同時(shí)還提供面向其他開發(fā)工具的應(yīng)用,如visual basic、vj等,甚至還提供面向諸如 vbscript、javascript等腳本語(yǔ)言的應(yīng)用。ado的底層是ole db,不僅能訪問(wèn)關(guān)系數(shù)據(jù)庫(kù),也能訪問(wèn)非關(guān)系型數(shù)據(jù)庫(kù)。a
13、do對(duì)ole db的包裝是相當(dāng)成功的,相對(duì)于ole db中眾多的接口來(lái)說(shuō),ado對(duì)象模型簡(jiǎn)明扼要,沒有一點(diǎn)多余的東西,并且其功能還要比dao強(qiáng)大的多。并且可以說(shuō)到目前為止,ado是目前最快的數(shù)據(jù)庫(kù)訪問(wèn)的中間層。2) ado的結(jié)構(gòu)ado模型包含了7個(gè)對(duì)象和4個(gè)集合,ado的結(jié)構(gòu)圖如圖2.1所示。2.3 sql語(yǔ)句簡(jiǎn)介sql是一種面向數(shù)據(jù)庫(kù)的通用數(shù)據(jù)處理語(yǔ)言規(guī)范,能完成以下幾類功能:提取查詢數(shù)據(jù),插入修改刪除數(shù)據(jù),生成修改和刪除數(shù)據(jù)庫(kù)對(duì)象,數(shù)據(jù)庫(kù)安全控制,數(shù)據(jù)庫(kù)完整性及數(shù)據(jù)保護(hù)控制。本文用到的sql語(yǔ)句主要為select語(yǔ)句和insert語(yǔ)句。連接對(duì)象(connection)錯(cuò)誤集合(errors
14、)錯(cuò)誤對(duì)象(error)屬性集合(properties)屬性對(duì)象(property)命令對(duì)象(command)參數(shù)集合(parameters)參數(shù)對(duì)象(parameter)屬性集合(properties)屬性對(duì)象(property)記錄集對(duì)象(recordset)域集合(fields)域?qū)ο?field)屬性集合(properties)屬性對(duì)象(property)圖2.1 ado的結(jié)構(gòu)圖3 需求分析與概要設(shè)計(jì)3.1系統(tǒng)需求分析本課題的名稱為:編程考試機(jī)器評(píng)卷系統(tǒng)。編程考試是計(jì)算機(jī)等相關(guān)專業(yè)的常見考試,其具體要求為對(duì)指定的題目設(shè)計(jì)算法并使用考試所規(guī)定的編程語(yǔ)言(如:c語(yǔ)言、java語(yǔ)言、pyth
15、on語(yǔ)言)編寫程序?qū)崿F(xiàn)其設(shè)計(jì)的算法以完成題目的要求。由此我們可以把本課題按照要求分為兩大功能模塊來(lái)完成:某種編程語(yǔ)言的解析(語(yǔ)法分析、詞法分析等);評(píng)分系統(tǒng)的設(shè)計(jì)(如何針對(duì)錯(cuò)誤來(lái)打分、分?jǐn)?shù)如何存儲(chǔ)與顯示給用戶)。a) 某種語(yǔ)言的解析:本模塊是系統(tǒng)中最重要的模塊也是最難實(shí)現(xiàn)的模塊是其他模塊的基礎(chǔ)。在這里選用最熟悉的、使用也最為廣泛的c語(yǔ)言進(jìn)行解析。c語(yǔ)言有著較為復(fù)雜的語(yǔ)法與詞法規(guī)則。在本課題中擬模仿微軟的經(jīng)典編譯器vc+的設(shè)計(jì),來(lái)完成對(duì)c語(yǔ)言的解析,包括語(yǔ)法詞法分析、關(guān)鍵字的高亮現(xiàn)實(shí)、輸出程序中出現(xiàn)的錯(cuò)誤等等。顯示風(fēng)格模擬vc+6.0的界面設(shè)計(jì)。b) 評(píng)分系統(tǒng)的設(shè)計(jì):機(jī)器評(píng)卷永遠(yuǎn)也代替不了人來(lái)評(píng)
16、卷,使用機(jī)器評(píng)卷系統(tǒng)終歸會(huì)遇到很多機(jī)器很難解決的問(wèn)題。例如在程序中某一處發(fā)生用戶丟失標(biāo)點(diǎn)符號(hào),這個(gè)現(xiàn)象對(duì)于評(píng)卷來(lái)說(shuō)是一個(gè)小問(wèn)題,但是對(duì)于程序來(lái)說(shuō)就是一個(gè)大的問(wèn)題(語(yǔ)法錯(cuò)誤程序無(wú)法通過(guò)編譯)。而且機(jī)器評(píng)卷永遠(yuǎn)也不可能如人評(píng)卷那樣準(zhǔn)確。因此,在本課題中評(píng)卷系統(tǒng)的設(shè)計(jì)遵守兩大原則:盡量體現(xiàn)人性化設(shè)計(jì)對(duì)于小錯(cuò)誤、小問(wèn)題不給予嚴(yán)重的扣分;模擬vc+6.0的編譯功能,已其檢查的出的錯(cuò)誤為評(píng)分標(biāo)準(zhǔn)。3.2 系統(tǒng)整體框架圖c語(yǔ)言解析模塊總體結(jié)構(gòu)圖如圖3.1所示。程序運(yùn)行后用戶選擇其所需要評(píng)閱的試卷,點(diǎn)擊評(píng)卷開始閱卷。首先進(jìn)入的就是c語(yǔ)言的解析部分。 首先,程序?qū)?duì)用戶打開的c語(yǔ)言編程試卷.c文件,進(jìn)行詞法和語(yǔ)
17、法的分析。然后通過(guò)特定的數(shù)據(jù)結(jié)構(gòu)生成語(yǔ)法樹,在這個(gè)階段將檢查出基本的語(yǔ)法詞法錯(cuò)誤,語(yǔ)法樹是進(jìn)行解析的基礎(chǔ)。其作用與原理在后文中講繼續(xù)詳細(xì)說(shuō)明。在語(yǔ)法樹生成成功之后,解析程序建立起關(guān)于考卷(c語(yǔ)言程序)的符號(hào)表。在符號(hào)表的基礎(chǔ)上,程序能夠?qū)季磉M(jìn)行類型匹配等表復(fù)雜的錯(cuò)誤的檢查。例如,函數(shù)的參數(shù)傳遞錯(cuò)誤,結(jié)果返回錯(cuò)誤等。圖3.1 c語(yǔ)言解析模塊總體結(jié)構(gòu)圖評(píng)卷系統(tǒng)總體框架如圖3.2所示,當(dāng)解析程序?qū)υ闯绦蚍治鐾戤吅?,系統(tǒng)根據(jù)解析結(jié)果對(duì)源程序進(jìn)行評(píng)分。在評(píng)分中盡量體現(xiàn)人性化設(shè)計(jì),例如源程序中如果出現(xiàn)標(biāo)點(diǎn)符號(hào)漏掉等錯(cuò)誤按照其他錯(cuò)誤的一半分來(lái)扣。評(píng)分結(jié)束后根據(jù)分?jǐn)?shù)寫出對(duì)應(yīng)的評(píng)語(yǔ),為了方便分?jǐn)?shù)的管理,將對(duì)應(yīng)
18、的分?jǐn)?shù)、評(píng)語(yǔ)、源程序名存入到數(shù)據(jù)庫(kù)中。評(píng)分系統(tǒng)還提供評(píng)卷成績(jī)列表用于現(xiàn)實(shí)所有的分?jǐn)?shù)。圖3.2 評(píng)卷系統(tǒng)總體框架圖3.3 系統(tǒng)目標(biāo)本系統(tǒng)為編程考試的機(jī)器評(píng)卷。系統(tǒng)中最為核心的目標(biāo)為:對(duì)考生的c語(yǔ)言源程序進(jìn)行解析。這就需要實(shí)現(xiàn)幾個(gè)核心的算法,例如語(yǔ)法分析、詞法分析、類型匹配等等。同時(shí)要實(shí)現(xiàn)評(píng)分的智能化、人性化,僅僅檢查出語(yǔ)法、詞法上存在錯(cuò)誤是不夠的。還需準(zhǔn)確地獲取錯(cuò)誤的具體情況,根據(jù)不同的情況進(jìn)行打分。因此本系統(tǒng)模擬vc+6.0編輯器,實(shí)現(xiàn)對(duì)c語(yǔ)言源程序的解析,并輸出錯(cuò)誤類型。為了方便用戶的使用,在系統(tǒng)主界面中還添加一些類vc+編輯器的輔助功能,例如關(guān)鍵字高亮、錯(cuò)誤行數(shù)提示等。在完成評(píng)分后,為了方
19、便成績(jī)的管理,系統(tǒng)添加數(shù)據(jù)庫(kù)功能,用數(shù)據(jù)庫(kù)存儲(chǔ)考試成績(jī),以方便管理與維護(hù)。本系統(tǒng)用vc開發(fā),連接數(shù)據(jù)庫(kù)采用ado方式與access進(jìn)行連接。4. 詳細(xì)設(shè)計(jì)4.1 數(shù)據(jù)庫(kù)的創(chuàng)建本系統(tǒng)采用access數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)相關(guān)信息,建立數(shù)據(jù)庫(kù)的過(guò)程如下:在工程所在目錄下點(diǎn)擊鼠標(biāo)郵件,在彈出的快捷菜單中將鼠標(biāo)移到“新建”,再在彈出的字菜單中點(diǎn)擊“新建microsoft office access 應(yīng)用程序”。到此數(shù)據(jù)庫(kù)就建立好了,將改access文件改名c語(yǔ)言考試評(píng)分成績(jī).mdb。數(shù)據(jù)庫(kù)表格的建立:本系統(tǒng)中數(shù)據(jù)庫(kù)是用于存儲(chǔ)考試成績(jī)信息。本系統(tǒng)建立一張表:成績(jī)表。成績(jī)表只包含三個(gè)字段:題目、分?jǐn)?shù)、評(píng)語(yǔ),設(shè)計(jì)如表
20、4.1所示。表4.1 成績(jī)表字段含義字段名數(shù)據(jù)類型c語(yǔ)言源程序標(biāo)題題目text程序得分分?jǐn)?shù)int評(píng)語(yǔ)評(píng)語(yǔ)text4.2 mfc連接數(shù)據(jù)庫(kù)本系統(tǒng)在進(jìn)行數(shù)據(jù)庫(kù)連接時(shí)采用的是ado方式進(jìn)行連接。ado(activex data object)是microsoft數(shù)據(jù)庫(kù)應(yīng)用程序開發(fā)的新接口,是建立在ole db之上的高層數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),即使你對(duì)ole db,com不了解也能輕松對(duì)付ado,因?yàn)樗浅:?jiǎn)單易用,甚至比你以往所接觸的odbc api、dao、rdo都要容易使用,并不失靈活性。ado數(shù)據(jù)庫(kù)開發(fā)的基本流程,它的基本步驟如下:1)初始化com庫(kù),引入ado庫(kù)定義文件2)用connection對(duì)象
21、連接數(shù)據(jù)庫(kù)3)利用建立好的連接,通過(guò)connection、command對(duì)象執(zhí)行sql命令,或利用recordset對(duì)象取得結(jié)果記錄集進(jìn)行查詢、處理。4)使用完畢后關(guān)閉連接釋放對(duì)象。接下來(lái)詳細(xì)介紹連接過(guò)程:com庫(kù)的初始化我們可以使用afxoleinit()來(lái)初始化com庫(kù),這項(xiàng)工作通常在cwinapp:initinstance()的重載函數(shù)中完成,代碼:bool cadotest1app:initinstance()afxoleinit();. 2)用#import指令引入ado類型庫(kù)為了引入ado類型庫(kù),需要在項(xiàng)目的stdafx.h文件中加入如下語(yǔ)句:#import c:program f
22、ilescommon filessystemadomsado15.dll no_namespace rename(eof,adoeof)這一語(yǔ)句的作用同我們已經(jīng)十分熟悉的#include類似,編譯的時(shí)候系統(tǒng)會(huì)為我們生成msado15.tlh,ado15.tli兩個(gè)c+頭文件來(lái)定義ado庫(kù)。開發(fā)環(huán)境中msado15.dll不一定在這個(gè)目錄下,要按實(shí)際情況修改;在編譯的時(shí)候可能會(huì)出現(xiàn)如下警告,對(duì)此微軟在msdn中作了說(shuō)明,并建議我們不要理會(huì)這個(gè)警告:msado15.tlh(405) : warning c4146: unary minus operator applied to unsigned
23、type, result still unsigned。3)創(chuàng)建connection對(duì)象并連接數(shù)據(jù)庫(kù)為了首先我們需要添加一個(gè)指向connection對(duì)象的指針_connectionptr m_pconnection,下面的代碼演示了如何創(chuàng)建connection對(duì)象實(shí)例及如何連接數(shù)據(jù)庫(kù)并進(jìn)行異常捕捉:bool cadotest1dlg:oninitdialog()cdialog:oninitdialog();hresult hr;tryhr = m_pconnection.createinstance(adodb.connection);/創(chuàng)建connection對(duì)象if(succeeded(h
24、r)hr = m_pconnection-open(provider=microsoft.jet.oledb.4.0;data source=test.mdb,admodeunknown);/連接數(shù)據(jù)庫(kù)/上面一句中連接字串中的provider是針對(duì)access2000環(huán)境的,對(duì)于access97,/需要改為:provider=microsoft.jet.oledb.3.51;catch(_com_error e)/捕捉異常cstring errormessage;errormessage.format(連接數(shù)據(jù)庫(kù)失敗!rn錯(cuò)誤信息:%s,e.errormessage();afxmessageb
25、ox(errormessage);/顯示錯(cuò)誤信息在這段代碼中我們是通過(guò)connection對(duì)象的open方法來(lái)進(jìn)行連接數(shù)據(jù)庫(kù)的。4)執(zhí)行sql命令并取得結(jié)果記錄集為了取得結(jié)果記錄集,我們定義一個(gè)指向recordset對(duì)象的指針:_recordsetptr m_precordset;并為其創(chuàng)建recordset對(duì)象的實(shí)例: m_precordset.createinstance(adodb.recordset),sql命令的執(zhí)行可以采用多種形式,本文采用了recordset對(duì)象進(jìn)行查詢?nèi)〉糜涗浖?。m_precordset-open(sql語(yǔ)句,_variant_t(idispatch *)m_p
26、connection,true),adopenstatic,adlockoptimistic,adcmdtext);插入操作采用的是connection對(duì)象的execute方法執(zhí)行sql命令。execute()方法的原型如下所示:recordsetptr connection15:execute ( _bstr_t commandtext, variant * recordsaffected, long options ) 其中commandtext是命令字串,通常是sql命令。參數(shù)recordsaffected是操作完成后所影響的行數(shù), 參數(shù)options表示commandtext中內(nèi)容的類
27、型,options可以取如下值之一:adcmdtext表明commandtext是文本命令;adcmdtable表明commandtext是一個(gè)表名;adcmdproc表明commandtext是一個(gè)存儲(chǔ)過(guò)程;adcmdunknown表明commandtext內(nèi)容未知。execute()函數(shù)執(zhí)行完后返回一個(gè)指向記錄集的指針。5)關(guān)閉記錄集與連接 記錄集或連接都可以用close()方法來(lái)關(guān)閉:m_precordset-close();/關(guān)閉記錄集m_pconnection-close();/關(guān)閉連接本系統(tǒng)在設(shè)計(jì)對(duì)access進(jìn)行操作時(shí)為了方便將上述操作寫成了一個(gè)類。4.3源程序運(yùn)行檢測(cè)算法的描述
28、 源程序運(yùn)行檢測(cè)算的程序流程圖如下所示:圖 4.3.1程序運(yùn)行算法流程圖上圖中描述了本系統(tǒng)程序運(yùn)行主算法的數(shù)據(jù)流程。其中包括了詳細(xì)了,c語(yǔ)言源程序文件導(dǎo)入后的基本處理、詞法分析的數(shù)據(jù)流程與具體方式、語(yǔ)法分析的數(shù)據(jù)流程、語(yǔ)法樹的定義與生成、類型匹配的檢測(cè)方式等等。在這一章中,本章中將重點(diǎn)從全局的角度對(duì)本系統(tǒng)主算法進(jìn)行一個(gè)分析與實(shí)現(xiàn)的說(shuō)明。由于涉及到的內(nèi)容過(guò)多,與代碼有關(guān)的設(shè)計(jì)與實(shí)現(xiàn)在下面的章節(jié)將詳細(xì)的給出。首先,系統(tǒng)需要獲取c語(yǔ)言源程序的代碼信息。程序?qū)崿F(xiàn)中通過(guò)mfc的cfile類導(dǎo)入一個(gè)c語(yǔ)言的源程序文件.c文件。存儲(chǔ)到mfc為文件提供的專用buffer中,注意這個(gè)時(shí)候文件的存儲(chǔ)是以一個(gè)一個(gè)字
29、符的形式存儲(chǔ)的。系統(tǒng)需要進(jìn)行一些簡(jiǎn)單的處理把其翻譯成一個(gè)一個(gè)的字符串。完成第一步之后,系統(tǒng)已經(jīng)得到了一個(gè)關(guān)于c語(yǔ)言源程序的字符串存儲(chǔ)結(jié)構(gòu)。下面進(jìn)入到的是c語(yǔ)言的詞法分析階段。詞法分析大致分為兩個(gè)部分:c語(yǔ)言保留字的查找特殊字符的查找與翻譯(翻譯成token字符),變量、函數(shù)等程序?qū)ο蟮脑~法檢測(cè)。在這里首先需要解釋一下的是為什么要把所有的東西都翻譯成token字符?因?yàn)楸鞠到y(tǒng)是使用vc+去分析檢查c語(yǔ)言程序,c+與c語(yǔ)言中的關(guān)鍵字有非常多的重復(fù),如果不加翻譯的話c+語(yǔ)言進(jìn)行時(shí)會(huì)發(fā)生語(yǔ)法的錯(cuò)誤。例如,在c語(yǔ)言源程序中存在/n字符,如果在本系統(tǒng)中直接將/n不進(jìn)行分析進(jìn)行下述語(yǔ)法樹建立操作時(shí),語(yǔ)法樹的
30、生出讀到/n會(huì)自動(dòng)換行,產(chǎn)生錯(cuò)誤。關(guān)于構(gòu)詞法的算法,按照c語(yǔ)言構(gòu)詞法的所有要求上文中已經(jīng)提到過(guò),在這里就不再重復(fù)說(shuō)明了。在完成上述查找翻譯詞法檢測(cè)之后,在這個(gè)部分還有一個(gè)特殊的功能。按照每一個(gè)token的類型(關(guān)鍵字、變量、函數(shù)等等)給出不同顏色的提示。具體算法為查找到token的類型返回不同的顏色,在輸出界面中顯示出來(lái)。該功能能夠幫助評(píng)卷人更好地認(rèn)識(shí)與識(shí)別程序中的錯(cuò)誤。在這里如果檢測(cè)到構(gòu)詞法的錯(cuò)誤,則記錄該錯(cuò)誤的位置token,并通過(guò)給出錯(cuò)誤的輸出。在完成上述步驟之后,系統(tǒng)進(jìn)入到語(yǔ)法分析的階段。語(yǔ)法分析較之詞法分析更為復(fù)雜因?yàn)閮H從局部無(wú)法完全準(zhǔn)確的進(jìn)行判斷。語(yǔ)法分析算法的核心是建立一個(gè)關(guān)于c
31、語(yǔ)言源程序的語(yǔ)法樹。語(yǔ)法樹結(jié)構(gòu)的定義是本步驟的重點(diǎn)。在本程序中采用嵌套遞歸的設(shè)計(jì)思路,來(lái)設(shè)計(jì)語(yǔ)法樹的結(jié)構(gòu)。首先,將每一個(gè)語(yǔ)法元素看做是一個(gè)基本的樹對(duì)象。(例如,if語(yǔ)句整個(gè)是一個(gè)基本樹對(duì)象而if語(yǔ)句中的表達(dá)式也是一個(gè)基本樹對(duì)象,兩者之間是一個(gè)嵌套的關(guān)系) 4.4 源程序的導(dǎo)入與解析c語(yǔ)言原程序的解析是本系統(tǒng)的重點(diǎn),是系統(tǒng)其他部分執(zhí)行的基礎(chǔ)。編譯原理的基礎(chǔ)知識(shí)在本文的第二部分已做了介紹,這里就不再重復(fù)。根據(jù)本文中第三部分的設(shè)計(jì),本模塊的總體框架如圖3.1所示,本模塊大致分為以下4個(gè)功能模塊實(shí)現(xiàn):詞法分析、語(yǔ)法分析、建立文檔符號(hào)表、類型匹配檢測(cè)。下文將針對(duì)每一個(gè)具體功能模塊進(jìn)行詳細(xì)講述。4.4.1
32、詞法分析:c語(yǔ)言的構(gòu)詞法規(guī)則為:由字母、數(shù)字和下劃線組成。標(biāo)識(shí)符必須以字母或下劃線開頭。大、小寫的字母分別認(rèn)為是兩個(gè)不同的字符。不同的系統(tǒng)對(duì)標(biāo)識(shí)符的字符數(shù)有不同的規(guī)定,一般允許7個(gè)字符。同時(shí)c語(yǔ)言中擁有大量的保留字,在定義變量時(shí)不能與這些關(guān)鍵字重復(fù)。在本程序中也同樣建立了一個(gè)關(guān)于c語(yǔ)言關(guān)鍵字的對(duì)應(yīng)表詞法分析功能主要由以下兩個(gè)類來(lái)完成:l class ctokenizer:這個(gè)類的主要作用為:從一個(gè)字符串中(這里把一個(gè)文件看作是一個(gè)字符串,mfc中cfile-cstring獲取用戶調(diào)入的c語(yǔ)言源程序)分離出一個(gè)一個(gè)token來(lái),配上簡(jiǎn)單的類型再通過(guò)nexttoken()獲取返回值。返回值與其宏定
33、義如下:code#define tt_eol n#define tt_eof -1#define tt_integer -2#define tt_real -3#define tt_word -4#define tt_string #define tt_charl class cscaner:這個(gè)類的作用為:獲取c語(yǔ)言源程序中具體具體的的token類型。token類型的定義必須與c語(yǔ)言關(guān)鍵字相對(duì)應(yīng)用于詞法的檢測(cè)。c語(yǔ)言關(guān)鍵字如下表:autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunion
34、constfloatshortunsignedcontinueforsignedvoiddefaultgotosizeofvolatiledoifstaticwhile表1 c關(guān)鍵字表token類型的定義分為以下5類與c語(yǔ)言相對(duì)應(yīng)。code:enum tokentype程序關(guān)鍵字定義_auto, _double, _int, _struct,_break, _else, _long, _switch, _case, _enum, _register, _typedef,_char, _extern, _return, _union,_const, _float, _short, _unsign
35、ed,_continue, _for, _signed, _void,_default, _goto, _sizeof, _volatile,_do, _if, _static, _while,_read, _write, _printf,操作關(guān)鍵字assign, plus, minus, times, div, mod,bitwise_and, bitwise_or, bitwise_not, logical_not, lt, gt,中斷關(guān)鍵字lparan, rparan, lbrace, rbrace, lsquare, rsquare, comma, dot, semi, colon,混
36、合操作符eq/* = */, neq/* != */, plus_plus/* + */, minus_minus/* - */,plus_assign/* += */, minus_assign/* -= */, times_assign/* *= */, div_assign/* /= */,ngt/* = */, logical_and/* & */, logical_or/* | */,其他_eof, _id, _num, _string, _character, _label, _error, _none;cscaner實(shí)現(xiàn)詞法分析的查找與反向查找是通過(guò)函數(shù)cmap來(lái)實(shí)現(xiàn)的。成員變量
37、m_keyindex 把c語(yǔ)言源程序(cstring)的關(guān)鍵字和tokentype對(duì)應(yīng)。例如:當(dāng)系統(tǒng)查找到+時(shí),自動(dòng)把它翻譯成token類型plus。l 變量標(biāo)識(shí)符構(gòu)詞法分析原理:例如標(biāo)識(shí)strid1,根據(jù)c語(yǔ)言的變量命名法則,系統(tǒng)先檢查變量名的開頭部分是否由正確的字母或符號(hào)組成。(_ 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 za 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)。然后再檢查變量的其他部分是否含有0 1 2 3 4 5 6 7 8 9。4.4.2語(yǔ)法分析:本系統(tǒng)中語(yǔ)法
38、分析的功能是由類cparser來(lái)完成的。l class cparser完成的主要功能是:在詞法分析的基礎(chǔ)上,通過(guò)文法與相應(yīng)的規(guī)則起建立語(yǔ)法樹。具體實(shí)現(xiàn)如下:首先定義數(shù)據(jù)結(jié)構(gòu)ctreenode,結(jié)構(gòu)ctreenode是建立語(yǔ)法樹的基礎(chǔ)。ctreenode的由以下代碼實(shí)現(xiàn)。code:#define max_children 3class ctreenodepublic:ctreenode*child max_children ;/ point to child nodectreenode*father;/ point to father nodectreenode*sibling;/ point
39、to sibling nodeintlineno;nodekindnodekind;union stmtkindstmt;expkindexp; kind;enum tokentypetype;cstringszname;cstringszscope;/ node function scopeboolbarray;/ is this an array declarationintiarraysize;/ array size;l grammar分析與函數(shù)返回:1. program-declaration_list2. declaration_list-declaration_list decl
40、aration | declaration3. declaration-var_declaration | fun_declaration4. var_declaration-type_specifier id(, .); | type_specifier id num (, .);5. type_specifier-int | void | char, actually this step is in declaration_list()6. fun_declaration-type_specifier id ( params ) compound_stmt7. params-param_l
41、ist | void | empty, void is thought as empty8. param_list-param_list , param | param9. param-type_specifier id | type_specifier id 10. compound_stmt- loal_declarations statement_list | expression_stmt11. local_declarations-local_declarations var_declaration | var_declaration12. read ( var ) ;13. wri
42、te ( expression ) ;14. printf ( string ) ;15. expression_stmt-expression ; | ;16. expression-var = expression | logic1_expression17. logic1_expression-logic1_expression | logic2_expression | logic2_expression18. logic2_expression- logic2_expression & simple_expression | simple_expression19. simple_e
43、xpression-additive_expression relop additive_expression | additive_expression20. relop- = | | = | = | !=21. additive_expression - additive_expression addop term | term22. addop- + | -23. term-term mulop logic3_expression | logic3_expression24. mulop- * | / | %25. logic3_expression- ! logic3_expressi
44、on | factor26. factor-( expression ) | var | call | num27. var-id | id expression 28. call-id ( args )29. args-args_list | empty30. args_list-args_list , expression | expression31. sub_compoundstmt-id : | call ; | expression_stmt32. if_stmt-if ( expression ) compound_stmt33. | if ( expression ) comp
45、ound_stmt else compound_stmt34. while_stmt-while ( expression ) compound_stmt35. for_stmt-for ( var = expression ; expression ; var = expression ) compound_stmt36. goto_stmt-goto id ;37. break_stmt-break ;38. continue_stmt-continue ;39. return_stmt-return ; | return expression ;l 基本樹形結(jié)構(gòu):if語(yǔ)句: if語(yǔ)句表達(dá)
46、式語(yǔ)句語(yǔ)句while語(yǔ)句:while語(yǔ)句表達(dá)式語(yǔ)句表達(dá)式語(yǔ)句表達(dá)式for語(yǔ)句表達(dá)式for循環(huán)語(yǔ)句:復(fù)合語(yǔ)句:語(yǔ)句復(fù)合語(yǔ)句語(yǔ)句語(yǔ)句聲明l 支持的語(yǔ)句及運(yùn)算:1) 數(shù)據(jù)類型:int,char void,pcode里支持float,在80x86 asm里不支持2) 語(yǔ)句:賦值(=),if, while,for,return,break,continue3) 數(shù)學(xué)運(yùn)算:+,*,/4) 關(guān)系運(yùn)算:= =,=,szname, t-szscope ) = -1 ) / not defined, so add it to the symbol tablem_symboltable.st_insert( t-s
47、zname, t-szscope, t-type, t-lineno, location+ );/ add it to function declaration listm_funargs.fa_insert( t ); else / redefinition函數(shù)重定義theapp.score=theapp.score-10;outputerrmsg( error in line %d: function %s() redefinition, t-lineno, (lpctstr)t-szname );.以上為函數(shù)發(fā)生重定義時(shí)的扣分情況。系統(tǒng)按照解析的順序依次扣分,在解析完成之后即得出考試的最終成績(jī)。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度醫(yī)療健康股權(quán)分配與產(chǎn)業(yè)布局協(xié)議
- 二零二五年度酒店員工勞動(dòng)合同與員工培訓(xùn)及職業(yè)素養(yǎng)提升合同
- 2025年度金融控股集團(tuán)間戰(zhàn)略資金借款合同
- 二零二五年度高空作業(yè)安全協(xié)議責(zé)任書(高空設(shè)備檢修安全協(xié)議)
- 二零二五年度鮮魚養(yǎng)殖與品牌營(yíng)銷合作合同
- 二零二五年度電子商務(wù)平臺(tái)技術(shù)支持合同范本
- 二零二五年度汽車租賃代駕保險(xiǎn)保障合同
- 2025年度餐廳門面租賃與地方旅游發(fā)展合作合同
- 安徽省2025年度非全日制用工勞動(dòng)合同書解除與終止協(xié)議
- 數(shù)據(jù)安全保障與服務(wù)合作合同
- 拗九節(jié)班會(huì)方案
- 2022年八大員的勞務(wù)員考試題及答案
- DLT5210.4-2018熱工施工質(zhì)量驗(yàn)收表格
- 醫(yī)院實(shí)習(xí)護(hù)士轉(zhuǎn)科表
- 2023年最新的郭氏宗祠的對(duì)聯(lián)大全
- 《中國(guó)古代文學(xué)史》宋代文學(xué)完整教學(xué)課件
- 新部編人教版四年級(jí)下冊(cè)道德與法治全冊(cè)教案(教學(xué)設(shè)計(jì))
- 物業(yè)服務(wù)企業(yè)市場(chǎng)拓展戰(zhàn)略規(guī)劃課件
- 2018年青海大學(xué)碩士論文格式模板
- 四年級(jí)道德與法治從中國(guó)制造到中國(guó)創(chuàng)造
- 兒童跌倒評(píng)估量表(Humpty-Dumpty)
評(píng)論
0/150
提交評(píng)論