九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告

上傳人:1888****888 文檔編號(hào):39703536 上傳時(shí)間:2021-11-11 格式:DOC 頁(yè)數(shù):46 大小:368.52KB
收藏 版權(quán)申訴 舉報(bào) 下載
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告_第1頁(yè)
第1頁(yè) / 共46頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告_第2頁(yè)
第2頁(yè) / 共46頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告_第3頁(yè)
第3頁(yè) / 共46頁(yè)

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告》由會(huì)員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(46頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、計(jì)算機(jī)與信息學(xué)院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告專 業(yè) 班 級(jí)計(jì)算機(jī)074班學(xué)生姓名及學(xué)號(hào)課程教學(xué)班號(hào)0002任 課 教 師實(shí)驗(yàn)指導(dǎo)教師實(shí)驗(yàn)地點(diǎn)2008 2009 學(xué)年第 二 學(xué)期題目1:設(shè)計(jì)程序完成如下功能:對(duì)給定的圖結(jié)構(gòu),用Kruskal算法的基本思想求解圖的最小生成樹(shù),并給出動(dòng)態(tài)演示過(guò)程題目2:設(shè)計(jì)一個(gè)模擬計(jì)算器的程序,要求能包含加、減、乘、除、括號(hào)運(yùn)算符,以及SQRT和ABS對(duì)任意整型表達(dá)式進(jìn)行求解。 要求:要檢測(cè)運(yùn)算執(zhí)行的條件并給出錯(cuò)誤警報(bào) 一、動(dòng)態(tài)演示Kruskal算法1、題目分析及建立模型在圖的算法中,求最小生成樹(shù)有著十分重要的理論和現(xiàn)實(shí)意義,二Kruskal算法正是求解這一問(wèn)題的經(jīng)典算

2、法。Kruskal算法的主要思想即是通過(guò)不斷地尋求滿足一定條件(即所選邊不能構(gòu)成環(huán))的最小權(quán)值的邊,直至找出圖的最小生成樹(shù)為止。為了能夠動(dòng)態(tài)地演示Kruskal算法求解最小生成樹(shù)的過(guò)程,首先的問(wèn)題是如何動(dòng)態(tài)的建立一個(gè)圖,然后的問(wèn)題才是怎樣動(dòng)態(tài)地演示Kruskal算法。所以為了解決這個(gè)問(wèn)題,我從這兩個(gè)方面逐一入手進(jìn)行求解,利用MFC的知識(shí)進(jìn)行演示。2、算法的設(shè)計(jì)與具體的設(shè)計(jì)思路A、程序界面的設(shè)計(jì) 首先為了建立一個(gè)圖,需要知道一個(gè)圖的節(jié)點(diǎn)數(shù),由于界面有限,這里將節(jié)點(diǎn)數(shù)限制在8以內(nèi)(包括8),超出8個(gè)將會(huì)給出提示。所以在程序界面中必須有圖節(jié)點(diǎn)數(shù)目的輸入,這里設(shè)計(jì)了一個(gè)編輯框用于輸入圖的節(jié)點(diǎn)數(shù)目。另外

3、,一個(gè)完整的圖還必須有一定的邊信息,包括邊的起始端點(diǎn)和權(quán)值,以便求解最小生成樹(shù)。而這些信息完全是由用戶確定的,并且由用戶輸入的圖的節(jié)點(diǎn)數(shù)確定。這里在用于輸入節(jié)點(diǎn)數(shù)的編輯框下設(shè)置兩個(gè)列表框和一個(gè)編輯框分別用于邊的起始端點(diǎn)和權(quán)值的輸入。另外,為了使節(jié)點(diǎn)數(shù)和邊信息產(chǎn)生關(guān)聯(lián),這里又設(shè)置了一個(gè)“應(yīng)用”按鈕,為了將邊信息與圖相關(guān)聯(lián),又設(shè)置了一個(gè)“增加邊”按鈕,最后還有一個(gè)“動(dòng)態(tài)演示Kruskal算法”的操作按鈕以及一個(gè)退出按鈕。此外,在界面的右端設(shè)置一個(gè)圖形演示區(qū),已進(jìn)行動(dòng)態(tài)演示。完整的程序界面如下:B、按鈕響應(yīng)函數(shù)的設(shè)計(jì) 在上述界面中有三個(gè)主要按鈕,分別是“應(yīng)用”“增加邊”以及“動(dòng)態(tài)演示Kruskal算

4、法,下面分別設(shè)計(jì)其響應(yīng)函數(shù) “應(yīng)用”按鈕的主要作用是把圖的節(jié)點(diǎn)數(shù)和邊信息和圖相關(guān)聯(lián)。用戶在編輯框m_vexnum中輸入結(jié)點(diǎn),然后點(diǎn)擊“應(yīng)用”按鈕后,在兩個(gè)列表框m_Start和m_End中自動(dòng)添加n各結(jié)點(diǎn),同時(shí)在演示區(qū)中畫(huà)出n個(gè)節(jié)點(diǎn),如下所示:為了關(guān)聯(lián)相關(guān)信息,在CsmileGraph1Dlg中增加如下變量:Graph graph; int vexnum;在按鈕的響應(yīng)函數(shù)OnApply()中完成如下功能,一是在初始化圖graph:/初始化一個(gè)圖graph.graph_vexnum = 0;for(int j = 0; j 8; j+)graph.data j = (char)(A+j);for

5、(int i = 0; i 8; i+)for(int j = 0; j 8; j+)graph.AdjMatrix ij = graph.AdjMatrix ji =INF;二是將編輯框中的內(nèi)容與圖和列表框關(guān)聯(lián)起來(lái)同時(shí)在演示區(qū)中繪制n個(gè)節(jié)點(diǎn),如下所示:/輸入圖的節(jié)點(diǎn)數(shù)CString s ;m_vexnum.GetWindowText (s);int v_num = (int)atoi(s); /添加圖的相關(guān)參數(shù)graph.graph_vexnum = v_num;for(int t = 0; t graph.graph_vexnum ; t+)graph.data t = (char)(A+

6、t);if(v_num0) Draw(v_num);else if(v_num8)MessageBox(請(qǐng)輸入1到8之間的一個(gè)數(shù)!);elseMessageBox(你還沒(méi)有輸入結(jié)點(diǎn)數(shù)!);m_Start.ResetContent();m_End.ResetContent ();for(int k = 0; k v_num; k+)m_Start.AddString (VexNodek);m_End.AddString (VexNodek);為了在演示區(qū)中繪制n個(gè)結(jié)點(diǎn),在OnApply函數(shù)中調(diào)用函數(shù)Draw(v_num);在函數(shù)Draw(int n)中繪制n個(gè)節(jié)點(diǎn),為了限制結(jié)點(diǎn)個(gè)數(shù),在演示區(qū)中固

7、定了8個(gè)點(diǎn)供演示。這8個(gè)點(diǎn)的組成形式如下:將這8個(gè)點(diǎn)保存在Point數(shù)組point中,同時(shí)以這8個(gè)點(diǎn)為中心作8個(gè)矩形Rect rcDraw8保存圖的結(jié)點(diǎn)的外接矩形,并根據(jù)m_vexnum的大小利用MFC繪圖函數(shù)繪制m_vexnum內(nèi)切圓作為圖的結(jié)點(diǎn)?!霸黾舆叀卑粹o的主要功能是輸入圖的邊信息并與圖關(guān)聯(lián)起來(lái),為此在CsmileGraph1Dlg類中增加變量Edge edge56用于保存用戶輸入的邊信息。用戶通過(guò)兩個(gè)列表框選擇一條邊的兩個(gè)端點(diǎn)并把其權(quán)值輸入到下面的編輯框中,然后單擊“增加邊”按鈕即可完成:在演示區(qū)中繪制一條邊并顯示其權(quán)值,修改圖graph的邊信息,即改變其鄰接矩陣值。這里規(guī)定:兩次輸

8、入同一條邊、輸入的結(jié)點(diǎn)不存在、結(jié)點(diǎn)相同均視為無(wú)效,并給出提示,演示如下: 無(wú)效輸入一、一條邊的兩個(gè)端點(diǎn)相同 無(wú)效輸入二、輸入邊已經(jīng)存在正常情況下可得到如下所示的圖:以上效果均通過(guò)按鈕的響應(yīng)函數(shù)OnAddEdge()來(lái)實(shí)現(xiàn):int start,end;/保存一條邊的兩個(gè)端點(diǎn)start = m_Start.GetCurSel (); end = m_End.GetCurSel (); CString val ; m_Value.GetWindowText (val);/獲取權(quán)值 int value = atoi(val); /處理特殊情況 if(graph.AdjMatrixstartend!=I

9、NF) MessageBox(改邊已經(jīng)存在); else if(start=LB_ERR|end=LB_ERR) MessageBox(結(jié)點(diǎn)不存在!); else if(start=end) MessageBox(起始端點(diǎn)不應(yīng)為同一結(jié)點(diǎn)!); else /增加圖的邊 edgeedge_num.start = start; edgeedge_num.end = end; edgeedge_num.val = value; edge_num+;/邊數(shù)/修改圖的鄰接矩陣 graph.AdjMatrix startend = graph.AdjMatrix endstart = value; Draw

10、Edge(start,end,val);/繪制兩個(gè)端點(diǎn)分別為start和/end,權(quán)值為val的邊 在OnAddEdge()函數(shù)中調(diào)用了一個(gè)繪制邊的函數(shù)DrawEdge(int,int,int),三個(gè)參數(shù)分別表示新增邊的起始端點(diǎn)序號(hào)和權(quán)值,這里成為“起始端點(diǎn)”只是表述方便,實(shí)際上所建立的是無(wú)向圖。而在函數(shù)DrawEdge中,主要利用了MFC的繪圖函數(shù)Ellipse()、LineTo()、TextOut()等,具體實(shí)現(xiàn)細(xì)節(jié)請(qǐng)見(jiàn)源碼,這里不再贅述?!皠?dòng)態(tài)演示Kruskal算法”的響應(yīng)函數(shù)為本題的核心,Kruskal算法的實(shí)現(xiàn)在此。這里先說(shuō)明一下此按鈕的功能:用戶按下此按鈕后,將在演示區(qū)中動(dòng)態(tài)的尋求

11、最小權(quán)值的邊并用差異顏色重畫(huà)以達(dá)到突出的目的,依次找出所有的符合條件的邊后,擦除其他邊只顯示最小生成樹(shù)的各邊,具體過(guò)程如下:圖1、動(dòng)態(tài)尋找過(guò)程 圖2、最終結(jié)果 下面介紹一下Kruskal算法的實(shí)現(xiàn)思想,因?yàn)镵ruskal算法是不斷的從圖的邊中尋求權(quán)值最小的邊,所以首先對(duì)圖的所有邊按權(quán)值進(jìn)行排序,這里使用快速排序,因此在CsmileGraph1Dlg中又增加了兩個(gè)成員函數(shù)partition()和qiuck_sort()來(lái)實(shí)現(xiàn)數(shù)組edge的排序工作。接下來(lái)就是不斷的從排好序邊中依次選取滿足條件的邊。這里滿足的【條件】是指所選邊和之前所選邊不能構(gòu)成環(huán)。為此,特設(shè)置兩個(gè)標(biāo)志數(shù)組visited和is_m

12、in_tree分別標(biāo)記結(jié)點(diǎn)和邊是否已被選中。如果visitedi = visitedj或者is_min_treei,j=true說(shuō)明再選取邊(i,j)即會(huì)構(gòu)成環(huán),應(yīng)當(dāng)舍棄,繼續(xù)往下尋找,直至找出含有n的節(jié)點(diǎn)的n-1個(gè)最小生成樹(shù)的n-1條邊,這里需要進(jìn)行n-1趟循環(huán)。3、程序?qū)崿F(xiàn)A、圖的實(shí)現(xiàn) 本題采用鄰接矩陣存儲(chǔ)圖,定義一個(gè)Graph和Edge結(jié)構(gòu)體分別保存圖的具體信息和邊信息。定義如下:struct EdgeNodeint start;/起點(diǎn)int end;/終點(diǎn)int val;/權(quán)值;struct Graphint AdjMatrix88;/鄰接矩陣char data8;/節(jié)點(diǎn)值int gr

13、aph_vexnum;/節(jié)點(diǎn)數(shù);B、排序的實(shí)現(xiàn)void CSmileGraph1Dlg:partition(EdgeNode *edge, int s, int t, int &cutpoint) EdgeNode tmp; tmp.start = edges.start ; tmp.end = edges.end;tmp.val = edges.val ; int i = s; int j = t; while(ij) while(i edgei.val) j-; if(ij) edgei.start = edgej.start; edgei.end = edgej.end;edgei.va

14、l = edgej.val;i+; while(ij&edgei.val edgej.val) i+; if(ij) edgej.start = edgei.start; edgej.end = edgei.end;edgej.val = edgei.val;j-; edgei.start = tmp.start; edgei.end = tmp.end;edgei.val = tmp.val;cutpoint = i; void CSmileGraph1Dlg:quick_sort(EdgeNode *edge, int s, int t)if(st)int i;partition(edge

15、,s,t,i);/取得劃分點(diǎn)quick_sort(edge,s,i-1);/對(duì)左半部分進(jìn)行快速排序quick_sort(edge,i+1,t);/對(duì)右半部分進(jìn)行快速排序C、Kruskal算法的實(shí)現(xiàn)/把圖的邊按照權(quán)值大小排序quick_sort(edge,0,edge_num-1);int visited8 ;/標(biāo)記每一條支邊的端點(diǎn)以判斷是否形成回路for(i=0;i8;i+)visitedi = i;/初始化int min = INF;int min_start,min_end;/標(biāo)志數(shù)組判斷某一邊是否為最小生成樹(shù)的一支bool is_min_tree88;/標(biāo)記一條邊是否被選中for(min

16、_start = 0; min_start8 ; min_start+)for(min_end = 0; min_end8 ; min_end+)is_min_treemin_startmin_end = is_min_treemin_endmin_start = false;/初始化 int count = 0;/Kruskal算法演示1: 排序法for(int s = 0; s graph.graph_vexnum - 1; s+)if(countedge_num) int m = edgecount.start; int n = edgecount.end;while(visitedm=

17、visitedn)/找不能構(gòu)成環(huán)的邊 count+; m = edgecount.start; n = edgecount.end;/如果邊不能構(gòu)成環(huán),則記錄并繪制改邊if(visitedm!=visitedn&!is_min_treemn&!is_min_treenm) min_start = m; min_end = n; min = edgecount.val; count+; for(int k = 0; k graph.graph_vexnum; k+)if(visitedk=visitedmin_end|visitedk=min_end)visitedk = visitedmin_

18、start;/為選中結(jié)點(diǎn)做標(biāo)記is_min_treemin_startmin_end = is_min_treemin_endmin_start = true;/未選中邊做標(biāo)記/循環(huán)結(jié)束,找到n-1條邊4、總結(jié) 本題主要利用VC+實(shí)現(xiàn)Kruskal算法的動(dòng)態(tài)演示,其中不斷的使用MFC的繪圖函數(shù)。對(duì)于圖的存儲(chǔ),此處使用了鄰接矩陣的結(jié)構(gòu)。Kruskal算法是一個(gè)經(jīng)典的算法,通過(guò)此次課程設(shè)計(jì),加深了對(duì)這一算法的理解和認(rèn)識(shí)。二、計(jì)算器的實(shí)現(xiàn)1、分析與建模 計(jì)算器的實(shí)現(xiàn)是一個(gè)經(jīng)典的應(yīng)用,可以應(yīng)用到許多知識(shí)上,如棧、二叉樹(shù)等。本題中采用棧來(lái)實(shí)現(xiàn)。一個(gè)數(shù)字計(jì)算器要能夠完成數(shù)學(xué)表達(dá)式的求值,而一個(gè)數(shù)學(xué)表達(dá)式包

19、含數(shù)值和操作符兩部分,這里就需要設(shè)置兩個(gè)棧來(lái)保存數(shù)據(jù)和運(yùn)算符,分別記為數(shù)據(jù)棧和操作符棧。然后通過(guò)棧的常用操作來(lái)實(shí)現(xiàn)表達(dá)式的求值運(yùn)算。同時(shí),要對(duì)一個(gè)數(shù)學(xué)表達(dá)式進(jìn)行求值還需要規(guī)定一定的運(yùn)算規(guī)則,主要是運(yùn)算符的優(yōu)先級(jí),因?yàn)檫@決定了表達(dá)式的計(jì)算次序。2、設(shè)計(jì)的具體思路A、界面的設(shè)計(jì)依據(jù)題目要求,需要對(duì)表達(dá)式進(jìn)行求值。首先需要設(shè)計(jì)一個(gè)“窗口“讓用戶輸入表達(dá)式并輸出計(jì)算結(jié)果,因此在界面上設(shè)計(jì)一個(gè)m_result編輯框?qū)崿F(xiàn)此功能。此外,還需要設(shè)計(jì)0-9個(gè)數(shù)字按鈕,還有+ - * / sqrt和abs幾個(gè)運(yùn)算符按鈕以及左右括號(hào)外加一個(gè)=按鈕。為了能夠動(dòng)態(tài)地顯示計(jì)算過(guò)程,這里又設(shè)置了一個(gè)演示區(qū)用于演示表達(dá)式的計(jì)

20、算過(guò)程,即數(shù)據(jù)和操作符入棧和出棧的過(guò)程。另外,在界面中增加兩個(gè)按鈕分別表示作者信息和使用說(shuō)明及注意事項(xiàng)。最后,設(shè)置clear和(*,/,)(+,-)#,同一級(jí)別的運(yùn)算符按照從左到右結(jié)合。此外,規(guī)定左括號(hào)優(yōu)先級(jí)最高,可直接入棧,而遇到右括號(hào)則需要計(jì)算表達(dá)式的值直至遇到左括號(hào)。 數(shù)學(xué)表達(dá)式中的異常一般包括:除法運(yùn)算時(shí)除數(shù)為0、左右括號(hào)不匹配、冪運(yùn)算底數(shù)為零、開(kāi)方運(yùn)算底數(shù)為負(fù);程序需要對(duì)這些異常進(jìn)行處理,一般輸出提示。D、表達(dá)式的運(yùn)算 對(duì)于用戶輸入的表達(dá)式采用字符數(shù)組的結(jié)構(gòu)來(lái)保存,因此在CcalucatorDlg中增加變量express用于保存表達(dá)式,同時(shí)設(shè)計(jì)一個(gè)計(jì)數(shù)器count用于記錄表達(dá)式計(jì)算的

21、進(jìn)程。然后利用double result(cahr*)進(jìn)行計(jì)算。函數(shù)中的參數(shù)即為表達(dá)式的字符數(shù)組,計(jì)算后返回double值。同時(shí)在函數(shù)result中用調(diào)用了CcalculatorDlg的兩個(gè)成員函數(shù)is_digit()、priority()和cal()分別用來(lái)判斷一個(gè)字符是否是數(shù)字或者小數(shù)點(diǎn)、定義運(yùn)算符的優(yōu)先級(jí)、計(jì)算定義操作符的運(yùn)算,并分別返回bool、int、double。而在函數(shù)result中主要是從字符數(shù)組的起始端開(kāi)始計(jì)算直至遇到結(jié)束標(biāo)志,對(duì)于不同的字符元素有不同的計(jì)算原則,如下: 如果為數(shù)字直接壓入數(shù)據(jù)棧; 如果為左括號(hào)則直接壓入運(yùn)算符棧 如果遇到右括號(hào),則不斷地對(duì)兩個(gè)棧進(jìn)行運(yùn)算直到遇

22、到第一個(gè)左括號(hào),同時(shí)彈出遇到的第一個(gè)左括號(hào):如果遇到的是雙目運(yùn)算符則連續(xù)從數(shù)據(jù)棧中取出兩個(gè)數(shù); 如果遇到的是單目操作符則只彈出一個(gè)數(shù)據(jù) 如果運(yùn)算符棧頂是左括號(hào)則無(wú)論是數(shù)據(jù)還是操作符都對(duì)應(yīng)壓入數(shù)據(jù)棧和操作符棧 如果當(dāng)前操作符的優(yōu)先級(jí)較高則直接壓入運(yùn)算符棧 如果當(dāng)前操作符的優(yōu)先級(jí)低于運(yùn)算符棧頂?shù)牟僮鞣麆t取出棧頂運(yùn)算符進(jìn)行運(yùn)算直至當(dāng)前運(yùn)算符的優(yōu)先級(jí)高于棧頂運(yùn)算符為止 遇到表達(dá)式數(shù)組中的結(jié)束標(biāo)志#,進(jìn)行剩余計(jì)算 另外,將用戶輸入的表達(dá)式字符數(shù)組初始化為全為#.同時(shí),在進(jìn)行計(jì)算的時(shí)候?qū)崟r(shí)地利用MFC繪圖函數(shù)將數(shù)據(jù)和操作符出入棧的情形繪制出來(lái),已達(dá)到動(dòng)態(tài)演示的目的。3、程序?qū)崿F(xiàn) 在具體的程序?qū)崿F(xiàn)中,主要進(jìn)

23、行的是表達(dá)式求值算法的實(shí)現(xiàn)。因?yàn)槭抢脳?lái)進(jìn)行運(yùn)算,所以需要定義兩個(gè)棧分別為數(shù)據(jù)棧和操作符棧。/聲明浮點(diǎn)型堆棧class stack_doublepublic:stack_double();bool is_empty()const;bool is_full()const;double get_top()const;void push(const double& x);void pop();private:double dataMAX_LEN1;int top;class stack_charpublic:stack_char();bool is_empty()const;bool is_ful

24、l()const;char get_top()const;void push(const char& x);void pop();private:char dataMAX_LEN1;int top;下面需要實(shí)現(xiàn)的是優(yōu)先級(jí)的定義和result函數(shù)的實(shí)現(xiàn):/定義各運(yùn)算符的優(yōu)先級(jí)int CCalculatorDlg:cal_level(char op1, char op2)if(op1=+|op1=-)if(op2=*|op2=/|op2=A|op2=S|op2=)return -1;else if(op2=#|op2=()return 1;elsereturn 0;else if(op1=*|op

25、1=/)if(op2=+|op2=-|op2=#|op2=()return 1;else if(op2=|op2=A|op2=S)return -1;elsereturn 0;else if(op1=|op1=A|op1=S)if(op2=+|op2=-|op2=*|op2=/|op2=#|op2=()return 1;elsereturn 0;else if(op1=#)return -1;/判斷一個(gè)字符是否為數(shù)字bool CCalculatorDlg:is_digit(char ch)if(ch=0&chUpdateWindow ();/避免系統(tǒng)自動(dòng)更新窗口CDC* pDC = pWnd-

26、GetDC ();/獲得所需繪圖設(shè)備環(huán)境/CBrush b(pDC-GetBkColor();/獲取原有區(qū)域背景CPen* pOldPen;CPen pNewPen(PS_SOLID,2,RGB(255,34,67);pOldPen = pDC-SelectObject (&pNewPen);CRect rcClient;pWnd-GetClientRect (rcClient);CPoint p1 = rcClient.TopLeft ();CPoint p2 = rcClient.BottomRight ();/pDC-FillRect(&rcClient,&b);/清除原有圖形int p

27、x_topleft = p1.x;int py_topleft = p1.y ;int px_bottomright = p2.x ;int py_bottomright = p2.y ;CBrush b(pDC-GetBkColor();/獲取原有區(qū)域背景pDC-FillRect(&rcClient,&b);/清除原有圖形/繪制數(shù)據(jù)棧int num_x = px_topleft+130;int num_y = py_bottomright-75; pDC-MoveTo (px_topleft+100,py_bottomright-75);pDC-LineTo (px_topleft+200,

28、py_bottomright-75);pDC-MoveTo (px_topleft+200,py_bottomright-75);pDC-LineTo (px_topleft+200,py_topleft+100);pDC-MoveTo (px_topleft+100,py_bottomright-75); pDC-LineTo (px_topleft+100,py_topleft+100);pDC-TextOut (px_topleft+125,py_bottomright-60,數(shù)據(jù)棧);/繪制運(yùn)算符棧int op_x = px_topleft+330;int op_y = py_bott

29、omright-75; pDC-MoveTo (px_topleft+300,py_bottomright-75);pDC-LineTo (px_topleft+400,py_bottomright-75);pDC-MoveTo (px_topleft+400,py_bottomright-75);pDC-LineTo (px_topleft+400,py_topleft+100);pDC-MoveTo (px_topleft+300,py_bottomright-75); pDC-LineTo (px_topleft+300,py_topleft+100);pDC-TextOut (px_t

30、opleft+315,py_bottomright-60,運(yùn)算符棧); stack_double num; stack_char oper; num.push (0); pDC-TextOut (num_x,num_y-25*num_count,0); num_count+; Sleep(2000); oper.push (#); pDC-TextOut (op_x,op_y-25*op_count,#); op_count+; Sleep(2000); int i = 0; while(unsolvedi!=#) /如果為數(shù)字直接壓入數(shù)據(jù)棧 if(is_digit(unsolvedi) CS

31、tring tm; tm.Empty(); int n = 0; int temp = i; while(is_digit(unsolvedi) n+; i+; for(int xx = 0; xx TextOut (num_x,num_y-25*num_count,s); num_count+; CString tt; tt.Format(%0.3f,num.get_top(); tt += 入棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); /i+; continue; /如果為左括號(hào)則直接壓入運(yùn)算符棧 else

32、if(unsolvedi=() oper.push(); pDC-TextOut (op_x,op_y-25*op_count,(); op_count+; pDC-TextOut(px_topleft+450,py_topleft+50,( 入棧 ); Sleep(2000); i+; continue; /如果遇到右括號(hào),則不斷地對(duì)兩個(gè)棧進(jìn)行運(yùn)算直到遇到第一個(gè)左括號(hào),同時(shí)彈出遇到的第一個(gè)左括號(hào) else if(unsolvedi=) while(oper.get_top()!=() char op = oper.get_top(); /如果遇到的是雙目運(yùn)算符則連續(xù)從數(shù)據(jù)棧中取出兩個(gè)數(shù) if

33、(op!=S&op!=A) double num1 = num.get_top(); num.pop(); CString tt; num_count-; pDC-TextOut (num_x,num_y-25*num_count, ); tt.Empty(); tt.Format(%0.3f,num1); tt += 出棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); double num2 = num.get_top(); num.pop(); num_count-; pDC-TextOut (num_x,num_

34、y-25*num_count, ); tt.Empty(); tt.Format(%0.3f,num2); tt += 出棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); num.push(cal(num2,op,num1); CString s; s.Format (%0.3f,num.get_top (); pDC-TextOut (num_x,num_y-25*num_count,s); tt.Empty(); tt.Format(%0.3f,num.get_top(); tt += 入棧 ; pDC-TextO

35、ut(px_topleft+450,py_topleft+50,tt); num_count+; Sleep(2000); /如果遇到的是單目操作符則只彈出一個(gè)數(shù)據(jù) else if(op=S|op=A) double num1 = num.get_top(); num.pop(); CString tt; num_count-; pDC-TextOut (num_x,num_y-25*num_count, ); tt.Empty(); tt.Format(%0.3f,num1); tt += 出棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt);

36、Sleep(2000); num.push(cal(0,op,num1); CString s; s.Format (%0.3f,num.get_top (); pDC-TextOut (num_x,num_y-25*num_count,s); num_count+; tt.Empty(); tt.Format(%0.3f,num.get_top(); tt += 入棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); oper.pop(); op_count-; pDC-TextOut (op_x,op_y-25*op_

37、count, ); CString tt; tt.Empty(); tt += op; tt += 出棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); if(oper.get_top()=#) MessageBox(括號(hào)不匹配!); oper.pop(); op_count-; pDC-TextOut (op_x,op_y-25*op_count, ); pDC-TextOut(px_topleft+450,py_topleft+50,( 出棧 ); Sleep(2000); i+; continue; /如果運(yùn)算符棧

38、頂是左括號(hào)則無(wú)論是數(shù)據(jù)還是操作符都對(duì)應(yīng)壓入數(shù)據(jù)棧和操作符棧 else if(oper.get_top()=() if(is_digit(unsolvedi) CString tm; tm.Empty(); int n = 0; int temp = i; while(is_digit(unsolvedi) n+; i+; for(int xx = 0; xx TextOut (num_x,num_y-25*num_count,s); num_count+; CString tt; tt.Empty(); tt.Format(%0.3f,num.get_top(); tt += 入棧 ; pDC

39、-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); /i+; continue; else oper.push(unsolvedi); pDC-TextOut (op_x,op_y-25*op_count,oper.get_top(); op_count+; CString tt; tt.Empty(); tt += oper.get_top(); tt += 入棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); i+; continue; /如果當(dāng)前操作符的優(yōu)

40、先級(jí)較高則直接壓入運(yùn)算符棧 else if(cal_level(unsolvedi,oper.get_top()0) oper.push(unsolvedi); pDC-TextOut (op_x,op_y-25*op_count,oper.get_top(); op_count+; CString tt; tt.Empty(); tt += oper.get_top(); tt += 入棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); i+; continue; /如果當(dāng)前操作符的優(yōu)先級(jí)低于運(yùn)算符棧頂?shù)牟僮鞣麆t取出棧

41、頂運(yùn)算符進(jìn)行運(yùn)算 /直至當(dāng)前運(yùn)算符的優(yōu)先級(jí)高于棧頂運(yùn)算符為止 else if(!(cal_level(unsolvedi,oper.get_top()0) while(!(cal_level(unsolvedi,oper.get_top()0) char op = oper.get_top(); if(op!=S&op!=A) double num1 = num.get_top(); num.pop(); num_count-; pDC-TextOut (num_x,num_y-25*num_count, ); CString tt; tt.Empty(); tt.Format(%0.3f,n

42、um1); tt += 出棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); double num2 = num.get_top(); num.pop(); num_count-; pDC-TextOut (num_x,num_y-25*num_count, ); tt.Empty(); tt.Format(%0.3f,num2); tt += 出棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); num.push(cal(num2,op,num1

43、); CString s; s.Format (%0.3f,num.get_top (); pDC-TextOut (num_x,num_y-25*num_count,s); num_count+; tt.Empty(); tt.Format(%0.3f,num.get_top(); tt += 入棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); else if(op=S|op=A) double num1 = num.get_top(); num.pop(); num_count-; pDC-TextOut (num

44、_x,num_y-25*num_count, ); CString tt; tt.Empty(); tt.Format(%0.3f,num1); tt += 出棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); num.push(cal(0,op,num1); CString s; s.Format (%0.3f,num.get_top (); pDC-TextOut (num_x,num_y-25*num_count,s); tt.Empty(); tt.Format(%0.3f,num.get_top(); tt +

45、= 入棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); num_count+; Sleep(2000); oper.pop(); op_count-; pDC-TextOut (op_x,op_y-25*op_count, ); CString tt; tt.Empty(); tt += op; tt += 出棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); oper.push(unsolvedi); CString tt; pDC-TextOut (op_x,op_y-25*op_count,oper.get_top (); op_count+; tt.Empty(); tt.Format(%0.3f,num.get_top(); tt += 入棧 ; pDC-TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); i+; continue; /遇到表達(dá)式數(shù)組中的結(jié)束標(biāo)志#,進(jìn)行剩余計(jì)算 while(oper.get_top()!=#) char op = oper.get_top(); /雙目

展開(kāi)閱讀全文
溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!