課程設(shè)計(jì)--重言式的判別_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論