版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 計(jì)算機(jī)科學(xué)與技術(shù)系</b></p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 2012~2013學(xué)年第2學(xué)期</p><p> 2013 年 6 月</p><p><b> 目錄</b></p><
2、;p> 1、題目 …………………………………………………………………………………… 3</p><p> 2、問題分析和任務(wù)定義 ………………………………………………………………… 4</p><p> 3、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計(jì) ………………………………………………………… 5</p><p> 4、詳細(xì)設(shè)計(jì)和編碼 ………………………………
3、……………………………………… 8</p><p> 5、上機(jī)調(diào)試過程 ………………………………………………………………………… 17</p><p> 6、測試結(jié)果及其分析 …………………………………………………………………… 19</p><p> 7、用戶使用說明 ………………………………………………………………………… 20</p>
4、<p> 8、參考文獻(xiàn) ……………………………………………………………………………… 20</p><p> 9、附錄(完整程序代碼)………………………………………………………………… 21</p><p><b> 題目</b></p><p> “數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)”是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)學(xué)生的集中實(shí)踐性環(huán)節(jié)之一,
5、是學(xué)習(xí)“數(shù)據(jù)結(jié)構(gòu)與算法”理論和實(shí)驗(yàn)課程后進(jìn)行的一次全面的綜合練習(xí)。其目的是要達(dá)到理論與實(shí)際應(yīng)用相結(jié)合,提高學(xué)生組織數(shù)據(jù)及編寫程序的能力,使學(xué)生能夠根據(jù)問題要求和數(shù)據(jù)對象的特性,學(xué)會數(shù)據(jù)組織的方法,把現(xiàn)實(shí)世界中的實(shí)際問題在計(jì)算機(jī)內(nèi)部表示出來并用軟件解決問題,培養(yǎng)良好的程序設(shè)計(jì)技能。</p><p><b> 內(nèi)容:【問題描述】</b></p><p> 一個邏輯表達(dá)
6、式如果對于其變元的任一種取值都為真,則稱為重言式;反之,如果對于其變元的任一種取值都為假,則稱為矛盾式;然而,更多的情況下,既非重言式,也非矛盾式。試寫一個程序,通過真值表判別一個邏輯表達(dá)式屬于上述哪一類。</p><p><b> 【基本要求】</b></p><p> (1) 邏輯表達(dá)式從終端輸入,長度不超過一行。邏輯運(yùn)算符包括 "|",&
7、quot;&" 和 "~",分別表示或、與和非,運(yùn)算優(yōu)先程度遞增,但可由括號改變,即括號內(nèi)的運(yùn)算優(yōu)先。邏輯變元 為大寫字母。表達(dá)式中任何地方都可以含有多個空格符。</p><p> (2) 若是重言式或矛盾式,可以只顯示"True forever",或"False forever",否則顯示 "Satisfactible&q
8、uot; 以及變量名序列,與用戶交互。若用戶對表達(dá)式中變元取定一組值,程序就求出并顯示邏輯表達(dá)式的值。</p><p><b> 【測試數(shù)據(jù)】</b></p><p> (1) (A|~A)&(B|~B)</p><p> (2) (A&~A)&C</p><p> (3) A|B|C|D
9、|E|~A</p><p> (4) A&B&C&~B</p><p> (5) (A|B)&(A|~B)</p><p> (6) A&~B|~A&B</p><p> 第二章 問題分析和任務(wù)定義</p><p> 1、 一個邏輯表達(dá)式如果對于其變元的任一種
10、取值均為真,則稱為重言式;反之,如果對于其變元的任一種取值都為假,則稱為矛盾式,然而,更多的情況下,既非重言式,也非矛盾式,寫一個程序通過真值表判別一個邏輯表達(dá)式屬于上述哪一類。基本要求如下:</p><p> 2、 邏輯表達(dá)式從終端輸入,長度不超過一行。邏輯運(yùn)算符包括“|”、“&”、“~”,分別表示或、與、非,運(yùn)算優(yōu)先程度遞增,但可有括號改變,即括號內(nèi)的運(yùn)算優(yōu)先。邏輯變元為大寫字母。表達(dá)式中任何地方
11、都可以含有多個空格符。</p><p> 3、 若是重言式或矛盾式,可以只顯示“True Forever”或“False Forever”,否則顯示運(yùn)算中每種賦值和與其相對應(yīng)的表達(dá)式的值。</p><p> 4、 本程序先使用棧將邏輯表達(dá)式的變量進(jìn)行存儲,然后將棧中的元素作為二叉樹的結(jié)點(diǎn)結(jié)構(gòu),然后根據(jù)優(yōu)先級讀取表達(dá)式建立二叉樹,并通過逐個判斷實(shí)現(xiàn)對重言式的判別。</p>
12、<p> 5、程序執(zhí)行的命令:</p><p><b> 輸入邏輯表達(dá)式。</b></p><p> 判斷表達(dá)式是重言式還是矛盾式。</p><p><b> 退出程序。</b></p><p><b> 6、細(xì)節(jié)設(shè)置</b></p>&l
13、t;p> 為實(shí)現(xiàn)用戶更好的操作,程序應(yīng)允許在表達(dá)式中插入多個空格,對大小寫沒有特殊要求,并含有較多的提示信息,一方便用戶操作。</p><p> 第三章 數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計(jì)</p><p><b> 流程圖</b></p><p><b> 本章主要介紹</b></p><p>
14、 1、數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì) </p><p> //根據(jù)表達(dá)式建立的二叉樹的結(jié)點(diǎn)定義,由于表達(dá)式的求值類似二叉樹的中序遍歷,故我們可以將表達(dá)式構(gòu)造為一個二叉樹;</p><p> typedef struct btdnode{}*bitree;</p><p> //識別表達(dá)式使用的堆棧定義,它存放的都是樹的結(jié)構(gòu),鑒于邏輯符號的優(yōu)先不同,我們需要用到堆棧;<
15、/p><p> typedef struct lnode_optr{}sqstack;</p><p><b> 2、算法的設(shè)計(jì)</b></p><p> 本設(shè)計(jì)從總體上劃分可分為四個模塊,</p><p> 第一個模塊為樹與堆棧的創(chuàng)建。</p><p> void create(bitre
16、e &zigen,bitree l,bitree r){};</p><p> void creatstack(sqstack &st){};</p><p> void creattree(char s[],bitree &tree){};</p><p> 第二個模塊為對樹與堆棧的操作,包括對樹的取值以及堆棧的入棧,出棧操作。<
17、;/p><p> int value_tree(bitree tree){};</p><p> void push(sqstack &st,bitree e){};</p><p> void pop(sqstack &st,bitree &e){}</p><p> 第三個模塊為對表達(dá)式的邏輯運(yùn)算符的判別。&l
18、t;/p><p> char youxianji(char lie,char hang){};</p><p> void gettop(sqstack &st,bitree &e){};</p><p> 第四個模塊為于用戶的交互。</p><p> void user(){};</p><p>
19、 3、抽象數(shù)據(jù)類型的設(shè)計(jì)</p><p> 根據(jù)所設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)和函數(shù)接口,設(shè)計(jì)抽象數(shù)據(jù)類型。</p><p> ADT Binary Tree{}</p><p> 數(shù)據(jù)對象:D是具有相同特性的數(shù)據(jù)元素的集合。</p><p><b> 二叉樹數(shù)據(jù)關(guān)系:</b></p><p> 若
20、D為空集,稱BinaryTree 為空二叉樹;</p><p> 否則 關(guān)系 R={H};</p><p> 在D中存在唯一的成為根的數(shù)據(jù)元素root,它在關(guān)系H下無前驅(qū);</p><p> D中其余元素必可分為兩個互不相交的子集L和R,每一個子集都是一棵符合本定義的二叉樹,并分別為root的左子樹和右子樹。如果左子樹L不空,則必存在一個根結(jié)點(diǎn),它是root的
21、“左后繼”(<root>∈H),如果右子樹R不空,則必存在一個根結(jié)點(diǎn)為root的“右后繼”(<root>∈H)。</p><p><b> 基本操作P:</b></p><p><b> {結(jié)構(gòu)初始化}</b></p><p> initBiTree(&T);</p>&
22、lt;p> 操作結(jié)果:構(gòu)造二叉樹T。</p><p> CreateBiTree(&T,definition);</p><p> 初始條件:definition給出二叉樹T的定義。</p><p> 操作結(jié)果:按definition構(gòu)造二叉樹T。</p><p><b> {銷毀結(jié)構(gòu)}</b>&
23、lt;/p><p> DestroyBiTree(&T);</p><p> 初始條件:二叉樹T存在。</p><p> 操作結(jié)果:銷毀二叉樹T。</p><p><b> {引用型操作}</b></p><p> BiTreeEmpty(T);</p><p&g
24、t; 初始條件:二叉樹T存在。</p><p> 操作結(jié)果:若二叉樹為空二叉樹,則返回TRUE,否則返回FALSE。</p><p> 和數(shù)相同,創(chuàng)建二叉樹的算法取決于它的數(shù)據(jù)元素之間關(guān)系的輸入方式。</p><p><b> Root(T)</b></p><p> 初始條件:二叉樹T存在。</p>
25、;<p> 操作結(jié)果:返回T的根。</p><p> Value(T,e)</p><p> 初始條件:二叉樹T存在,e是T中某個結(jié)點(diǎn)。</p><p> 操作結(jié)果:返回e的值。</p><p> Parent(T,e);</p><p> 初始條件:二叉樹T存在,e是T中某個結(jié)點(diǎn)。</
26、p><p> 操作結(jié)果:若e是T的非根結(jié)點(diǎn),則返回它的雙親,否則返回“空”。</p><p> LeftChild(T,e);</p><p> 初始條件:二叉樹T存在,e是T中某個結(jié)點(diǎn)。</p><p> 操作結(jié)果:返回T的左孩子,若e無左孩子,則返回“空”。</p><p> RightChild(T,e);
27、</p><p> 初始條件:二叉樹T存在,e是T中某個結(jié)點(diǎn)。</p><p> 操作結(jié)果:返回T的右孩子,若e無左孩子,則返回“空”。</p><p><b> }</b></p><p><b> 堆棧數(shù)據(jù)關(guān)系:</b></p><p> ADT Stack{&
28、lt;/p><p> InitStack(&S) </p><p> 操作結(jié)果:構(gòu)造一個空棧。</p><p> DestroyStack(&S)</p><p> 初始條件:棧S存在。</p><p> 操作結(jié)果:棧S被銷毀。</p><p> GetTop(S,
29、&e)</p><p> 初始條件:棧S已存在且非空。</p><p> 操作結(jié)果:用e返回S的棧頂元素。</p><p> Push(&S,e)</p><p> 初始條件:棧S已存在。</p><p> 操作結(jié)果:插入結(jié)點(diǎn)為e的新的棧頂元素。</p><p>
30、; Pop(&S,&e)</p><p> 初始條件:棧S已存在且非空。</p><p> 操作結(jié)果:刪除S的棧頂元素,并用e返回其值。</p><p><b> }</b></p><p> 第四章 詳細(xì)設(shè)計(jì)和編碼</p><p><b> 一、設(shè)計(jì)結(jié)
31、構(gòu)體</b></p><p> typedef struct node //根據(jù)表達(dá)式建立的二叉樹的結(jié)點(diǎn)定義</p><p><b> {</b></p><p> char data;</p><p> struct node *lchild; </p><p
32、> struct node *rchild;</p><p> }BiTNode,*bitree;</p><p> typedef struct stack //識別表達(dá)式使用的堆棧定義,它存放的都是樹的結(jié)構(gòu)</p><p> { //棧中的元素都是樹的結(jié)點(diǎn)結(jié)構(gòu)</p>
33、;<p> bitree *base; //棧底指針</p><p> bitree *top; //棧頂指針</p><p> int stacksize; //棧容量</p><p> }seqstack;</p><p><b
34、> 二、設(shè)計(jì)功能子函數(shù)</b></p><p> //用于產(chǎn)生變量的各種取值組合</p><p> void creatzuhe(int n) {</p><p> int i,num=0,j=0,e;</p><p> int temp[maxsize];</p><p> f
35、or(i=0;i<N;i++)</p><p> zuhe[i]=0;</p><p><b> while(n)</b></p><p><b> {</b></p><p><b> e=n%2;</b></p><p><b&g
36、t; num++;</b></p><p> temp[j]=e;</p><p><b> j++;</b></p><p><b> n=n/2;</b></p><p><b> }</b></p><p><b>
37、 j=j-1;</b></p><p> num=N-num;</p><p> while(j>=0)</p><p><b> {</b></p><p> e=temp[j];</p><p><b> j--;</b></p>
38、<p> zuhe[num]=e;</p><p><b> num++;</b></p><p><b> }</b></p><p><b> }</b></p><p> //自底向上地根據(jù)運(yùn)算符地優(yōu)先級來建立分子樹函數(shù)</p>&l
39、t;p> void create(bitree &f,bitree l,bitree r) //當(dāng)邏輯表達(dá)式讀完后-子根f就是一棵完整的二叉樹</p><p><b> {</b></p><p> f->lchild=l; //分樹
40、的鏈接</p><p> f->rchild=r; //分樹的鏈接</p><p><b> if(l&&r)</b></p><p><b> {</b></p><p> if(int(l->data)>=65&&a
41、mp;int(l->data)<=90) //左子樹</p><p><b> {</b></p><p> l->lchild=NULL;</p><p> l->rchild=NULL;</p><p><b> }</b></p><p&g
42、t; if(int(r->data)>=65&&int(r->data)<=90) //右子樹</p><p><b> {</b></p><p> r->lchild=NULL;</p><p> r->rchild=NULL;</p><p><b
43、> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //邏輯運(yùn)算符的優(yōu)先級判別</p><p> char youxianji(char m,char n) </p><p><b
44、> {</b></p><p> int i,j;</p><p> char bijiao[7][7]={' ','|','&','~','(',')','#', //二維數(shù)組比較優(yōu)先級先后</p><p> &
45、#39;|','>','<','<','<','>','>',</p><p> '&','>','>','<','<','>','
46、>',
47、
48、 </p><p> '~','>','>','>','<','>','>',</p><p> '(','<','<','<','
49、;<','=',' ',</p><p> ')','>','>','>',' ','>','>',</p><p> '#','<','<'
50、;,'<','<',' ','='};</p><p> for(i=0;i<7;i++)</p><p> if(bijiao[0][i]==m) //找到m運(yùn)算符的列號</p><p><b> break;</b></p><
51、p> for(j=0;j<7;j++) //找到n運(yùn)算符的行號</p><p> if(bijiao[j][0]==n) </p><p><b> break;</b></p><p> return bijiao[j][i]; //返回優(yōu)先級的符號:>、<、=</p>
52、<p><b> }</b></p><p><b> //初始化棧</b></p><p> void setstack(seqstack &st) </p><p><b> {</b></p><p> st.base=(bitree
53、*)malloc(maxsize*sizeof(node));//分配結(jié)構(gòu)node的size大小的內(nèi)存,強(qiáng)制轉(zhuǎn)換為bitree類型</p><p> st.top=st.base; </p><p> st.stacksize=maxsize; //棧容量</p><p><b> }</b></p>&
54、lt;p><b> //入棧</b></p><p> void push(seqstack &st,bitree e) </p><p><b> {</b></p><p> if(st.top-st.base<st.stacksize) //符合條件入棧</p>&l
55、t;p><b> {</b></p><p> *st.top=e;</p><p> st.top++; </p><p><b> }</b></p><p> else cout<<"ERROR!!!"<<endl; //不
56、符合輸出ERROR!!!</p><p><b> }</b></p><p><b> //出棧</b></p><p> void pop(seqstack &st,bitree &e) </p><p><b> {</b></p>
57、<p> if(st.top==st.base) cout<<"ERROR!!!"<<endl; //不符合條件輸出ERROR!!! </p><p> st.top--; //符合條件</p><p> e=*st.top;</p><p><b>
58、 }</b></p><p><b> //取棧頂元素</b></p><p> void gettop(seqstack &st,bitree &e) </p><p><b> {</b></p><p> if(st.top==st.base) cout&
59、lt;<"ERROR!!!"<<endl; //不符合條件輸出ERROR!!!</p><p> e=*(st.top-1); //符合取棧頂元素</p><p><b> }</b></p><p> //根據(jù)邏輯表達(dá)式將數(shù)據(jù)存入二叉樹中,定義兩個棧&
60、lt;/p><p> void creattree(char s[],bitree &tree) </p><p><b> {</b></p><p> seqstack variable; //變量棧</p><p> seqstack logic; //邏輯運(yùn)算符棧 &
61、lt;/p><p> setstack(variable); //變量棧初始化</p><p> setstack(logic); //邏輯運(yùn)算符棧初始化</p><p> bitree logic1,variables,logics,e,a,b,g,kuohao;//定義棧中的元素,g為最后的二叉樹的根 <
62、;/p><p> logic1=(bitree)malloc(sizeof(node));//分配結(jié)構(gòu)node的size大小的內(nèi)存,強(qiáng)制轉(zhuǎn)換為bitree類型</p><p> logic1->data='#'; //將邏輯運(yùn)算符棧的棧底元素設(shè)為'#'</p><p> push(logic,logic1);
63、 //入邏輯運(yùn)算符棧</p><p> while(*s!=NULL) </p><p><b> { </b></p><p> if(int(*s)>=65&&int(*s)<=90) //讀取的是變量</p><p><b> {
64、</b></p><p> variables=(bitree)malloc(sizeof(node));//分配結(jié)構(gòu)node的size大小的內(nèi)存,強(qiáng)制轉(zhuǎn)換為bitree類型</p><p> variables->data=*s;</p><p> push(variable,variables); //入變量棧</p>
65、<p><b> }</b></p><p> else if(int(*s)>90||int(*s)<65) //讀取的邏輯運(yùn)算符</p><p><b> { </b></p><p> gettop(logic,e); //取運(yùn)算符棧的棧頂元素進(jìn)行優(yōu)先級比較&
66、lt;/p><p> switch(youxianji(*s,e->data))</p><p><b> {</b></p><p> case '<': //棧頂?shù)倪\(yùn)算符優(yōu)先級低,邏輯運(yùn)算符進(jìn)棧</p><p> logics=(bitree)mallo
67、c(sizeof(node));//分配結(jié)構(gòu)node的size大小的內(nèi)存,強(qiáng)制轉(zhuǎn)換為bitree類型</p><p> logics->data=*s;</p><p> push(logic,logics);</p><p><b> break;</b></p><p> case '='
68、;: </p><p> pop(logic,kuohao); //脫括號并接受下一個字符</p><p><b> break;</b></p><p> case '>': //棧頂?shù)倪\(yùn)算符優(yōu)先級高,變量出棧運(yùn)算</p><p&
69、gt; pop(logic,g); //彈出邏輯運(yùn)算符</p><p> pop(variable,a); //彈出變量</p><p> b=NULL; //'~'只有右子樹</p><p> if(g->data!='~') </p><p>
70、 pop(variable,b); </p><p> create(g,b,a); //建樹的函數(shù)調(diào)用 </p><p> push(variable,g);//將臨時(shí)的根作為新的變量壓入變量棧中</p><p> if(*s!='#'&&*s!=')') </p><p&g
71、t;<b> {</b></p><p> logics=(bitree)malloc(sizeof(node));//分配結(jié)構(gòu)node的size大小的內(nèi)存,強(qiáng)制轉(zhuǎn)換為bitree類型</p><p> logics->data=*s;</p><p> push(logic,logics); //邏輯運(yùn)算符入棧</p&g
72、t;<p><b> }</b></p><p> else s=s-1;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p
73、><b> s++;</b></p><p><b> }</b></p><p><b> tree=g;</b></p><p><b> } </b></p><p> //根據(jù)變量的取值組合并利用邏輯表達(dá)式的性質(zhì)對樹進(jìn)行求值<
74、/p><p> int valuetree(bitree tree) {</p><p> if(!tree) return 0; //遇到空的結(jié)點(diǎn)</p><p> else if(tree->data!='|'&&tree-&g
75、t;data!='&'&&tree->data!='~') //找到的是變量</p><p> return zuhe[int(tree->data)-65]; //返回值</p><p> else if(int(tree->data)<65||int(tre
76、e->data)>90) //找到的是運(yùn)算符</p><p> switch(tree->data)</p><p><b> {</b></p><p> case '|': </p><p> return(valuetree(tree->lch
77、ild)||valuetree(tree->rchild)); //遞歸調(diào)用</p><p><b> break;</b></p><p> case '&': </p><p> return(valuetree(tree->lchild)&&valuetree(tree->r
78、child)); //遞歸調(diào)用</p><p><b> break;</b></p><p> case '~': </p><p> return(!valuetree(tree->rchild)); //遞歸調(diào)用</p><p><b
79、> break;</b></p><p> default: return 0;</p><p><b> }</b></p><p> else return 0;</p><p><b> }</b></p><p> //用戶輸入變量的一組
80、取值情況</p><p> void user() </p><p><b> {</b></p><p><b> int i;</b></p><p> cout<<"請依次輸入你的變量取值(0或1)"<<endl;</p
81、><p> for(i=65;i<65+N;i++)</p><p><b> {</b></p><p> cout<<char(i)<<"="; //轉(zhuǎn)化為char類型輸出</p><p> cin>>zuhe[i-65];</p&
82、gt;<p><b> }</b></p><p><b> }</b></p><p><b> //界面設(shè)計(jì)</b></p><p> void print()</p><p><b> {</b></p><
83、;p> cout<<"■■■■■■■■■■■■■■■■■■■■■■■■■"<<endl;//標(biāo)識信息</p><p> cout<<"■■ 合肥學(xué)院 計(jì)科系 11網(wǎng)絡(luò)工程(1)班 ■■"<<endl;</p><p> cout<<"■■
84、 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) ■■"<<endl;</p><p> cout<<"■■ ------重言式的判別 ■■"<<endl;</p><p> cout<<"■■ 2013.06.10
85、 ■■"<<endl;</p><p> cout<<"■■■■■■■■■■■■■■■■■■■■■■■■■"<<endl;</p><p><b> }</b></p><p><b> //菜單函數(shù),</b></p>
86、<p> void meun() </p><p><b> {</b></p><p> system("cls");</p><p><b> print();</b></p><p> char str[maxsize],stri[maxs
87、ize],*pstr,q;</p><p> int j,i=0,choose=1,sum,n=0;</p><p> bitree Tree;</p><p> int SUM=0,l; //用于累加變量的每種組合的邏輯表達(dá)式的結(jié)果;可以作為邏輯表達(dá)式類別判別的根據(jù)</p><p> cout<<"■■請輸
88、入邏輯表達(dá)式的變量的個數(shù): ■■"<<endl; //提示輸入表達(dá)式的變量個數(shù)</p><p> cout<<"■■";</p><p><b> cin>>N;</b></p><p> sum=int(pow(2,N)); //變量組合的
89、總數(shù);</p><p> cout<<"■■■■請輸入邏輯表達(dá)式的表達(dá)式:例如(~A|B&C) ■■"<<endl;</p><p> scanf("%[^\n]",str); //讀取包含多個空格的邏輯表達(dá)式</p><p><b> pstr=str;</b>
90、</p><p> for(;*pstr!=NULL;pstr++,n++){ //邏輯表達(dá)式的正確讀取,去除表達(dá)式中的空格</p><p> if(str[n]>=97&&str[n]<=122) str[n]=str[n]-32; //將小寫轉(zhuǎn)換成大寫</p><p> if(str[n]!=' ') st
91、ri[i++]=*pstr;</p><p><b> } </b></p><p> stri[i]='#'; //最后一字符后加入'#',與運(yùn)算符棧的棧底元素'#'對應(yīng)</p><p> stri[i+1]='\0';
92、//結(jié)束標(biāo)志'\0'</p><p> //system("cls"); //系統(tǒng)清屏函數(shù)</p><p> cout<<"■■■請選擇你要的操作■■■■■■■■■■■■■■"<<endl;</p><p> cout<<"■■ 1 計(jì)
93、算機(jī)自動窮舉 ■■"<<endl;</p><p> cout<<"■■ 2 用戶自定義設(shè)置 ■■"<<endl;</p><p> cout<<"■■ 3 重新開始
94、 ■■"<<endl;</p><p> cout<<"■■ 0 退出 ■■"<<endl;</p><p> cout<<"請選擇你要的操作: "; //提示信息</p>&
95、lt;p> cin>>choose;</p><p> while(choose!=1&&choose!=2&&choose!=3&&choose!=0)</p><p><b> {</b></p><p> cout<<"您輸入的有誤,請您重新輸
96、入:"; //提示信息</p><p> cin>>choose;</p><p><b> }</b></p><p> switch(choose)</p><p><b> {</b></p><p> case 1: //對變
97、量的不同組合依次調(diào)用重言式二叉樹的求值函數(shù);并判別重言式的類別</p><p> // system("cls");</p><p> creattree(stri,Tree); //建立重言式的二叉樹</p><p> for(j=0;j<sum;j++)</p><p><b> { </
98、b></p><p> creatzuhe(j); //產(chǎn)生變量取值組合</p><p> SUM+=valuetree(Tree); //SUM累加</p><p><b> }</b></p><p> stri[i]='\0'; //加入結(jié)束標(biāo)志以
99、便輸出邏輯表達(dá)式</p><p> if(SUM==0) //矛盾式</p><p><b> {</b></p><p> cout<<"邏輯表達(dá)式:"<<stri<<endl;</p><p> cout<<"
100、;False forever"<<endl;</p><p><b> }</b></p><p> if(SUM==sum) //重言式</p><p><b> {</b></p><p> cout<<"邏輯表達(dá)式:&quo
101、t;<<stri<<endl;</p><p> cout<<"True forever"<<endl;</p><p><b> }</b></p><p> if(SUM>0&&SUM<sum) //既不是矛盾式也不是重言式</p
102、><p><b> { </b></p><p> cout<<"邏輯表達(dá)式:"<<stri<<endl;</p><p> cout<<"Satisfactible"<<endl;</p><p> cout<
103、;<" 邏輯表達(dá)式的真值表 "<<endl; //輸出真值表</p><p> cout<<"==================================================\n\t";</p><p> for(l=65;l<65
104、+N;l++)</p><p> cout<<setw(4)<<char(l); //setw是域?qū)?lt;/p><p> cout<<" 邏輯表達(dá)式的值";</p><p> cout<<"\t||"<<endl;</p><p>
105、cout<<"=================================================="<<endl;</p><p> for(j=0;j<sum;j++)</p><p><b> {</b></p><p> creatzuhe(j);
106、 //產(chǎn)生變量取值組合</p><p> //SUM=valuetree(Tree);</p><p> cout<<"||\t";</p><p> for(int h=0;h<N;h++)</p><p> cout<<setw(4)<<zuhe[h];</p&g
107、t;<p> cout<<setw(8)<<valuetree(Tree); //輸出每種取值情況的值</p><p> cout<<"\t||"<<endl;</p><p> cout<<"==========================================
108、======"<<endl;</p><p><b> }</b></p><p> //stri[i]='\0'; //加入結(jié)束標(biāo)志以便輸出邏輯表達(dá)式</p><p><b> }</b></p><p> cout<<"是
109、否繼續(xù)?(Y繼續(xù),其它退出)"; //提示信息</p><p><b> cin>>q;</b></p><p> if(q=='y'||q=='Y')</p><p><b> { </b></p><p> getchar();&
110、lt;/p><p> meun(); //調(diào)用菜單函數(shù)</p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p> system("
111、;cls"); //系統(tǒng)清屏函數(shù)</p><p> cout<<"\t■程序結(jié)束,謝謝!!!■"<<endl;</p><p><b> }</b></p><p><b> break;</b></p><p><b>
112、 case 2: </b></p><p> //system("cls"); //系統(tǒng)清屏函數(shù)</p><p> creattree(stri,Tree); //調(diào)用</p><p> stri[i]='\0'; //加入結(jié)束標(biāo)志以便輸出邏輯表達(dá)式</p>&l
113、t;p> cout<<"邏輯表達(dá)式:"<<stri<<endl;</p><p> user(); //調(diào)用</p><p> cout<<"邏輯表達(dá)式的值為:"<<valuetree(Tree)<<endl;</p>&l
114、t;p> cout<<"是否繼續(xù)?(Y繼續(xù),其它字母退出)";</p><p><b> cin>>q;</b></p><p> if(q=='y'||q=='Y')</p><p><b> { </b></p>
115、<p> getchar();</p><p> meun(); //調(diào)用菜單函數(shù)</p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p>
116、<p> system("cls"); //系統(tǒng)清屏函數(shù)</p><p> cout<<"\t■程序結(jié)束,謝謝!!!■"<<endl;</p><p><b> }</b></p><p><b> break;</b></p&
117、gt;<p><b> case 3:</b></p><p> getchar();</p><p> meun(); //調(diào)用菜單函數(shù)</p><p><b> break;</b></p><p><b> case 0:<
118、/b></p><p> system("cls"); //系統(tǒng)清屏函數(shù)</p><p> cout<<"\t■您已退出,謝謝使用!!!■"<<endl;//退出提示信息</p><p><b> break;</b></p><p&
119、gt;<b> }</b></p><p><b> }</b></p><p><b> //主函數(shù)</b></p><p> void main()</p><p><b> {</b></p><p> syste
120、m("color 9a"); //對界面調(diào)顏色</p><p> meun(); //調(diào)用菜單函數(shù)</p><p><b> }</b></p><p> 第五章 測試結(jié)果及其分析</p><p><b> ?、?、開始界面:</b></p>&
121、lt;p><b> 圖5-1 界面</b></p><p> ㈡、測試~A|D&C:</p><p><b> 圖5-2 程序測試</b></p><p> ㈢、測試用戶自定義求值:</p><p><b> 圖5-3 用戶測試</b></p>
122、;<p><b> ?、?、測試大小寫</b></p><p> 圖5-4 大小寫測試</p><p> 第六章 上機(jī)調(diào)試過程</p><p><b> 問題與解決方法:</b></p><p> 在調(diào)試過程中出現(xiàn)以下問題:</p><p> ①err
123、or C2065: 'malloc' : undeclared identifier</p><p> error C2065: 'exit' : undeclared identifier</p><p> 原因是因?yàn)槿鄙倭祟^文件#include<stdlib.h></p><p> ?、谠谶\(yùn)行過程中,不能有效地解決
124、()的優(yōu)先級問題</p><p> 解決方法:在對樹的遍歷函數(shù)value_tree(bitree tree){}中添加以下語句即可</p><p> if(tree->data=='('){</p><p> while(tree->data!='(')</p><p> value_tre
125、e(tree);</p><p><b> }</b></p><p> ?、鄄荒芙Y(jié)局大小寫隨意輸入</p><p><b> 在讀取表達(dá)式時(shí)加入</b></p><p> if(str[n]>=97&&str[n]<=122) str[n]=str[n]-32;&
126、lt;/p><p> 第七章 用戶使用說明</p><p><b> 1、怎么用?</b></p><p> 本程序中含有大量的用戶提示信息,用戶可根據(jù)提示信息進(jìn)行有效的操作,</p><p><b> 例如:</b></p><p> 圖7-1 用戶操作演示<
127、/p><p> 第八章 參考文獻(xiàn):</p><p> [1] 王昆侖,李紅. 數(shù)據(jù)結(jié)構(gòu)與算法. 北京:中國鐵道出版社,2006年5月。</p><p><b> [2] 其它。</b></p><p><b> 附錄:</b></p><p> #include &q
128、uot;stdlib.h"</p><p> #include "stdio.h"</p><p> #include "iostream.h"</p><p> #include "string.h"</p><p> #include "math.h&
129、quot;</p><p> #include "iomanip.h"</p><p> #define maxsize 100</p><p> int zuhe[maxsize]; //變量的取值組合數(shù)組定義</p><p> int N; /
130、/變量個數(shù)</p><p> typedef struct node //根據(jù)表達(dá)式建立的二叉樹的結(jié)點(diǎn)定義</p><p><b> {</b></p><p> char data;</p><p> struct node *lchild; </p><p> s
131、truct node *rchild;</p><p> }BiTNode,*bitree;</p><p> typedef struct stack //識別表達(dá)式使用的堆棧定義,它存放的都是樹的結(jié)構(gòu)</p><p> { //棧中的元素都是樹的結(jié)點(diǎn)結(jié)構(gòu)</p><
132、p> bitree *base; //棧底指針</p><p> bitree *top; //棧頂指針</p><p> int stacksize; //棧容量</p><p> }seqstack;</p><p> void creat
133、zuhe(int n) //用于產(chǎn)生變量的各種取值組合</p><p><b> {</b></p><p> int i,num=0,j=0,e;</p><p> int temp[maxsize];</p><p> for(i=0;i<N;i++)</p><p&g
134、t; zuhe[i]=0;</p><p><b> while(n)</b></p><p><b> {</b></p><p><b> e=n%2;</b></p><p><b> num++;</b></p><p
135、> temp[j]=e;</p><p><b> j++;</b></p><p><b> n=n/2;</b></p><p><b> }</b></p><p><b> j=j-1;</b></p><p&g
136、t; num=N-num;</p><p> while(j>=0)</p><p><b> {</b></p><p> e=temp[j];</p><p><b> j--;</b></p><p> zuhe[num]=e;</p>
137、<p><b> num++;</b></p><p><b> }</b></p><p><b> }</b></p><p> void create(bitree &f,bitree l,bitree r) //自底向上地根據(jù)運(yùn)算符地優(yōu)先級來建立分子樹函數(shù)</p
138、><p> //當(dāng)邏輯表達(dá)式讀完后-子根f就是一棵完整的二叉樹</p><p><b> {</b></p><p> f->lchild=l; //分樹的鏈接</p><p> f->rchild=r; //分樹的鏈接</p>&
139、lt;p><b> if(l&&r)</b></p><p><b> {</b></p><p> if(int(l->data)>=65&&int(l->data)<=90) //左子樹</p><p><b> {</b>&
140、lt;/p><p> l->lchild=NULL;</p><p> l->rchild=NULL;</p><p><b> }</b></p><p> if(int(r->data)>=65&&int(r->data)<=90) //右子樹</p&g
141、t;<p><b> {</b></p><p> r->lchild=NULL;</p><p> r->rchild=NULL;</p><p><b> }</b></p><p><b> }</b></p><p
142、><b> }</b></p><p> char youxianji(char m,char n) //邏輯運(yùn)算符的優(yōu)先級判別</p><p><b> {</b></p><p> int i,j;</p><p> char bijiao[7][7]={'
143、 ','|','&','~','(',')','#', //二維數(shù)組比較優(yōu)先級先后</p><p> '|','>','<','<','<','>','>
144、9;,</p><p> '&','>','>','<','<','>','>',
145、
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計(jì)--重言式的判別
- 數(shù)據(jù)結(jié)構(gòu)報(bào)告—重言式判別
- 修正的Atanassov命題邏輯及其廣義重言式.pdf
- 擾動模糊命題邏輯及其廣義重言式.pdf
- 模糊模態(tài)命題邏輯及其廣義重言式.pdf
- 重言式狀態(tài)詞的歷時(shí)發(fā)菜及語法化考察.pdf
- 區(qū)間值模糊命題邏輯的廣義擬重言式及其真度
- 區(qū)間值模糊命題邏輯的廣義擬重言式及其真度.pdf
- 離散數(shù)學(xué)第1章重言式與蘊(yùn)含式和其它連接詞
- 幾種多值邏輯系統(tǒng)重言式關(guān)系和l4中導(dǎo)出函數(shù)問題的研究
- 幾種多值邏輯系統(tǒng)重言式關(guān)系和L4中導(dǎo)出函數(shù)問題的研究.pdf
- 課程設(shè)計(jì)-訂單式銷售管理系統(tǒng)課程設(shè)計(jì)
- 化工原理課程設(shè)計(jì)--列管式換熱器課程設(shè)計(jì)
- 管殼式換熱器的設(shè)計(jì)課程設(shè)計(jì)
- 鋼結(jié)構(gòu)課程設(shè)計(jì)--輕型門式鋼架課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 管殼式換熱器課程設(shè)計(jì)
- 課程設(shè)計(jì)--管殼式換熱器
- 管殼式換熱器課程設(shè)計(jì)
評論
0/150
提交評論