重言式判別課程設計報告_第1頁
重言式判別課程設計報告_第2頁
重言式判別課程設計報告_第3頁
重言式判別課程設計報告_第4頁
重言式判別課程設計報告_第5頁
已閱讀5頁,還剩28頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、合肥學院計算機科學與技術系課程設計報告20162017學年第1學期課程 數據結構與算法課程設計題目名稱重言式的判別學生姓名王 芳學號1404011018專業班級計算機科學與技術14級1班指導教師李紅 何立新2016年9月一、題目【問題描述】一個邏輯表達式如果對于其變元的任一種取值都為真,則稱為重言式;反之,如果對于其變元的任一種取值都為假,則稱為矛盾式;然而,更多的情況下,既非重言式,也非矛盾式。試寫一個程序,通過真值表判別一個邏輯表達式屬于上述哪一類。【基本要求】(1) 邏輯表達式從終端輸入,長度不超過一行。邏輯運算符包括 "|","&" 和

2、"",分別表示或、與和非,運算優先程度遞增,但可由括號改變,即括號內的運算優先。邏輯變元為大寫字母。表達式中任何地方都可以含有多個空格符。(2) 若是重言式或矛盾式,可以只顯示"True forever",或"False forever",否則顯示 "Satisfactible" 以及變量名序列,與用戶交互。若用戶對表達式中變元取定一組值,程序就求出并顯示邏輯表達式的值。 【測試數據】(1) (A|A)&(B|B)(2) (A&A)&C(3) A|B|C|D|E|A(4) A&B&a

3、mp;C&B(5) (A|B)&(A|B)(6) A&B|A&B;O ,0;0,1;1,0;1,1 。二、問題分析1、 一個邏輯表達式如果對于其變元的任一種取值均為真,則稱為重言式;反之,如果對于其變元的任一種取值都為假,則稱為矛盾式,若對于其變元的任一種取值既有真,又有假,則稱其為可滿足式。寫一個程序通過真值表判別一個邏輯表達式屬于上述哪一類。基本要求如下:1) 邏輯表達式從終端輸入,長度不超過一行。邏輯運算符包括“|”、“&”、“”,分別表示或、與、非,運算優先程度遞增,但可有括號改變,即括號內的運算優先。邏輯變元為大寫字母。表達式中任何地方都可以含

4、有多個空格符。2) 若是重言式或矛盾式,可以只顯示“True Forever”或“False Forever”,否則顯示運算中每種賦值和與其相對應的表達式的值。2、通過真值表判別邏輯表達式是否為重言式,需解決以下問題:1) 對邏輯表達式中空格符的處理。為了方便對邏輯表達式進行掃描判斷,應先去掉表達式中的空格符。2) 算符的優先級問題在帶括號的表達式中,界限符包括左右括號以及表達式起始、結束符“#”。對于一個簡單的表達式求值運算規則如下:(1)從左至右依次計算。(2)先取反,然后相與,后相或。(3)先括號內,后括號外。為統一算法的描述,將運算符和界限符統稱為算符。這樣,算符集為,&,|,

5、(,),#。根據上述3條規則,兩個前后相繼出現的算符a1,a2間的優先關系可以歸納如下:(1) 若a1,a2同為“&”或同為“|”,則算符a1的優先級大于a2。(2) “”、“&”、“|”的優先級依次減小。(3) 由于先括號內,后括號外,若a1為“|”、“&”、“”,a2為“(”;或者,a1為“(”,而a2為“|”、“&”、“”,則a1的優先級小于a2。(4) 同理,若a1為“|”、“&”、“”,a2為“)”;或者,a1為“)”,而a2為“|”、“&”、“”,則a1的優先級大于a2。(5) 若a1、a2同為“(”,則a1的優先級小于a2;若a1、

6、a2同為“)”,則a1的優先級大于a2。(6) 表達式的起始、結束符“#”的優先級小于其他所有合法出現的算符。(7) 若a1為“(”,a2為“)”;或者,a1、a2同為“#”,則a1、a2優先級相同。綜上所述,將兩個相繼出現的算符a1、a2的優先關系進行歸納如表1所示。表1 算符a1和a2間的優先關系a1 a2|&()#|><<<>>&>><<>>>>><>>(<<<<=_)>>>_>>#<<<<

7、;_=我們可以將邏輯表達式的計算類比算術表達式的計算,通常借助堆棧來實現按運算符的優先級完成表達式的求值計算。一個是存放運算符棧,另一個是存放變量或中間結果棧。 (1) 首先初始化算符棧logic和變量棧,并將表達式的起始符“#”壓入算符棧logic。(2) 依次讀入表達式中的每個字符。若是變量,則為其分配結構node的size大小的內存,強制轉換為bitree類型,并將其壓入變量棧variable;若是運算符,則為其分配結構node的size大小的內存,強制轉換為bitree類型,并與運算符棧logic的棧頂算符進行優先級比較,并作如下處理: 若棧頂算符a1的優先級低于剛讀入的算符a2,則將

8、a2壓入運算符棧logic。 若棧頂算符a1的優先級高于剛讀入的算符a2,則將a1出棧,同時將變量棧variable出棧一次,得到變量A,再判斷棧頂算符a1是否為“”,如果a1不是“”,則繼續出棧變量棧variable一次,得到變量B,將a1作為根結點,B作為a1的左孩子,A作為a1的右孩子,并將根結點a1壓入變量棧variable;如果棧頂算符a1是“”,則將a1作為根結點,A作為a1的右孩子,a1的左孩子則為空,并將根結點a1壓入變量棧。 若棧頂算符a1優先級與剛讀入的算符a2的優先級相同,說明左右括號相遇,或者是表達式的起始、結束符相遇,只需將棧頂算符(左括號或起始符)出棧即可;當運算符

9、棧logic空時,算法結束這樣就可以將邏輯表達式構造成一棵完整二叉樹,根結點是優先級最小的算符(除了括號和起始結束符,在構造二叉樹的過程中已被脫去)。如(A|A)&(B|B)構造成的二叉樹如圖1所示圖1 表達式構造的二叉樹 1) 變量的賦值問題若只有1個變量,則有21種情況的賦值;若有2個變量,易知有22種情況的賦值;若有3各變量,則有23種情況的賦值,那么如果有n個變量,就有2n種情況的賦值。既然要對變量進行賦值,首先要找到邏輯表達式中的變量,并確定變量的個數。 2) 邏輯表達式取值的判斷 由上述對運算符的優先級的分析可知,對邏輯表達式的計算,就是中序遍歷由優先級確定的邏輯表達式構成

10、的二叉樹。5)重言式的判別可以將給變量的所有賦值的邏輯表達式的邏輯值相加,如果相加結果與2n相等,則為重言式;若相加結果為0,則為矛盾式;否則為可滿足式。本問題的關鍵和難點在于算符優先級的判斷和二叉樹的構造。三、數據結構的選擇和概要設計1、數據結構的選擇通過問題分析可知,需要用到的數據結構有堆棧和二叉樹。1) 對于堆棧選用順序棧結構來進行存放算符或變量,存放的都是二叉樹的結點。設有兩個堆棧,一個是存放運算符棧,另一個是存放變量或中間結果棧。2) 對于二叉樹,選用二叉樹的鏈接存儲結構,其結點存放得都是表達式中的元素。將表達式構造成一棵二叉樹。2、概要設計從整體上可以分為三個模塊:第一個模塊:屬于

11、堆棧和二叉樹結點類型的定義typedef struct stack /識別表達式使用的堆棧定義,它存放的都是樹的結構 /棧中的元素都是樹的結點結構bitree *base; /棧底指針bitree *top; /棧頂指針int stacksize; /棧容量seqstack;typedef struct node /根據表達式建立的二叉樹的結點定義char data;struct node *lchild; struct node *rchild;BiTNode,*bitree;第二個模塊:主要函數及其功能。 堆棧的創建void creatstack(sqstack &st);初始化棧

12、void setstack(seqstack &st);進棧void push(sqstack &st,bitree e);出棧void pop(sqstack &st,bitree &e);將邏輯表達式中的元素轉換為二叉樹結點的形式,使棧中存儲的都是二叉樹的結點。void creattree(char s,bitree &tree);通過優先級將邏輯表達式構造成一顆完整的二叉樹void create(bitree &zigen,bitree l,bitree r);對邏輯表達式求值int valuetree(bitree tree);生成變量的

13、各種取值組合void creatzuhe(int n,int m,char a);邏輯運算符的優先級判別,返回值為“<”、“>”、“=”char youxianji(char m,char n);第四個模塊為于用戶的交互void user();流程圖: 圖2 程序流程圖開始mainmeun輸入表達式1. 計算機2. 用戶3. 3.返回建樹建樹計算機窮舉用戶輸入變量值輸出結果繼續結束213NY四、算法思想1、窮舉法思想通過真值表來判斷重言式,需要一一給變量賦值,共有2n中情況(n表示變量的個數),這里用到窮舉的思想。2、遞歸與分治思想每給變量賦一組值,通過遞歸中序遍歷二叉樹求值,這里

14、用到了遞歸與分治思想。3、運算符的優先級判斷思想(見問題分析算符的優先級問題分析第5頁)五、詳細設計和主要編碼段首先將用戶輸入的邏輯表達式存到char *str當中,然后去除邏輯表達式中的空格符。for(;*pstr!=NULL;pstr+,n+)if(strn!=' ') strii+=*pstr; /去除表達式中的空格 此時stri當中存儲的就是沒有空格符的邏輯表達式。通過問題分析,需找到表達式中的變量,并確定變量的個數。下面的代碼就是實現此功能。for(int k=0;k< strlen(stri);k+) if(strik>=65&&stri

15、k<=90)/找到變量 int mark=0; /標記變量for(int j=0;j<m;j+)if(blj=strik)/將找到的變量與bl中已找到過的變量比較,若相等則將變量標記置為1,表示找到的變量在前面已出現過mark=1;break;if(mark=0)/若標記為0,表示找到的變量沒有重復,并將其記錄到bl中,變量個數m加1。 blm=strk;m+;/m是變量個數 此時bl當中存儲的就是變量,m就是變量個數,那么變量賦值的情況就有2m種。下面對生成變量的各種取值組合的算法進行分析和說明。int zuhe30用來存儲變量的取值組合,為了方便說明,采用兩個變量進行算法敘述。

16、AB第n次數000011102113 表2 變量賦值實例 從表2可以發現給變量賦值的次數n與變量的取值組合成的二進制數相等,能得到一個規律:變量的取值組合zuhe二進制數(從低位到高位)的第i位數取值等于(n>>i)%2。用一下代碼可以實現第n次對變量的賦值組合int lzp=m;for(int i=0;i<m;i+)zuhebllzp-65=(n>>i)%2;lzp-;下面說明優先級的判斷。char bijiao77用來存放算符間的優先關系表中的數據。int i,j; bijiao77=' ','|','&'

17、;,'','(',')','#', /二維數組比較優先級先后'|','>','<','<','<','>','>','&','>','>','<','<','>','>', '','>',

18、9;>','>','<','>','>','(','<','<','<','<','=',' ',')','>','>','>',' ','>','>','#','<','&

19、lt;','<','<',' ','='for(i=0;i<7;i+)if(bijiao0i=a2) /找到a2運算符的列號break;for(j=0;j<7;j+) /找到a1運算符的行號if(bijiaoj0=a1) break;return bijiaoji; /返回優先級的符號:>、<、=下面說明將表達式構成二叉樹的過程。s=stri是邏輯表達式的首地址。while(*s!=NULL) /循環條件,為空則掃描結束 if(int(*s)>=65&&int(*s

20、)<=90) /讀取的是變量 variables=(bitree)malloc(sizeof(node);/分配結構node的size大小的內存,強制轉換為bitree類型 variables->data=*s; push(variable,variables); /入變量棧else if(int(*s)>90|int(*s)<65) /讀取的邏輯運算符 gettop(logic,e); /取運算符棧的棧頂元素進行優先級比較 switch(youxianji(*s,e->data) case '<': /棧頂的運算符優先級低,邏輯運算符進棧l

21、ogics=(bitree)malloc(sizeof(node);/分配結構node的size大小的內存,強制轉換為bitree類型logics->data=*s;push(logic,logics);break; case '=': pop(logic,kuohao); /括號并接受下一個字符break; case '>': /棧頂的運算符優先級高,變量出棧運算pop(logic,g); /彈出邏輯運算符gpop(variable,a); /彈出變量ab=NULL; /''只有右子樹if(g->data!=''

22、;) pop(variable,b); /出棧變量bcreate(g,b,a); /將變量b作為g的左子樹,a作為g的右子樹,若a是變量,將其左、右孩子置空,若b是變量,將其左、右孩子置空push(variable,g);/將臨時的根g作為新的變量壓入變量棧中gettop(logic,e);/取變量棧棧頂算符eif(*s!='#'&&*s!=')'&&youxianji(*s,e->data)!='>') /如果讀入算符*s不是結束符也不是右括號,并且棧頂算符優先級小于讀入算符優先級將讀入的算符入棧lo

23、gics=(bitree)malloc(sizeof(node);/分配結構node的size大小的內存,強制轉換為bitree類型 logics->data=*s; push(logic,logics); /邏輯運算符入棧 else s=s-1;/若棧頂算符優先級大于讀入算符優先級或讀入算符為“#”或“)” break;s+;tree=g;下面說明對邏輯表達式的求值過程。中序遍歷二叉樹int valuetree(bitree tree) /根據變量的取值組合并利用邏輯表達式的性質對樹進行求值 if(!tree) return 0; /遇到空的結點 else if(tree->da

24、ta!='|'&&tree->data!='&'&&tree->data!='') /找到的是變量return zuheint(tree->data)-65; /返回對應變量賦予的值(0或1) else if(int(tree->data)<65|int(tree->data)>90) /找到的是運算符switch(tree->data) case '|': return(valuetree(tree->lchild)|valuetree

25、(tree->rchild); /遞歸調用 break; case '&': return(valuetree(tree->lchild)&&valuetree(tree->rchild); /遞歸調用 break; case '': return(!valuetree(tree->rchild); /遞歸調用 break; default: return 0;else return 0;最后說明判斷邏輯表達式或為重言式,或為矛盾式或為可滿足式。每給變量一組值,調用一次int valuetree(bitree tr

26、ee)函數求其邏輯值,需要給變量2n組值,則需求其邏輯值2n次,把每次求得的邏輯值相加,得到數字SUM,若SUM=2n,則邏輯表達式為重言式;若SUM=0,則邏輯表達式為矛盾式;若0<SUM<2n,則邏輯表達式為可滿足式。若表達式為可滿足式,則輸出運算中每種賦值和與其相對應的表達式的值。六、上機調試情況記錄出現的問題及解決方法問題:a) 測試題目給定的數據A&B|A&B,發現其結果不正確,原因是沒有正確的解決優先級,建樹的過程中,運算符入棧時,如果檢測到的表達式中的算符優先級低于棧頂的優先級,則應出棧運算符,在出棧運算符后,如果檢測到的表達式中的算符(并且算符不是結

27、束符#也不是)的優先級依舊低于棧頂算符,應該繼續算符出棧,而不是算符入棧。解決方法:將算符入棧條件if(*s!='#'&&*s!=')')改為if(*s!='#'&&*s!=')'&&youxianji(*s,e->data)!='>')b) 測試數據時如果邏輯表達式的變量不是遞增按順序輸入(如:A&B&F&G),結果會出錯。原因是在給變量組合賦值時,賦值組合數組的小標是遞增順序的,而在遞歸調用求值函數時用到的變量組合值數組的下標卻

28、是與變量的ACS編碼有關的,兩者對不上。解決方法:在生成變量組合數時,將zuhei=(n>>i)%2改為zuhealzp-65=(n>>i)%2;七、測試用例、結果及其算法性能分析(一)、初始界面(二)、測試用例及結果(1) (A|A)&(B|B)(重言式)(2) (A&A)&C(矛盾式)(3) A|B|C|D|E|A(重言式)(4) A&B&C&B(矛盾式)(5) (A|B)&(A|B)(可滿足式)(6) A&B|A&B;O ,0;0,1;1,0;1,1 。(可滿足式) 通過測試驗證結果都正確,實

29、現了題目的要求。(三)、算法性能分析1、算法的時間性能分析用窮舉法列真值表有2n(n為變量個數)種情況,為每一種情況的所有變量賦值的次數為n,則為所有情況的變量賦值次數為n*2n次,即在函數void creatzuhe(int n,int m,char a)中的語句需執行n*2n次,是整個算法當中頻度最大的語句,由于算法的時間復雜度考慮的只是對于問題規模n的增長率,所以該算法的時間復雜度為T(n)=O(n*2n)。2、算法的空間性能分析本算法的空間復雜度較低,需要一個zuhe30的數組來存放變量的取值,一個大小為M的數組存放邏輯表達式,一個M的二叉樹鏈接存放邏輯表達式構成的樹結點。兩個堆棧長度

30、不超過M,所以空間復雜度為O(M)。(四)、經驗和體會初拿到本問題,就覺得與學過的帶括號的算術表達式計算問題相似。其最關鍵的是算符優先級的判斷,可以將它類比算術表達式列出同數據結構與算法課本上表4-1類似的算符的優先關系表表1。通過查表來判斷算符的優先級就變得簡易了。觀察邏輯表達式可以發現,對邏輯表達式的計算類似于對二叉樹的中序遍歷,可以將邏輯表達式通過優先級將其構造成一棵二叉樹。當然最終實現過程中有很多細節問題需要注意,通過一步步測試、調試程序找到問題,并改善,知道最終解決問題。八、用戶使用說明1、運行程序進入顯示文本方式的用戶界面;2、根據提示輸入要判別的邏輯表達式(表達式中可以有空格)3

31、、輸入表達式后出現菜單選項,用戶可以選擇程序自動窮舉賦值法和用戶賦值法進行判別;4、在顯示相應結果后,根據提示信息在進行下一步。九、參考文獻1 王昆侖,李紅. 數據結構與算法. 北京:中國鐵道出版社,2006年5月。2 嚴蔚敏,吳偉明. 數據結構. 北京:清華大學出版社,2007年5月。3 李春葆. 數據結構教程. 北京:清華大學出版社,2003年5月。4蹇強,羅宇. 數據結構. 北京:郵電大學出版社,2004年5月。5 金遠平. 數據結構(C+描述. 北京:清華大學出版社 2005年5月。十、附錄(完整代碼)#include "stdlib.h" /調用stdlib.h

32、里面的函數#include "stdio.h"#include "iostream.h" #include "string.h"/包含字符串處理函數的頭文件#include "math.h"/調用數學函數庫#include "iomanip.h"/是I/O流控制頭文件#define maxsize 100int zuhemaxsize; /變量的取值組合數組定義int N; /變量個數typedef struct node /根據表達式建立的二叉樹的結點定義char data;struct no

33、de *lchild; struct node *rchild;BiTNode,*bitree;typedef struct stack /識別表達式使用的堆棧定義,它存放的都是樹的結構 /棧中的元素都是樹的結點結構bitree *base; /棧底指針bitree *top; /棧頂指針int stacksize; /棧容量seqstack;void creatzuhe(int n,int m,char a)/生成變量的組合數 int lzp=m-1;for(int i=0;i<m;i+)zuhealzp-65=(n>>i)%2;lzp-;void create(bitre

34、e &f,bitree l,bitree r) /自底向上地根據運算符地優先級來建立分子樹函數 f->lchild=l; /分樹的鏈接 f->rchild=r; /分樹的鏈接 if(l&&r)if(int(l->data)>=65&&int(l->data)<=90) /左子樹l->lchild=NULL;l->rchild=NULL;if(int(r->data)>=65&&int(r->data)<=90) /右子樹r->lchild=NULL;r->

35、rchild=NULL;char youxianji(char m,char n) /邏輯運算符的優先級判別int i,j;char bijiao77=' ','|','&','','(',')','#', /二維數組比較優先級先后'|','>','<','<','<','>','>','&','&

36、gt;','>','<','<','>','>', '','>','>','>','<','>','>','(','<','<','<','<','=',' ',')','&

37、gt;','>','>',' ','>','>','#','<','<','<','<',' ','='for(i=0;i<7;i+)if(bijiao0i=m) /找到m運算符的列號break;for(j=0;j<7;j+) /找到n運算符的行號if(bijiaoj0=n) break;return bijiaoji; /返回優先級的符

38、號:>、<、=void setstack(seqstack &st) /初始化棧st.base=(bitree *)malloc(maxsize*sizeof(node);st.top=st.base; st.stacksize=maxsize; /棧容量void push(seqstack &st,bitree e) /入棧if(st.top-st.base<st.stacksize) /符合條件入棧*st.top=e;st.top+; else cout<<"ERROR!"<<endl; /不符合輸出ERROR!

39、void pop(seqstack &st,bitree &e) /出棧if(st.top=st.base) cout<<"ERROR!"<<endl; /不符合條件輸出ERROR! st.top-; /符合條件 e=*st.top;void gettop(seqstack &st,bitree &e) /取棧頂元素if(st.top=st.base) cout<<"ERROR!"<<endl/不符合條件輸出ERROR! e=*(st.top-1); /符合取棧頂元素void

40、 creattree(char s,bitree &tree) /根據邏輯表達式將數據存入二叉樹中,定義兩個棧 seqstack variable; /變量棧 seqstack logic; /邏輯運算符棧 setstack(variable); /變量棧初始化 setstack(logic); /邏輯運算符棧初始化 bitree logic1,variables,logics,e,a,b,g,kuohao;/定義棧中的元素,g為最后的二叉樹的根 logic1=(bitree)malloc(sizeof(node);/分配結構node的size大小的內存,強制轉換為bitree類型 l

41、ogic1->data='#' /將邏輯運算符棧的棧底元素設為'#' push(logic,logic1); /將邏輯運算符棧入棧. while(*s!=NULL) if(int(*s)>=65&&int(*s)<=90) /讀取的是變量 variables=(bitree)malloc(sizeof(node);/分配結構node的size大小的內存,強制轉換為bitree類型 variables->data=*s; push(variable,variables); /入變量棧else if(int(*s)>90

42、|int(*s)<65) /讀取的邏輯運算符 gettop(logic,e); /取運算符棧的棧頂元素進行優先級比較 switch(youxianji(*s,e->data) case '<': /棧頂的運算符優先級低,邏輯運算符進棧logics=(bitree)malloc(sizeof(node);/強制轉換為bitree類型logics->data=*s;push(logic,logics);break; case '=': pop(logic,kuohao); /括號并接受下一個字符break; case '>

43、9;: /棧頂的運算符優先級高,變量出棧運算pop(logic,g); /彈出邏輯運算符pop(variable,a); /彈出變量b=NULL; /''只有右子樹if(g->data!='') pop(variable,b); create(g,b,a); /建樹的函數調用 push(variable,g);/將臨時的根作為新的變量壓入變量棧中gettop(logic,e);if(*s!='#'&&*s!=')'&&youxianji(*s,e->data)!='>

44、9;) logics=(bitree)malloc(sizeof(node);/強制轉換為bitree類型 logics->data=*s; push(logic,logics); /邏輯運算符入棧else s=s-1;break;s+;tree=g; int valuetree(bitree tree) /根據變量的取值組合并利用邏輯表達式的性質對樹進行求值 if(!tree) return 0; /遇到空的結點 else if(tree->data!='|'&&tree->data!='&'&&tre

45、e->data!='') /找到的是變量return zuheint(tree->data)-65; /返回值 else if(int(tree->data)<65|int(tree->data)>90) /找到的是運算符switch(tree->data) case '|': return(valuetree(tree->lchild)|valuetree(tree->rchild); break; case '&': return(valuetree(tree->lchild

46、)&&valuetree(tree->rchild); break; case '': return(!valuetree(tree->rchild); break; default: return 0;else return 0;void user(int m,char b) /用戶輸入變量的一組取值情況 int i; cout<<"請依次輸入你的變量取值(0或1)"<<endl; for(i=0;i<m;i+) cout<<bi<<" " /轉化為cha

47、r類型輸出 cout<<endl;for(i=0;i<m;i+) cin>>zuhebi-65;void print()cout<<""<<endl; cout<<" "<<endl; cout<<" 你好! "<<endl; cout<<" 歡迎使用重言式判別軟件! "<<endl; cout<<" "<<endl; cout<<&q

48、uot;"<<endl;void meun() /菜單函數system("cls"); /清屏函數print();char strmaxsize,strimaxsize,*pstr,q,bl20;int j,i=0,choose=1,sum,n=0,m=0;bitree Tree;int SUM=0; /用于累加變量的每種組合的邏輯表達式的結果;cout<<"請輸入邏輯表達式的表達式:例如(A|B&C) "<<endl;scanf("%n",str); /讀取包含多個空格的邏輯表達

49、式pstr=str;for(;*pstr!=NULL;pstr+,n+) /邏輯表達式的正確讀取,if(strn>=97&&strn<=122) strn=strn-32;/將小寫轉換成大寫if(strn!=' ') strii+=*pstr; /去除表達式中的空格 int nu=strlen(stri);for(int k=0;k<nu;k+) if(strik>=65&&strik<=90) int mark=0; /標記變量for(int j=0;j<m;j+)if(blj=strik)mark=1;br

50、eak;if(mark=0)blm=strk;m+;/m是變量個數 sum=int(pow(2,m); strii='#' /最后一字符后加入'#',與運算符棧的棧底元素'#'對應strii+1='0' /結束標志'0'cout<<"請選擇你要的操作"<<endl; cout<<" "<<endl; cout<<" "<<endl; cout<<" "&

51、lt;<endl; cout<<" "<<endl;cout<<" 1 計算機窮舉法 "<<endl;cout<<" 2 用戶自定義給變量賦值 "<<endl;cout<<" 3 重新開始 "<<endl;cout<<" 0 退出 "<<endl;cout<<"請選擇你要的操作: " /提示信息cin>>choose;while

52、(choose!=1&&choose!=2&&choose!=3&&choose!=0)cout<<"您輸入的有誤,請您重新輸入:" /提示信息cin>>choose;switch(choose)case 1:/判別重言式的類別creattree(stri,Tree); /建立重言式的二叉樹 for(j=0;j<sum;j+) creatzuhe(j,m,bl); /產生變量取值組合SUM+=valuetree(Tree); /SUM累加 strii='0' /加入結束標志以便輸出邏輯表達式 if(SUM=0) /矛盾式cout<<"邏輯表達式:"<<stri<<endl;cout<<"False forever"<<endl;if(SUM=sum) /重言式

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論