技術(shù)報(bào)告基于圖元裝接模式由程序流程圖自動(dòng)生成源代碼_第1頁(yè)
技術(shù)報(bào)告基于圖元裝接模式由程序流程圖自動(dòng)生成源代碼_第2頁(yè)
技術(shù)報(bào)告基于圖元裝接模式由程序流程圖自動(dòng)生成源代碼_第3頁(yè)
技術(shù)報(bào)告基于圖元裝接模式由程序流程圖自動(dòng)生成源代碼_第4頁(yè)
技術(shù)報(bào)告基于圖元裝接模式由程序流程圖自動(dòng)生成源代碼_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、計(jì)劃類(lèi)別 項(xiàng)目編號(hào) 項(xiàng)目技術(shù)報(bào)告課題名稱 項(xiàng)目主持人 承擔(dān)單位 題目:基于圖元裝接模式由程序流程圖自動(dòng)生成源代碼針對(duì)程序流程圖到代碼自動(dòng)翻譯過(guò)程中,通常需要經(jīng)過(guò)代碼優(yōu)化及二次編程,翻譯效率不高,提出基于圖元裝接模式的流程圖到C語(yǔ)言源程序轉(zhuǎn)換的解決方案,實(shí)現(xiàn)流程圖到源程序的雙向轉(zhuǎn)換。由圖元同步產(chǎn)生代碼元,通過(guò)裝接自動(dòng)生成程序代碼。所生成的程序代碼無(wú)需修改,可直接編譯運(yùn)行。通過(guò)詞法分析,識(shí)別并產(chǎn)生代碼元和對(duì)應(yīng)圖元,可逆向生成流程圖。其有效性在原型系統(tǒng)中得到了驗(yàn)證。關(guān)鍵詞:C語(yǔ)言;流程圖;程序代碼;自動(dòng)翻譯1 引言(Introduction)對(duì)于程序設(shè)計(jì)語(yǔ)言初學(xué)者來(lái)說(shuō),通過(guò)畫(huà)流程圖來(lái)學(xué)習(xí)程序編碼,將

2、程序代碼與直觀的圖形相結(jié)合,可以起到事半功倍的學(xué)習(xí)效果。若用草圖來(lái)繪制程序流程圖,并且實(shí)現(xiàn)流程圖的自動(dòng)識(shí)別和代碼生成,不僅符合人的思維習(xí)慣,也將大大方便程序設(shè)計(jì)課程的教學(xué),同時(shí)也可應(yīng)用于程序員的快速程序設(shè)計(jì)和編碼。目前,國(guó)內(nèi)外很多學(xué)者對(duì)手繪草圖識(shí)別的研究已有較大進(jìn)展,可較好地識(shí)別程序流程圖中的簡(jiǎn)單圖元符號(hào)。但是對(duì)程序流程圖控制結(jié)構(gòu)的判別,以及代碼的自動(dòng)翻譯的研究較少。程序流程圖到代碼自動(dòng)生成的流程,通常分為草圖識(shí)別和代碼優(yōu)化兩個(gè)階段,當(dāng)前的研究熱點(diǎn)或技術(shù)難點(diǎn)是圖元的識(shí)別和翻譯,文獻(xiàn)1,2設(shè)計(jì)了圖元節(jié)點(diǎn)存儲(chǔ)結(jié)構(gòu),在圖元識(shí)別的基礎(chǔ)上,提出基于上下文的程序流程草圖自動(dòng)翻譯算法,實(shí)現(xiàn)了在線手繪程序流程

3、草圖到C語(yǔ)言代碼的自動(dòng)翻譯。但該系統(tǒng)所能判別的基本圖元比較單一,而且在判斷程序流程圖控制結(jié)構(gòu)時(shí),采用棧技術(shù),若用戶采用非習(xí)慣性思維畫(huà)圖,可能會(huì)導(dǎo)致棧頂元素?zé)o法正確判別,在一定程度上影響識(shí)別結(jié)果。文獻(xiàn)3-5則是對(duì)程序流程圖到代碼的自動(dòng)生成技術(shù)的研究,然而所研究的程序流程圖到代碼的自動(dòng)生成工具對(duì)流程圖有諸多限制,并不是基于標(biāo)準(zhǔn)的程序流程圖。文獻(xiàn)6針對(duì)標(biāo)準(zhǔn)的程序流程圖,實(shí)現(xiàn)程序流程圖到代碼的自動(dòng)生成,并且對(duì)于含有continue/break/return語(yǔ)義的程序流程圖也能夠很好地識(shí)別并生成相應(yīng)的代碼。文獻(xiàn)7融合圖形化和文本語(yǔ)言兩種編程方式的優(yōu)點(diǎn),提出流程圖與類(lèi)C語(yǔ)言雙向?qū)崟r(shí)轉(zhuǎn)換方法:一方面通過(guò)遍歷

4、模塊樹(shù)并參照功能模塊封裝的庫(kù)函數(shù)和語(yǔ)句完成流程圖到類(lèi)C語(yǔ)言的轉(zhuǎn)換;另一方面采用XML作為中間代碼完成類(lèi)C語(yǔ)言到流程圖的轉(zhuǎn)換。文獻(xiàn)8實(shí)現(xiàn)了程序流程圖的自動(dòng)生成和實(shí)時(shí)修改,提高了程序流程圖的設(shè)計(jì)效率,但沒(méi)有實(shí)現(xiàn)程序代碼的同步生成。本文結(jié)合上述文獻(xiàn)的研究成果,提出手工草圖機(jī)繪流程圖C語(yǔ)言源程序轉(zhuǎn)換的解決方案,目前已實(shí)現(xiàn)了機(jī)繪流程圖到源程序的雙向轉(zhuǎn)換,即按照“圖元+裝接”模式繪制流程圖,同步生成程序代碼;或通過(guò)本系統(tǒng)生成的源代碼,逆向生成流程圖。2 圖元與代碼元(The graphics primitive and the code primitive)2.1 圖元C語(yǔ)言流程圖有傳統(tǒng)流程圖(FC)、盒

5、圖(N-S)、PAD等。其中傳統(tǒng)流程圖比較直觀、形式化,易于理解。但由于對(duì)流程連接線的使用沒(méi)有嚴(yán)格限制,使流程隨意轉(zhuǎn)來(lái)轉(zhuǎn)去,缺少規(guī)律。特別是傳統(tǒng)流程圖繪制后,修改流程圖需要大量移動(dòng)流程連接線,非常煩瑣。為此,我們根據(jù)C語(yǔ)言程序語(yǔ)句基本結(jié)構(gòu),將基本圖形和連接線組合,定義了六種圖元(圖1):if圖元、for圖元、while圖元、do-while圖元、switch圖元、基本語(yǔ)句圖元。圖元中菱形為決策圖標(biāo),矩形為基本語(yǔ)句圖標(biāo),實(shí)線為普通連接線,虛線為圖元裝接線。根據(jù)程序語(yǔ)句的基本功能,基本語(yǔ)句圖元又分為文件包含、常量定義、變量定義、鍵盤(pán)輸入、屏幕輸出、文件打開(kāi)、文件關(guān)閉、文件輸入、文件輸出、賦值語(yǔ)句,

6、以及其他基本語(yǔ)句(通用語(yǔ)句)等十類(lèi)。2.2 代碼元代碼元是與圖元相對(duì)應(yīng)的程序代碼,分別有if代碼元、for代碼元、while代碼元、do-while代碼元、switch代碼元、基本語(yǔ)句代碼元(表1)。表中的代碼元對(duì)應(yīng)的程序代碼只是其初始狀態(tài),呈現(xiàn)為程序語(yǔ)句的骨架,只有通過(guò)進(jìn)一步處理之后,才能成為一條完整的程序語(yǔ)句。3 圖元處理與流程圖繪制(Primitive processing and flowchart drawing)3.1 圖元生成(1)定義圖元基類(lèi)圖元基類(lèi)包含圖元必備元素和基本操作。必備元素主要有圖元的坐標(biāo)位置、高度、寬度、圖元文本(含量代碼與注釋)、友元信息、圖元裝接信息、圖元編輯

7、信息等?;静僮饔形恢靡苿?dòng)、大小改變、選擇、取消選擇、插入圖元、刪除圖元、繪制圖元。public class FC_Control /圖元控件基類(lèi)private int x,y; /圖元坐標(biāo)private int width,height; /圖元寬度與高度private int wLeft,wRight;/圖元左寬與右寬private bool selected; /圖元選中標(biāo)識(shí)private int child_brother;/圖元裝接信息/1 為左孩子結(jié)點(diǎn),2為右孩子結(jié)點(diǎn),0為兄弟結(jié)點(diǎn),-1為初始值(無(wú)效)private CODE_Control friendObj;/圖元友元信息pu

8、blic string txtCode=new string11;/圖元文本信息public string txtComment=new string11;/圖元文本信息virtual public void moveTo(int x,int y) /移動(dòng)到新坐標(biāo) X=x;Y=y;virtual public void reSize() /大小改變操作virtual public FC_Control select(int x,int y) return null; /選擇操作(已知坐標(biāo)位置選擇對(duì)象)virtual public bool select(FC_Control obj) retu

9、rn false; /選擇操作(已知對(duì)象信息,選擇對(duì)象位置)virtual public void escape() bSelected=false; /取消操作virtual public void draw() /繪圖操作virtual public void delete(FC_Control obj) /刪除操作virtual public FC_Control insert(int x,int y,F(xiàn)C_Control obj) return null; /插入操作(已知坐標(biāo)位置,插入特定對(duì)象)virtual public void insert(FC_Control insertO

10、bj,F(xiàn)C_Control indexObj,int index) /插入操作(已知對(duì)象信息,插入特定對(duì)象)(2)定義圖元類(lèi)圖元類(lèi)是圖元基類(lèi)的子類(lèi),它繼承了基類(lèi)的所有屬性和方法,同時(shí)還具有以下兩個(gè)屬性:圖元的孩子對(duì)象集和對(duì)象數(shù)。圖元的孩子對(duì)象包括判斷圖標(biāo)、判斷分支、圖元連接線和圖元裝接線。以while圖元為例,它由1個(gè)判斷圖標(biāo)、2個(gè)判斷分支(Y/N)、2條(5段)圖元連接線和1條圖元裝接線,共計(jì)9個(gè)對(duì)象。下面while圖元類(lèi)屬性定義及其構(gòu)造方法:public class FcWhile : FC_Control /while圖元類(lèi)public int numOfObject=9; /組成圖元的

11、對(duì)象數(shù)public FC_Control N=new FC_Control9; /組成圖元的對(duì)象集public image;/畫(huà)布public FcWhile(int x,int y,F(xiàn)C_image )X=x;Y=y;image=FC_image;bool arrow=true;int defaultWidth=50;int defaultHeight=50;N0=new FcJudge(X,Y,F(xiàn)C_image);/判斷圖標(biāo)N1=new FcJudgeBranch(N0.X,N0.Y+N0.H,F(xiàn)C_image,true,LINEWAY.DOWN);/判斷Y分支N2=new FcCodin

12、gLine(N1.X,N1.Y+N1.H,LINE_TYPE.CODINGLINE_IN_FUNCTION,F(xiàn)C_image);/圖元裝接線N3=new FcLine(N2.X,N2.Y+N2.H,LINEWAY.LEFT,!arrow,LINE_TYPE.NOTCODINGLINE,F(xiàn)C_image);/(左下端)向左連接線N3.W=defaultWidth;N4=new FcLine(N3.X-N3.W,N3.Y,LINEWAY.UP,!arrow,LINE_TYPE.NOTCODINGLINE,F(xiàn)C_image);/(左邊)向上連接線N4.H=N1.H+N2.H+N0.H/2;N5=ne

13、w FcLine(N4.X,N4.Y-N4.H,LINEWAY.RIGHT,arrow,LINE_TYPE.NOTCODINGLINE,F(xiàn)C_image);/(左上端)向右?guī)Ъ^連接線N5.W=N3.W-N0.WL;N6=new FcJudgeBranch(N0.X+N0.WR,N0.Y+N0.H/2,F(xiàn)C_image,false,LINEWAY.RIGHT);/判斷N分支N7=new FcLine(N6.X+N6.W,N6.Y,LINEWAY.DOWN,!arrow,LINE_TYPE.NOTCODINGLINE,F(xiàn)C_image);/(右邊)向下連接線N7.H=N4.H+defaultHe

14、ight;N8=new FcLine(N7.X,N7.Y+N7.H,LINEWAY.LEFT,arrow,LINE_TYPE.NOTCODINGLINE,F(xiàn)C_image);/(右下端)帶箭頭連接線N8.W=N6.W+N0.WR;WR=N8.W;WL=N3.W;W=WL+WR;/計(jì)算圖元寬度H=N0.H/2+N7.H;/計(jì)算圖元高度txtCode0=;txtComment0=; (3)生成圖元對(duì)象當(dāng)用戶通過(guò)菜單項(xiàng)或圖標(biāo)工具插入某個(gè)圖元時(shí),生成該圖元對(duì)象。同樣以while圖元為例,在插入while圖元方法中生成圖元對(duì)象。public void insert_While(int x,int y)i

15、nt X,Y;X=x;Y=y;FcWhile w=new FcWhile(X,Y,F(xiàn)C_image); /生成while圖元對(duì)象 3.2 圖元裝接圖元裝接是將圖元對(duì)象按指定的坐標(biāo)位置插入到圖元裝接線上。圖2是流程圖的初始畫(huà)面,從開(kāi)始到結(jié)束之間,是由兩條裝接線組成。上端黃色裝接線用于插入帶#的圖元對(duì)象,下端藍(lán)色裝接線用于插入其他圖元對(duì)象。圖元裝接根據(jù)裝接對(duì)象的位置關(guān)系分為順序裝接和嵌入裝接兩類(lèi):對(duì)于某個(gè)已裝接的圖元對(duì)象A,當(dāng)待裝接的圖元對(duì)象B與圖元對(duì)象處于同一條裝接線,則為順序裝接如圖3(a)所示;當(dāng)圖元對(duì)象B處于圖元對(duì)象A內(nèi)部的裝接線時(shí),則屬于嵌入裝接如圖3(b)所示。3.3 圖元文本編輯圖元

16、裝接只是決定了了流程圖的流程走向,程序功能則需要通過(guò)圖元文本編輯,確定每個(gè)圖元的具體功能?,F(xiàn)以while圖元為例,說(shuō)明圖元文本編輯的過(guò)程。while圖元的文本編輯,主要是while循環(huán)條件表達(dá)式的編輯。先選中while圖元,然后打開(kāi)該圖元的屬性頁(yè)進(jìn)行相關(guān)的文字編輯,如圖4所示。編輯后的while圖元在左上方添加了條件表達(dá)式,如圖5所示。3.4 示例任務(wù):輸入兩個(gè)正整數(shù)a、b,求兩個(gè)數(shù)的最大公約數(shù)。算法:定義變量a、b、c為正整數(shù)鍵盤(pán)輸入a和bif (ab) if b0 goto ,否則goto ca除b的余數(shù);abbcgoto 輸出公約數(shù)a結(jié)束本任務(wù)主要使用一個(gè)if圖元和while圖元和若干基

17、本語(yǔ)句圖元。通過(guò)圖元裝接和圖元編輯后,所繪制的流程圖,如圖6所示。4 代碼程序自動(dòng)生成(The program code beingautomatically generated)與圖元處理相同,代碼元處理同樣有生成、裝接和編輯等操作。由于代碼元與圖元一一對(duì)應(yīng),圖元處理和代碼元處理同步完成。當(dāng)流程圖繪制完畢時(shí),對(duì)應(yīng)的源程序也生成完畢,處理過(guò)程如圖7所示。為了確保圖元對(duì)象與代碼元對(duì)象一一對(duì)應(yīng),在圖元基類(lèi)和代碼元基類(lèi)中均設(shè)置了一個(gè)友元屬性變量friendObj,分別存儲(chǔ)對(duì)方信息。在圖元基類(lèi)和代碼元基類(lèi)定義的相關(guān)代碼為:public class FC_Control /圖元控件基類(lèi) private

18、CODE_Control friendObj;/圖元友元信息 public class CODE_Control /圖元控件基類(lèi) private FC_Control friendObj;/代碼元友元信息 在圖元和代碼元生成時(shí),相互記錄對(duì)方的信息,仍以圖元while為例:FcWhile w1=new FcWhile(X,Y,F(xiàn)C_image);CodeWhile w2=new CodeWhile(0,0,CODE_image);w1.friend=w2; /friend 是設(shè)置或獲取屬性/變量friendObj值的方法w2.friend=w1;當(dāng)在流程圖中插入圖元對(duì)象w1時(shí),也在程序代碼中插入

19、代碼元對(duì)象w2,同步完成裝接。由流程圖(圖6)同步生成的程序代碼如圖8所示。5 代碼元識(shí)別與流程圖逆生成(The identification of code primitive and the flowchart being produced reverse from the source program)對(duì)于生成的C語(yǔ)言源程序文件,通過(guò)詞法分析器對(duì)關(guān)鍵詞的識(shí)別,生成相應(yīng)的代碼元對(duì)象,并同步生成圖元對(duì)象。再經(jīng)過(guò)圖元裝接,逆向生成流程圖。由于流程圖文件是圖片格式,一旦形成圖片文件,再轉(zhuǎn)換成圖元對(duì)象,比文本識(shí)別要困難得多。通過(guò)程序代碼文本文件閱讀和識(shí)別,生成代碼元對(duì)象,再通過(guò)代碼元生成圖元對(duì)象,

20、然后接裝為流程圖,方便流程圖的保存和修改。流程圖逆向生過(guò)程如圖9所示。代碼元識(shí)別算法如下:void codeRead(string s)if (s=“if”)FcIf o1=new FcIf(X,Y,F(xiàn)C_image);CodeIf o2=new CodeIf(0,0,CODE_image);o1.friend=o2;o2.friend=o1;FC_p.insert(o1);CODE_p.insert(o2);elseif(s=“for”) FcFor o1=new FcFor(X,Y,F(xiàn)C_image);CodeFor o2=new CodeFor(0,0,CODE_image);o1.fr

21、iend=o2;o2.friend=o1;FC_p.insert(o1);CODE_p.insert(o2);elseif(s=“while”)FcWhile o1=new FcWhile (X,Y,F(xiàn)C_image);CodeWhile o2=new CodeWhile(0,0,CODE_image);o1.friend=o2;o2.friend=o1;FC_p.insert(o1);CODE_p.insert(o2);elseif(s=“do”)FcDowhile o1=new Dowhile (X,Y,F(xiàn)C_image);CodeDowhile o2=new Dowhile(0,0,CO

22、DE_image);o1.friend=o2;o2.friend=o1;FC_p.insert(o1);CODE_p.insert(o2);elseif(s=“switch”)FcSwitch o1=new FcSwitch (X,Y,F(xiàn)C_image);CodeSwitch o2=new CodeSwitch(0,0,CODE_image);o1.friend=o2;o2.friend=o1;FC_p.insert(o1);CODE_p.insert(o2);else5 結(jié)論(Conclusion)本文提出了一個(gè)基于圖元裝接的流程圖繪制原型系統(tǒng),用戶可以通過(guò)鼠標(biāo)點(diǎn)擊圖元控件,在繪圖區(qū)域繪制C程序傳統(tǒng)流程圖,并同步生成C語(yǔ)言源程序。所繪制的流程圖以JPG文件格式、源程序以文本格式分別保存到磁盤(pán)。同時(shí)還具有源程序到流程圖逆生成功能,通過(guò)源代碼可以進(jìn)行流程圖二次編輯和修改。今后,我們將完成流程圖手繪草圖的識(shí)別和轉(zhuǎn)換研究,將手工流程圖的圖元,轉(zhuǎn)換為本系統(tǒng)的圖元,裝接后生成機(jī)繪流程圖,再同步生成源程序,提高流程圖的識(shí)別效率。參考文獻(xiàn)(References)1 何驊,諸彬,徐從富.程序流程草圖的存儲(chǔ)表示

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論