《重言式判別源碼及課程設(shè)計-c語言版》由會員分享,可在線閱讀,更多相關(guān)《重言式判別源碼及課程設(shè)計-c語言版(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、精選優(yōu)質(zhì)文檔-傾情為你奉上重言式的判別題目:一個邏輯表達(dá)式如果對于其変元的任一種取值都為真,則稱為重言式;反之,如果對于其變元的任一種取值都為假,則稱為矛盾式;然而,更多的情況下,既非重言式,也非矛盾式。試寫一程序,通過真值表判別一個邏輯表達(dá)式屬于上述哪一類。一、需求分析1、邏輯表達(dá)式從終端輸入,長度不超過一行。2、邏輯運算符包括“|”“&”“”表示或 與 非。運算符優(yōu)先程度遞增,但是可由括號改變。3、邏輯變元為大寫字母表達(dá)式中任何地方都可以含有多個空格符。4、運用自底向上的算符優(yōu)先法5、重言式顯示“true forever”;矛盾式顯示“false forever”;否則顯示“satisfa
2、ctible”。二、概要設(shè)計為實現(xiàn)上述需求需要用到自底向上的算符優(yōu)先法,和自頂向下分割,先序遍歷建立二叉樹的方法。自底向上的算符優(yōu)先法:char OPTRCHART77= ,|,&,(,),#, |, &, ,(,),#,data,*p)case :break;/*switch*/建立二叉樹:typedef struct BiTNodestruct BiTNode * Lchild;struct BiTNode * Rchild;ElemType data;BiTNode , *BiTree;棧中的操作:typedef struct NodeBiTree * base;BiTree *top;
3、int stacksize;SqStack;入棧操作及出棧銷毀棧的操作:int InitStack(SqStack * stack)stack-base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree);if(!stack-base)exit(OVERFLOW);stack-top=stack-base;stack-stacksize=STACK_INIT_SIZE;return OK;BiTree GetTop(SqStack * stack)if(stack-top=stack-base)return NULL;return *(stack-to
4、p-1);int Push(SqStack * stack,BiTree Bitnode)if(stack-top-stack-base=stack-stacksize)stack-base=(BiTree*)realloc(stack-base,(stack-stacksize+STACKINCREAMENT)*sizeof(BiTree);if(!stack-base)exit(OVERFLOW);stack-top=stack-base+stack-stacksize;stack-stacksize+=STACKINCREAMENT;*(stack-top)=Bitnode;stack-
5、top+;return OK;BiTree Pop(SqStack * stack)if(stack-top=stack-base)return ERROR;return *(-stack-top);int DestroyStack (SqStack * stack)free(stack-base);return OK;三、詳細(xì)設(shè)計詳細(xì)程序如下:#include#include#include#include#define OK 1#define ERROR 0#define VARIMAXNUM 20 #define STARMAXLEN 100 #define STACK_INIT_SIZ
6、E 100 /棧的最大長度#define STACKINCREAMENT 10 /每次增加的棧的長度#define ElemType char 將elemtype定義為char型typedef struct BiTNode /創(chuàng)建樹節(jié)點 按照書上原樣創(chuàng)建struct BiTNode * Lchild;struct BiTNode * Rchild;ElemType data; /字符型BiTNode , *BiTree;typedef struct Node /棧BiTree * base;BiTree *top;int stacksize;SqStack;char OPTRCHART77=
7、/此舉是為了后面的優(yōu)先級考慮 ,|,&,(,),#,|,&,(,),#,base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree);if(!stack-base)exit(OVERFLOW);stack-top=stack-base;stack-stacksize=STACK_INIT_SIZE;return OK;BiTree GetTop(SqStack * stack) /返回值為BiTree類型的 取棧頭if(stack-top=stack-base)return NULL;return *(stack-top-1);int Push(SqS
8、tack * stack,BiTree Bitnode) /將樹的節(jié)點放進(jìn)棧的操作,入棧if(stack-top-stack-base=stack-stacksize)stack-base=(BiTree*)realloc(stack-base,(stack-stacksize+STACKINCREAMENT)*sizeof(BiTree);if(!stack-base)exit(OVERFLOW);stack-top=stack-base+stack-stacksize;stack-stacksize+=STACKINCREAMENT;*(stack-top)=Bitnode;stack-t
9、op+;return OK;BiTree Pop(SqStack * stack) /取值指針后移if(stack-top=stack-base)return ERROR;return *(-stack-top);int DestroyStack (SqStack * stack) /毀棧 free(stack-base);return OK;char strSTARMAXLEN;int varitabVARIMAXNUM+1;int sum;BiTree root;SqStack OPTR,OPND;char cmp(char a,char b) /取左右交叉的符號即“”“=”int i,j
10、;for(i=0;i=6;i+)if(OPTRCHARTi0=a)break;for(j=0;jdata=#;Push(&OPTR,temp);while(*p!=#)|(GetTop(&OPTR)-data!=#)if(*p=65)&(*p=97)&(*pdata=*p;temp-Lchild=NULL;temp-Rchild=NULL;Push(&OPND,temp);p+;elseswitch(cmp(GetTop(&OPTR)-data,*p) /開始判斷優(yōu)先級case data=*p;temp-Lchild=NULL;temp-Rchild=NULL;Push(&OPTR,temp)
11、; p+;break;case =:temp=Pop(&OPTR);free(temp);p+;break;case :temp=Pop(&OPTR);b=Pop(&OPND);temp-Rchild=b;if(temp-data!=)a=Pop(&OPND);temp-Lchild=a;Push(&OPND,temp);break;/*switch*/*else*/*while*/root=Pop(&OPND);temp=Pop(&OPTR);free(temp);void DestroyBiTree(BiTree tree) /銷毀樹并取出需要的值if(!tree)return;else
12、if(tree-Lchild=NULL)&(tree-Rchild=NULL)free(tree);return;elseDestroyBiTree(tree-Lchild);DestroyBiTree(tree-Rchild);free(tree);int GetValue(BiTree tree) if(!tree)return 0;else if(tree-data=65)&(tree-datadata-64;else if(tree-data=97)&(tree-datadata-96;elseswitch(tree-data)case |:return (GetValue(tree-
13、Lchild)|GetValue(tree-Rchild);case &:return (GetValue(tree-Lchild)&GetValue(tree-Rchild); case :return (!GetValue(tree-Rchild);void destroy() /銷毀棧DestroyStack (&OPTR);DestroyStack (&OPND);void init()InitStack(&OPTR);InitStack(&OPND);*varitab=0;sum=(int)pow(2.0,*varitab);root=NULL;str0=#;void input()
14、 / 為了能繼續(xù)輸入需要判別的式子char *p,*q;printf(請輸入要判斷的式子中變量的數(shù)目n);scanf(%d,varitab);while(*varitab0)printf(錯誤,請重新輸入數(shù)字!n); printf(請輸入要判斷的式子中變量的數(shù)目:n);scanf(%d,varitab);getchar();sum=(int)pow(2.0,*varitab);printf(輸入要判別的式子:n);gets(str);for(p=q=str;*p;p+)if(*p!= )*q+=*p;*q=#;void Varitab(int n)int i;for(i=0;ii)%2;voi
15、d table()int i,j,value;printf(真值表為:n);for(i=1;i=*varitab;i+)printf( %c,64+i);printf(n);for(i=0;isum;i+)Varitab(i);for(j=1;j=*varitab;j+)printf(%d,varitabj);value=GetValue(root);if(value)printf(真n);elseprintf(假n);void mutualcm()int i,value,truenum=0,falsenum=0,cmd;for(i=0;isum;i+)Varitab(i);value=Get
16、Value(root);if(value)truenum+;elsefalsenum+;if(truenum=sum)printf(true forever!n);else if(falsenum=sum)printf(false forever!n);elseprintf(請進(jìn)行選擇1:進(jìn)行用戶輸入驗證 其它:進(jìn)行計算機(jī)列舉n);scanf(%d,&cmd);if(cmd=1)printf(輸入變量值:n);for(i=1;ibase=(BiTree*)realloc(stack-base,(stack-stacksize+STACKINCREAMENT)*sizeof(BiTree);此句
17、原來寫的事stack-base=(BiTree *)malloc(stack-stacksize+STACKINCREAMENT)*sizeof(BiTree);程序無法執(zhí)行,不知為什么。6、stack-base=(BiTree )malloc(stack-stacksize*(sizeof(BiTree) 此句本來在(BiTree *)結(jié)果報多* 去掉沒問題,但是不明白五、用戶手冊本程序采用需要用戶輸入或者判別的時候步步都有提示如圖所示六、測試結(jié)果需要測試的數(shù)據(jù)為:(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;0,0;0,1;1,0;1,1。測試結(jié)果如圖所示:七、用戶手冊#include #include#include#include專心-專注-專業(yè)