999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于圖元裝接模式由程序流程圖自動生成源代碼

2017-01-17 16:56:57許秀林李蘊華
軟件工程 2016年11期

許秀林+李蘊華

摘 要:針對程序流程圖到代碼自動翻譯過程中,通常需要經過代碼優化及二次編程,翻譯效率不高,提出基于圖元裝接模式的流程圖到C語言源程序轉換的解決方案,實現流程圖到源程序的雙向轉換。由圖元同步產生代碼元,通過裝接自動生成程序代碼。所生成的程序代碼無需修改,可直接編譯運行。通過詞法分析,識別并產生代碼元和對應圖元,可逆向生成流程圖。其有效性在原型系統中得到了驗證。

關鍵詞:C語言;流程圖;程序代碼;自動翻譯

中圖分類號:TP311.5 文獻標識碼:A

1 引言(Introduction)

對于程序設計語言初學者來說,通過畫流程圖來學習程序編碼,將程序代碼與直觀的圖形相結合,可以起到事半功倍的學習效果。若用草圖來繪制程序流程圖,并且實現流程圖的自動識別和代碼生成,不僅符合人的思維習慣,也將大大方便程序設計課程的教學,同時也可應用于程序員的快速程序設計和編碼。

目前,國內外很多學者對手繪草圖識別的研究已有較大進展,可較好地識別程序流程圖中的簡單圖元符號。但是對程序流程圖控制結構的判別,以及代碼的自動翻譯的研究較少。程序流程圖到代碼自動生成的流程,通常分為草圖識別和代碼優化兩個階段,當前的研究熱點或技術難點是圖元的識別和翻譯,文獻[1,2]設計了圖元節點存儲結構,在圖元識別的基礎上,提出基于上下文的程序流程草圖自動翻譯算法,實現了在線手繪程序流程草圖到C語言代碼的自動翻譯。但該系統所能判別的基本圖元比較單一,而且在判斷程序流程圖控制結構時,采用棧技術,若用戶采用非習慣性思維畫圖,可能會導致棧頂元素無法正確判別,在一定程度上影響識別結果。文獻[3-5]則是對程序流程圖到代碼的自動生成技術的研究,然而所研究的程序流程圖到代碼的自動生成工具對流程圖有諸多限制,并不是基于標準的程序流程圖。文獻[6]針對標準的程序流程圖,實現程序流程圖到代碼的自動生成,并且對于含有continue/break/return語義的程序流程圖也能夠很好地識別并生成相應的代碼。文獻[7]融合圖形化和文本語言兩種編程方式的優點,提出流程圖與類C語言雙向實時轉換方法:一方面通過遍歷模塊樹并參照功能模塊封裝的庫函數和語句完成流程圖到類C語言的轉換;另一方面采用XML作為中間代碼完成類C語言到流程圖的轉換。文獻[8]實現了程序流程圖的自動生成和實時修改,提高了程序流程圖的設計效率,但沒有實現程序代碼的同步生成。

本文結合上述文獻的研究成果,提出手工草圖→機繪流程圖→C語言源程序轉換的解決方案,目前已實現了機繪流程圖到源程序的雙向轉換,即按照“圖元+裝接”模式繪制流程圖,同步生成程序代碼;或通過本系統生成的源代碼,逆向生成流程圖。

2 圖元與代碼元(The graphics primitive and the code primitive)

2.1 圖元

C語言流程圖有傳統流程圖(FC)、盒圖(N-S)、PAD等。其中傳統流程圖比較直觀、形式化,易于理解。但由于對流程連接線的使用沒有嚴格限制,使流程隨意轉來轉去,缺少規律。特別是傳統流程圖繪制后,修改流程圖需要大量移動流程連接線,非常煩瑣。為此,我們根據C語言程序語句基本結構,將基本圖形和連接線組合,定義了六種圖元(圖1):if圖元、for圖元、while圖元、do-while圖元、switch圖元、基本語句圖元。圖元中菱形為決策圖標,矩形為基本語句圖標,實線為普通連接線,虛線為圖元裝接線。

根據程序語句的基本功能,基本語句圖元又分為文件包含、常量定義、變量定義、鍵盤輸入、屏幕輸出、文件打開、文件關閉、文件輸入、文件輸出、賦值語句,以及其他基本語句(通用語句)等十類。

2.2 代碼元

代碼元是與圖元相對應的程序代碼,分別有if代碼元、for代碼元、while代碼元、do-while代碼元、switch代碼元、基本語句代碼元(表1)。表中的代碼元對應的程序代碼只是其初始狀態,呈現為程序語句的骨架,只有通過進一步處理之后,才能成為一條完整的程序語句。

3 圖元處理與流程圖繪制(Primitive processing and flowchart drawing)

3.1 圖元生成

(1)定義圖元基類

圖元基類包含圖元必備元素和基本操作。必備元素主要有圖元的坐標位置、高度、寬度、圖元文本(含量代碼與注釋)、友元信息、圖元裝接信息、圖元編輯信息等。基本操作有位置移動、大小改變、選擇、取消選擇、插入圖元、刪除圖元、繪制圖元。

public class FC_Control //圖元控件基類

{

private int x,y; //圖元坐標

private int width,height; //圖元寬度與高度

private int wLeft,wRight;//圖元左寬與右寬

private bool selected; //圖元選中標識

private int child_brother;//圖元裝接信息

//1 為左孩子結點,2為右孩子結點,0為兄弟結點,-1為初始值(無效)

private CODE_Control friendObj;//圖元友元信息

public string[] txtCode=new string[11];//圖元文本信息

public string[] txtComment=new string[11];//圖元文本信息

virtual public void moveTo(int x,int y) //移動到新坐標

{

X=x;

Y=y;

}

virtual public void reSize() { } //大小改變操作

virtual public FC_Control select(int x,int y) { return null; }

//選擇操作(已知坐標位置選擇對象)

virtual public bool select(FC_Control obj) { return false; }

//選擇操作(已知對象信息,選擇對象位置)

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,FC_Control obj) { return null; }

//插入操作(已知坐標位置,插入特定對象)

virtual public void insert(FC_Control insertObj,FC_Control indexObj,int index) { }

//插入操作(已知對象信息,插入特定對象)

}

(2)定義圖元類

圖元類是圖元基類的子類,它繼承了基類的所有屬性和方法,同時還具有以下兩個屬性:圖元的孩子對象集和對象數。圖元的孩子對象包括判斷圖標、判斷分支、圖元連接線和圖元裝接線。以while圖元為例,它由1個判斷圖標、2個判斷分支(Y/N)、2條(5段)圖元連接線和1條圖元裝接線,共計9個對象。下面while圖元類屬性定義及其構造方法:

public class FcWhile : FC_Control //while圖元類

{

public int numOfObject=9; //組成圖元的對象數

public FC_Control[] N=new FC_Control[9]; //組成圖元的對象集

public image;//畫布

public FcWhile(int x,int y,FC_image )

{

X=x;

Y=y;

image=FC_image;

bool arrow=true;

int defaultWidth=50;

int defaultHeight=50;

N[0]=new FcJudge(X,Y,FC_image);//判斷圖標

N[1]=new FcJudgeBranch(N[0].X,N[0].Y+N[0].H,FC_image,true,LINEWAY.DOWN);//判斷Y分支

N[2]=new FcCodingLine(N[1].X,N[1].Y+N[1].H,LINE_TYPE.CODINGLINE_IN_FUNCTION,FC_image);//圖元裝接線

N[3]=new FcLine(N[2].X,N[2].Y+N[2].H,LINEWAY.LEFT,!arrow,LINE_TYPE.NOTCODINGLINE,FC_image);//(左下端)向左連接線

N[3].W=defaultWidth;

N[4]=new FcLine(N[3].X-N[3].W,N[3].Y,LINEWAY.UP,!arrow,LINE_TYPE.NOTCODINGLINE,FC_image);//(左邊)向上連接線

N[4].H=N[1].H+N[2].H+N[0].H/2;

N[5]=new FcLine(N[4].X,N[4].Y-N[4].H,LINEWAY.RIGHT,arrow,LINE_TYPE.NOTCODINGLINE,FC_image);//(左上端)向右帶箭頭連接線

N[5].W=N[3].W-N[0].WL;

N[6]=new FcJudgeBranch(N[0].X+N[0].WR,N[0].Y+N[0].H/2,FC_image,false,LINEWAY.RIGHT);//判斷N分支

N[7]=new FcLine(N[6].X+N[6].W,N[6].Y,LINEWAY.DOWN,!arrow,LINE_TYPE.NOTCODINGLINE,FC_image);//(右邊)向下連接線

N[7].H=N[4].H+defaultHeight;

N[8]=new FcLine(N[7].X,N[7].Y+N[7].H,LINEWAY.LEFT,arrow,LINE_TYPE.NOTCODINGLINE,FC_image);//(右下端)帶箭頭連接線

N[8].W=N[6].W+N[0].WR;

WR=N[8].W;

WL=N[3].W;

W=WL+WR;//計算圖元寬度

H=N[0].H/2+N[7].H;//計算圖元高度

txtCode[0]="";

txtComment[0]="";

}

……

}

(3)生成圖元對象

當用戶通過菜單項或圖標工具插入某個圖元時,生成該圖元對象。同樣以while圖元為例,在插入while圖元方法中生成圖元對象。

public void insert_While(int x,int y)

{

int X,Y;

X=x;

Y=y;

FcWhile w=new FcWhile(X,Y,FC_image); //生成while圖元對象

… …

}

3.2 圖元裝接

圖元裝接是將圖元對象按指定的坐標位置插入到圖元裝接線上。圖2是流程圖的初始畫面,從開始到結束之間,是由兩條裝接線組成。上端黃色裝接線用于插入帶#的圖元對象,下端藍色裝接線用于插入其他圖元對象。圖元裝接根據裝接對象的位置關系分為順序裝接和嵌入裝接兩類:對于某個已裝接的圖元對象A,當待裝接的圖元對象B與圖元對象處于同一條裝接線,則為順序裝接如圖3(a)所示;當圖元對象B處于圖元對象A內部的裝接線時,則屬于嵌入裝接如圖3(b)所示。

3.3 圖元文本編輯

圖元裝接只是決定了了流程圖的流程走向,程序功能則需要通過圖元文本編輯,確定每個圖元的具體功能。現以while圖元為例,說明圖元文本編輯的過程。while圖元的文本編輯,主要是while循環條件表達式的編輯。先選中while圖元,然后打開該圖元的屬性頁進行相關的文字編輯,如圖4所示。編輯后的while圖元在左上方添加了條件表達式,如圖5所示。

3.4 示例

任務:輸入兩個正整數a、b,求兩個數的最大公約數。

算法:

①定義變量a、b、c為正整數

②鍵盤輸入a和b

③if (a

④if b≠0 goto ④,否則goto ⑧

⑤c←a除b的余數;

⑥a←b

⑦b←c

⑧goto ④

⑨輸出公約數a

⑩結束

本任務主要使用一個if圖元和while圖元和若干基本語句圖元。通過圖元裝接和圖元編輯后,所繪制的流程圖,如圖6所示。

4 代碼程序自動生成(The program code beingautomatically generated)

與圖元處理相同,代碼元處理同樣有生成、裝接和編輯等操作。由于代碼元與圖元一一對應,圖元處理和代碼元處理同步完成。當流程圖繪制完畢時,對應的源程序也生成完畢,處理過程如圖7所示。

為了確保圖元對象與代碼元對象一一對應,在圖元基類和代碼元基類中均設置了一個友元屬性變量friendObj,分別存儲對方信息。在圖元基類和代碼元基類定義的相關代碼為:

public class FC_Control //圖元控件基類

{

… …

private CODE_Control friendObj;//圖元友元信息

… …

}

public class CODE_Control //圖元控件基類

{

… …

private FC_Control friendObj;//代碼元友元信息

… …

}

在圖元和代碼元生成時,相互記錄對方的信息,仍以圖元while為例:

FcWhile w1=new FcWhile(X,Y,FC_image);

CodeWhile w2=new CodeWhile(0,0,CODE_image);

w1.friend=w2; //friend 是設置或獲取屬性

//變量friendObj值的方法

w2.friend=w1;

當在流程圖中插入圖元對象w1時,也在程序代碼中插入代碼元對象w2,同步完成裝接。由流程圖(圖6)同步生成的程序代碼如圖8所示。

5 代碼元識別與流程圖逆生成(The identification of code primitive and the flowchart being produced reverse from the source program)

對于生成的C語言源程序文件,通過詞法分析器對關鍵詞的識別,生成相應的代碼元對象,并同步生成圖元對象。再經過圖元裝接,逆向生成流程圖。由于流程圖文件是圖片格式,一旦形成圖片文件,再轉換成圖元對象,比文本識別要困難得多。通過程序代碼文本文件閱讀和識別,生成代碼元對象,再通過代碼元生成圖元對象,然后接裝為流程圖,方便流程圖的保存和修改。流程圖逆向生過程如圖9所示。

代碼元識別算法如下:

void codeRead(string s)

{

if (s==“if”)

{

FcIf o1=new FcIf(X,Y,FC_image);

CodeIf o2=new CodeIf(0,0,CODE_image);

o1.friend=o2;

o2.friend=o1;

FC_p.insert(o1);

CODE_p.insert(o2);

}

else

if(s==“for”)

{

FcFor o1=new FcFor(X,Y,FC_image);

CodeFor o2=new CodeFor(0,0,CODE_image);

o1.friend=o2;

o2.friend=o1;

FC_p.insert(o1);

CODE_p.insert(o2);

}

else

if(s==“while”)

{

FcWhile o1=new FcWhile (X,Y,FC_image);

CodeWhile o2=new CodeWhile(0,0,CODE_image);

o1.friend=o2;

o2.friend=o1;

FC_p.insert(o1);

CODE_p.insert(o2);

}

else

if(s==“do”)

{

FcDowhile o1=new Dowhile (X,Y,FC_image);

CodeDowhile o2=new Dowhile(0,0,CODE_image);

o1.friend=o2;

o2.friend=o1;

FC_p.insert(o1);

CODE_p.insert(o2);

}

else

if(s==“switch”)

{

FcSwitch o1=new FcSwitch (X,Y,FC_image);

CodeSwitch o2=new CodeSwitch(0,0,CODE_image);

o1.friend=o2;

o2.friend=o1;

FC_p.insert(o1);

CODE_p.insert(o2);

}

else

}

5 結論(Conclusion)

本文提出了一個基于圖元裝接的流程圖繪制原型系統,用戶可以通過鼠標點擊圖元控件,在繪圖區域繪制C程序傳統流程圖,并同步生成C語言源程序。所繪制的流程圖以JPG文件格式、源程序以文本格式分別保存到磁盤。同時還具有源程序到流程圖逆生成功能,通過源代碼可以進行流程圖二次編輯和修改。今后,我們將完成流程圖手繪草圖的識別和轉換研究,將手工流程圖的圖元,轉換為本系統的圖元,裝接后生成機繪流程圖,再同步生成源程序,提高流程圖的識別效率。

參考文獻(References)

[1] 何驊,諸彬,徐從富.程序流程草圖的存儲表示及自動翻譯算法[J].計算機系統應用,2009,18(4):57-60.

[2] 諸彬,何驊,徐從富.基于草圖的程序流程圖自動識別翻譯系統[J].計算機應用與軟件,2010,27(5):55-56.

[3] Martin C C,et al.RAPTOR:Introducing Programming to Non-Majors with Flowcharts[J].Journal of Computing Science in Colleges,2004,19(4):52-60.

[4] Kains C Somkiat W.Visual Programming Using Flowchart[C].Communications and information Technologies.Bangkok:ISCIT'06 2006:1062-1065.

[5] Drazen L,Ivan F.A.Visual Programming Language for Drawing and Executing Flowcharts[C].Proc of the 34th international Convention.Opatija:IEEE,2011:1679-1684.

[6] 王黎明,等.程序流程圖到代碼的自動生成算法[J].西安電子科技大學學報(自然科學版),2012,39(6):70-77.

[7] 鐘志超,等.流程圖與類C語言實時轉換方法[J].東南大學學報(自然科學版),2009,39(3):503-507.

[8] 才忠勝,等.流程圖的自動生成系統[J].計算機系統應用,2013,22(12):43-46.

作者介紹:

許秀林(1965-),男,碩士,教授.研究領域:軟件工程,智能算法.

李蘊華(1965-),女,碩士,副教授.研究領域:圖像處理,信號系統.

主站蜘蛛池模板: 亚洲精品麻豆| 色天堂无毒不卡| 日韩在线中文| 精品自拍视频在线观看| 真实国产乱子伦视频| 欧美一级黄色影院| 日韩AV无码一区| 四虎永久在线精品国产免费| 国产成人精品在线1区| 精品视频在线一区| 97视频精品全国免费观看| 热九九精品| 91亚瑟视频| 99久久精彩视频| 极品国产在线| 91啦中文字幕| 亚洲一区波多野结衣二区三区| 色有码无码视频| 色哟哟国产精品| 性欧美久久| 国产一区二区网站| 国产女同自拍视频| 午夜在线不卡| 国产91丝袜在线播放动漫| 久久精品国产999大香线焦| 国产精品永久久久久| 国产人成乱码视频免费观看| 久久人搡人人玩人妻精品一| 黄色网页在线播放| 在线免费看黄的网站| 国产欧美专区在线观看| 亚洲国产在一区二区三区| 都市激情亚洲综合久久| 免费无码AV片在线观看国产| 中文纯内无码H| 婷五月综合| 国产三级a| 亚洲不卡无码av中文字幕| 五月天久久综合| 欧美第一页在线| 综合色在线| 欧美色图第一页| 2019年国产精品自拍不卡| 伊人久久大线影院首页| 日本人又色又爽的视频| 欧洲亚洲一区| 色综合五月婷婷| 日韩无码精品人妻| 91高清在线视频| 啪啪免费视频一区二区| 国产麻豆精品久久一二三| 成人va亚洲va欧美天堂| 欧美69视频在线| 国产日本欧美亚洲精品视| 毛片视频网| 欧美三级日韩三级| 青青草原国产av福利网站| 91在线精品免费免费播放| 亚洲色图另类| a级毛片免费看| 国产精品30p| 在线视频一区二区三区不卡| 91热爆在线| 在线看片国产| 国产真实乱子伦视频播放| 中文国产成人久久精品小说| 国产激爽爽爽大片在线观看| 亚洲国产精品不卡在线| 伊人色综合久久天天| 在线人成精品免费视频| julia中文字幕久久亚洲| 免费国产黄线在线观看| 中国一级毛片免费观看| 四虎永久免费在线| A级毛片无码久久精品免费| 国产精品久久久久久久伊一| 国产成人一二三| 免费毛片全部不收费的| 天天躁狠狠躁| 中文字幕永久在线观看| 18黑白丝水手服自慰喷水网站| 国产精品xxx|