課程設計---重言式判別_第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  計算機科學學院</b></p><p><b>  課程設計報告</b></p><p>  課 程 數(shù)據(jù)結構</p><p>  題 目 重言式判別</p><p>  年 級 &l

2、t;/p><p>  專 業(yè) 軟件工程</p><p>  學 生 </p><p>  學 號 </p><p>  指導教師 </p><p>  2012年11月7日</p><p><b&

3、gt;  重言式判別</b></p><p><b>  目的</b></p><p>  鞏固和加深對數(shù)據(jù)結構的理解,通過上機實驗、調試程序,加深對課本知識的理解,最終使學生能夠熟練應用數(shù)據(jù)結構的知識寫程序。</p><p> ?。?)通過本課程的學習,能熟練掌握幾種基本數(shù)據(jù)結構的基本操作。</p><p>

4、; ?。?)能針對給定題目,選擇相應的數(shù)據(jù)結構,分析并設計算法,進而給出問題的正確求解過程并編寫代碼實現(xiàn)。</p><p><b>  需求分析</b></p><p> ?。?)邏輯表達式從終端輸入,長度不超過一行。邏輯運算符包括“|”,“&”和“~”,</p><p>  分別表示或、與和非,運算優(yōu)先程度遞增,但可以有括號改變,即括

5、號內的運算優(yōu)先。邏輯變元為大寫字母。表達式中任何地方都可以含有多個空格符。</p><p> ?。?)若是重言式或矛盾式,可以只“顯示True forever”或“False forever”,否則顯示“Satisfactible”以及變量名序列,與用戶交互。若用戶對表達式中變元取一組值,程序就求出并顯示邏輯表達式的值。</p><p><b>  (3)測試數(shù)據(jù):</b&

6、gt;</p><p>  ①(A|~A)&(B|~B)</p><p> ?、?A&|~A)&C</p><p> ?、跘|B|C|D|E|~A</p><p><b> ?、蹵&B&C&~B</b></p><p> ?、?A|B)&(A

7、|~A)</p><p> ?、轆&~B|~A&B</p><p><b>  概要設計</b></p><p>  1、數(shù)據(jù)結構的設計 </p><p>  //根據(jù)表達式建立的二叉樹的結點定義,由于表達式的求值類似二叉樹的中序遍歷,故我們可以ijiang表達式構造為一個二叉樹;</p>

8、<p>  typedef struct btdnode{}*bitree;</p><p>  //識別表達式使用的堆棧定義,它存放的都是樹的結構,鑒于邏輯符號的優(yōu)先不同,我們需要用到堆棧;</p><p>  typedef struct lnode_optr{}sqstack;</p><p><b>  2、算法的設計</b>

9、</p><p>  本設計從總體上劃分可分為四個模塊,</p><p>  第一個模塊為樹與堆棧的創(chuàng)建。</p><p>  void create(bitree &zigen,bitree l,bitree r){};void creatstack(sqstack &st){};void creattree(char s[],bitree &am

10、p;tree){};</p><p>  第二個模塊為對樹與堆棧的操作,包括對樹的取值以及堆棧的入棧,出棧操作。</p><p>  int value_tree(bitree tree){};void push(sqstack &st,bitree e){};</p><p>  void pop(sqstack &st,bitree &e

11、){}</p><p>  第三個模塊為對表達式的邏輯運算符的判別。</p><p>  char youxianji(char lie,char hang){};void gettop(sqstack &st,bitree &e){};</p><p>  第四個模塊為于用戶的交互。</p><p>  void user(

12、){};</p><p>  3、抽象數(shù)據(jù)類型的 設計</p><p>  根據(jù)所設計的數(shù)據(jù)結構和 函數(shù)接口,設計抽象數(shù)據(jù)類型。</p><p>  ADT Binary Tree{</p><p>  數(shù)據(jù)對象:D是具有相同特性的數(shù)據(jù)元素的集合。</p><p><b>  二叉樹數(shù)據(jù)關系:</b&g

13、t;</p><p>  若D為空集,稱BinaryTree 為空二叉樹;</p><p>  否則 關系 R={H};</p><p>  在D中存在唯一的成為根的數(shù)據(jù)元素root,它在關系H下無前驅;</p><p>  D中其余元素必可分為兩個互不相交的子集L和R,每一個子集都是一棵符合本定義的二叉樹,并分別為root的左子樹和右子樹。

14、如果左子樹L不空,則必存在一個根結點,它是root的“左后繼”(<root>∈H),如果右子樹R不空,則必存在一個根結點為root的“右后繼”(<root>∈H)。</p><p><b>  基本操作P:</b></p><p><b>  {結構初始化}</b></p><p>  initBi

15、Tree(&T);</p><p>  操作結果:構造二叉樹T。</p><p>  CreateBiTree(&T,definition);</p><p>  初始條件:definition給出二叉樹T的定義。</p><p>  操作結果:按definition構造二叉樹T。</p><p>&l

16、t;b>  {銷毀結構}</b></p><p>  DestroyBiTree(&T);</p><p>  初始條件:二叉樹T存在。</p><p>  操作結果:銷毀二叉樹T。</p><p><b>  {引用型操作}</b></p><p>  BiTreeEm

17、pty(T);</p><p>  初始條件:二叉樹T存在。</p><p>  操作結果:若二叉樹為空二叉樹,則返回TRUE,否則返回FALSE。</p><p>  和數(shù)相同,創(chuàng)建二叉樹的算法取決于它的數(shù)據(jù)元素之間關系的輸入方式。</p><p><b>  Root(T)</b></p><p&

18、gt;  初始條件:二叉樹T存在。</p><p>  操作結果:返回T的根。</p><p>  Value(T,e)</p><p>  初始條件:二叉樹T存在,e是T中某個結點。</p><p>  操作結果:返回e的值。</p><p>  Parent(T,e);</p><p>  

19、初始條件:二叉樹T存在,e是T中某個結點。</p><p>  操作結果:若e是T的非根結點,則返回它的雙親,否則返回“空”。</p><p>  LeftChild(T,e);</p><p>  初始條件:二叉樹T存在,e是T中某個結點。</p><p>  操作結果:返回T的左孩子,若e無左孩子,則返回“空”。</p>&

20、lt;p>  RightChild(T,e);</p><p>  初始條件:二叉樹T存在,e是T中某個結點。</p><p>  操作結果:返回T的右孩子,若e無左孩子,則返回“空”。</p><p><b>  }</b></p><p><b>  堆棧數(shù)據(jù)關系:</b></p&g

21、t;<p>  ADT Stack{</p><p>  InitStack(&S) </p><p>  操作結果:構造一個空棧。</p><p>  DestroyStack(&S)</p><p>  初始條件:棧S存在。</p><p>  操作結果:棧S被銷毀。</p

22、><p>  GetTop(S,&e)</p><p>  初始條件:棧S已存在且非空。</p><p>  操作結果:用e返回S的棧頂元素。</p><p>  Push(&S,e)</p><p>  初始條件:棧S已存在。</p><p>  操作結果:插入結點為e的新

23、的棧頂元素。</p><p>  Pop(&S,&e)</p><p>  初始條件:棧S已存在且非空。</p><p>  操作結果:刪除S的棧頂元素,并用e返回其值。</p><p><b>  }</b></p><p><b>  算法思想:</b>

24、;</p><p>  自底向上地根據(jù)運算符地優(yōu)先級來建立分子樹函數(shù);當邏輯表達式讀完后-子根root就是一棵完整的二叉樹。用窮舉法得出所有可能組合,對二叉樹進行先序遍歷,對存放在上面的表達式進行求值。并用兩個棧分別存放運算符和變量,來判別是否為重言式。</p><p><b>  詳細設計</b></p><p>  設計抽象數(shù)據(jù)類型對應的類

25、定義。(如用C實現(xiàn)則沒有這項)</p><p>  typedef struct btdnode</p><p><b>  {</b></p><p>  char data;</p><p>  struct btdnode *lchild; </p><p>  struct btdnode

26、 *rchild;</p><p><b>  }*bitree;</b></p><p>  //識別表達式使用的堆棧定義,它存放的都是樹的結構;</p><p>  typedef struct lnode_optr</p><p><b>  { </b></p>&

27、lt;p>  struct btdnode **base; //棧中的元素都是樹的結點結構;</p><p>  struct btdnode **top;</p><p>  int stacksize;</p><p><b>  }sqstack;</b></p><p>  設計每個 成員函數(shù);<

28、;/p><p>  void creatzuhe(int n){//用于產(chǎn)生變量的各種取值組合;</p><p>  int i,num=0,j=0,e;</p><p>  int temp[bianliang_max];</p><p>  for(i=0;i<N;i++)</p><p>  zuhe[i]=0

29、;</p><p><b>  while(n){</b></p><p><b>  e=n%2;</b></p><p><b>  num++;</b></p><p>  temp[j++]=e;</p><p><b>  n=n/2

30、;</b></p><p><b>  }</b></p><p><b>  j=j-1;</b></p><p>  num=N-num;</p><p>  while(j>=0){</p><p>  e=temp[j--];</p>

31、<p>  zuhe[num++]=e;</p><p><b>  }</b></p><p><b>  }</b></p><p>  //自底向上地根據(jù)運算符地優(yōu)先級來建立分子樹函數(shù);當邏輯表達式讀完后-子根zigen就是一棵完整的二叉樹</p><p>  int k=0;//建

32、樹的標志,k=1表示第一次建立分子樹,要對左右孩子的指針域處理</p><p>  void create(bitree &zigen,bitree l,bitree r){</p><p>  zigen->lchild=l;</p><p>  zigen->rchild=r;//分樹的鏈接</p><p><b

33、>  if(l&&r){</b></p><p>  if(int(l->data)>=65&&int(l->data)<=90){</p><p>  l->lchild=NULL;</p><p>  l->rchild=NULL;</p><p>&l

34、t;b>  }</b></p><p>  if(int(r->data)>=65&&int(r->data)<=90){</p><p>  r->lchild=NULL;</p><p>  r->rchild=NULL;</p><p><b>  }<

35、;/b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //邏輯運算符的優(yōu)先級判別;</p><p>  char youxianji(char lie,char hang){</p><p>  int i,

36、j;</p><p>  char bijiao[7][7]={' ','|','&','~','(',')','#',</p><p>  '|','>','<','<','<

37、;','>','>',</p><p>  '&','>','>','<','<','>','>',

38、

39、 </p><p>  '~','>',

40、9;>','>','<','>','>',</p><p>  '(','<','<','<','<','=',' ',</p><p>  ')

41、','>','>','>',' ','>','>',</p><p>  '#','<','<','<','<',' ','='};</p&

42、gt;<p>  for(i=0;i<7;i++)</p><p>  if(bijiao[0][i]==lie)</p><p><b>  break;</b></p><p>  for(j=0;j<7;j++)</p><p>  if(bijiao[j][0]==hang)</p

43、><p><b>  break;</b></p><p>  return bijiao[j][i];</p><p><b>  }</b></p><p>  //對操作符棧和變量堆棧的操作;</p><p>  void creatstack(sqstack &s

44、t){</p><p>  st.base=(bitree*)malloc(stack_size_normal*sizeof(btdnode));</p><p>  if(!st.base) exit(0);</p><p>  st.top=st.base;</p><p>  st.stacksize=stack_size_normal

45、;</p><p><b>  }</b></p><p>  void push(sqstack &st,bitree e){</p><p>  if(st.top-st.base<st.stacksize)</p><p>  *st.top++=e;</p><p>  el

46、se exit(0);</p><p><b>  }</b></p><p>  void pop(sqstack &st,bitree &e){</p><p>  if(st.top==st.base) exit(0);</p><p>  e=*--st.top;</p><p

47、><b>  }</b></p><p>  void gettop(sqstack &st,bitree &e){//取運算符棧的棧頂元素進行優(yōu)先級比較</p><p>  if(st.top==st.base) exit(0);</p><p>  e=*(st.top-1);</p><p>

48、<b>  }</b></p><p>  void creattree(char s[],bitree &tree){//重言式的識別函數(shù);</p><p>  sqstack variable; //變量棧;</p><p>  sqstack logic; //邏輯運算符棧; </p>

49、<p>  creatstack(variable);</p><p>  creatstack(logic);</p><p>  bitree logic_di,variables,logics,e,a,b,theta,kuohao; //定義棧中的元素;</p><p>  //theta為最后的二叉樹的根;</p><p&

50、gt;  logic_di=(bitree)malloc(sizeof(btdnode));</p><p>  if(!logic_di) exit(0);</p><p>  logic_di->data='#';</p><p>  push(logic,logic_di);</p><p>  while(*s

51、!=NULL){ </p><p>  if(int(*s)>=65&&int(*s)<=90){ </p><p>  variables=(bitree)malloc(sizeof(btdnode));</p><p>  if(!variables) exit(0);</p><p>  vari

52、ables->data=*s;</p><p>  push(variable,variables);</p><p><b>  }</b></p><p>  else if(int(*s)>90||int(*s)<65){ </p><p>  gettop(logic,e);//取運算符棧的棧

53、頂元素進行優(yōu)先級比較</p><p>  switch(youxianji(*s,e->data)){</p><p>  case '<': //棧頂?shù)倪\算符優(yōu)先級低,邏輯運算符進棧</p><p>  logics=(bitree)malloc(sizeof(btdnode));</p><p>  if(!l

54、ogics) exit(0);</p><p>  logics->data=*s;</p><p>  push(logic,logics);</p><p><b>  break;</b></p><p>  case '='://脫括號并接受下一個字符;</p><p&

55、gt;  pop(logic,kuohao);break;</p><p>  case '>':pop(logic,theta);//彈出邏輯運算符</p><p>  pop(variable,a);//彈出變量</p><p><b>  b=NULL;</b></p><p>  if(th

56、eta->data!='~')</p><p>  pop(variable,b);</p><p><b>  //建樹的函數(shù)調用</b></p><p><b>  k=k+1;</b></p><p>  create(theta,b,a);</p><

57、;p>  push(variable,theta);//將臨時的根作為新的變量壓入變量棧中;</p><p>  if(*s!='#'&&*s!=')') {</p><p>  logics=(bitree)malloc(sizeof(btdnode));</p><p>  if(!logics) exit

58、(0);</p><p>  logics->data=*s;</p><p>  push(logic,logics);</p><p><b>  }</b></p><p>  else s=s-1;</p><p><b>  break;</b></p

59、><p><b>  }</b></p><p><b>  }</b></p><p><b>  s++;</b></p><p><b>  }</b></p><p>  tree=theta;</p><p

60、><b>  }</b></p><p>  //根據(jù)變量的取值組合并利用邏輯表達式的性質對樹進行求值 </p><p>  int value_tree(bitree tree){</p><p>  if(!tree) return 0; //遇到空的結點;</p><p>  if(tree->dat

61、a=='('){</p><p>  while(tree->data!='(')</p><p>  value_tree(tree);</p><p><b>  }</b></p><p>  else if(tree->data!='|'&&am

62、p;tree->data!='&'&&tree->data!='~'&&tree->data!='('&&tree->data!=')')//找到的是變量;</p><p>  return zuhe[int(tree->data)-65];</p>

63、<p>  else if(int(tree->data)<65||int(tree->data)>90) //找到的是運算符;</p><p>  switch(tree->data){</p><p>  case '|': return(value_tree(tree->lchild)||value_tr

64、ee(tree->rchild));</p><p>  case '&': return(value_tree(tree->lchild)&&value_tree(tree->rchild));</p><p>  case '~': return(!value_tree(tree->rchild));<

65、;/p><p><b>  }</b></p><p><b>  }</b></p><p>  //用戶設定變量的一種取值;</p><p>  void user()</p><p><b>  {</b></p><p>&l

66、t;b>  int i;</b></p><p>  cout<<"請依次輸入你的變元取值"<<endl;</p><p>  for(i=65;i<65+N;i++)</p><p><b>  {</b></p><p>  cout<<

67、char(i)<<" = ";</p><p>  cin>>zuhe[i-65];</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  設計主函數(shù)</b></p>

68、<p>  void main(){</p><p>  char str[str_max],string[str_max],*pstr;</p><p>  int loop=20,choice,i=0,choose,sum;</p><p>  bitree Tree;</p><p>  while(loop)</p&

69、gt;<p><b>  {</b></p><p>  cout<<"\t\t\t****************************"<<endl;</p><p>  cout<<"\t\t\t****************************"<<e

70、ndl;</p><p>  cout<<"\t\t\t數(shù)據(jù)結構課程設計"<<endl;</p><p>  cout<<"\t\t\t設計題目:重言式判別"<<endl;</p><p>  cout<<"\t\t\t班級:軟工10"<&l

71、t;endl;</p><p>  cout<<"\t\t\t姓名:汪國志"<<endl;</p><p>  cout<<"\t\t\t****************************"<<endl;</p><p><b>  pstr=str;</b

72、></p><p><b>  i=0;</b></p><p>  int SUM=0,l; //用于累加變量的每種組合的邏輯表達式的結果;可以作為邏//輯表達式類別判別的根據(jù)</p><p>  cout<<"請輸入邏輯表達式的變量的個數(shù)"<<endl;</p><p

73、><b>  cin>>N;</b></p><p>  sum=int(pow(2,N)); //變量組合的總數(shù);</p><p>  cout<<"請輸入邏輯表達式的表達式(或用'|',與用'&'和非用'~')"<<endl;</p>

74、<p>  cout<<"(取多變量時請按A,B,C字母順序來選?。?quot;<<endl<<endl;;</p><p><b>  cin>>str;</b></p><p>  //重言式的正確讀取;</p><p>  for(;*pstr!=NULL;pstr++

75、)</p><p>  if(*pstr!=' ') string[i++]=*pstr;</p><p>  string[i]='#';</p><p>  string[i+1]='\0';</p><p>  creattree(string,Tree);//建立重言式的二叉樹;<

76、/p><p>  for(loop=0;loop<sum;loop++){</p><p>  creatzuhe(loop);//產(chǎn)生變量取值組合;</p><p>  SUM+=value_tree(Tree);</p><p><b>  }</b></p><p>  string[i]

77、='\0';</p><p>  cout<<endl;</p><p>  if(SUM==0) cout<<" False forever"<<endl<<endl;;</p><p>  if(SUM==sum) cout<<" True Forever

78、"<<endl<<endl;;</p><p>  if (SUM>0&&SUM<sum){</p><p>  cout<<" Statisfactible"<<endl;</p><p>  cout<<endl;</p><

79、p><b>  user();</b></p><p>  cout<<"邏輯表達式的值為:"<<value_tree(Tree)<<endl;</p><p><b>  }</b></p><p>  cout<<"是否繼續(xù)進行運算?是

80、按1/ 否按0:";</p><p>  cin>>choice;</p><p>  if(choice==0)</p><p><b>  exit(0);</b></p><p><b>  loop--;</b></p><p><b>

81、;  }</b></p><p><b>  }</b></p><p><b>  調試分析</b></p><p>  在調試過程中出現(xiàn)以下問題:</p><p>  error C2065: 'malloc' : undeclared identifier</

82、p><p>  error C2065: 'exit' : undeclared identifier</p><p>  原因是因為缺少了頭文件#include<stdlib.h></p><p>  在運行過程中,不能有效地解決()的優(yōu)先級問題</p><p>  解決方法:在對樹的遍歷函數(shù)value_tree(b

83、itree tree){}中添加以下語句即可</p><p>  if(tree->data=='('){</p><p>  while(tree->data!='(')</p><p>  value_tree(tree);</p><p><b>  }</b></

84、p><p><b>  測試結果</b></p><p>  測試數(shù)據(jù)①(A|~A)&(B|~B)</p><p>  當A、B取值為0,0;0,1;1,0;1,1;時表達式的值分別為1,1,1,1,為重言式。</p><p>  測試數(shù)據(jù)②(A&|~A)&C</p><p>

85、  當A、C取值為0,0;0,1;1,0;1,1;時表達式的值分別為0,0,0,0,為矛盾式。</p><p>  測試數(shù)據(jù)③A|B|C|D|E|~A</p><p><b>  測試結果為重言式。</b></p><p>  測試數(shù)據(jù)④A&B&C&~B</p><p><b>  測試

86、結果為矛盾式。</b></p><p>  ⑤(A|B)&(A|~A)</p><p>  測試結果為非重言式和矛盾式。</p><p>  測試數(shù)據(jù)⑥A&~B|~A&B</p><p>  測試結果為非重言式和矛盾式。</p><p><b>  用戶使用說明</b

87、></p><p>  從以上六個測試用例來看,結果正確。但是程序還有一些有待解決的問題。比如,表達式中沒有解決空格的問題,當有空格存在,就無法繼續(xù)下去。另一個問題是表中顯示的大寫字母和表達式中的大寫字母不對應,只是機械的按照次序。</p><p>  但總的來說程序已經(jīng)比較完善,書上的要求也基本符合,并且加入了對矛盾式的判別。</p><p><b&g

88、t;  課設總結</b></p><p>  1,通過本次試驗,更加鞏固了我二叉樹這種數(shù)據(jù)結構的理解,完全掌握了它們的基本操作。</p><p>  2,借助單步調試功能和數(shù)據(jù)窗口,可以加快找到程序中的錯誤點,調試能力有大幅度的提高。</p><p>  3,通過對出現(xiàn)的錯誤不斷的改正,鞏固了自己的薄弱環(huán)節(jié),加深了對知識的理解,動手操作能力有了很大的提高

溫馨提示

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

評論

0/150

提交評論