重言式判别c语言中文网,重言式判别源码及课程设计 c语言版

《重言式判别源码及课程设计 c语言版》由会员分享,可在线阅读,更多相关《重言式判别源码及课程设计 c语言版(14页珍藏版)》请在人人文库网上搜索。

1、重言式的判别题目:一个逻辑表达式如果对于其変元的任一种取值都为真,则称为重言式;反之,如果对于其变元的任一种取值都为假,则称为矛盾式;然而,更多的情况下,既非重言式,也非矛盾式。试写一程序,通过真值表判别一个逻辑表达式属于上述哪一类。一、需求分析1、逻辑表达式从终端输入,长度不超过一行。2、逻辑运算符包括“|”“&”“”表示或 与 非。运算符优先程度递增,但是可由括号改变。3、逻辑变元为大写字母表达式中任何地方都可以含有多个空格符。4、运用自底向上的算符优先法5、重言式显示“true forever”;矛盾式显示“false forever”;否则显示“satisfactible”。二、概要设。

2、计为实现上述需求需要用到自底向上的算符优先法,和自顶向下分割,先序遍历建立二叉树的方法。自底向上的算符优先法: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;int stacksize。

3、;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-top-1);int Push。

4、(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-top+;return O。

5、K;BiTree Pop(SqStack * stack)if(stack-top=stack-base)return ERROR;return *(-stack-top);int DestroyStack (SqStack * stack)free(stack-base);return OK;三、详细设计详细程序如下:#include#include#include#include#define OK 1#define ERROR 0#define VARIMAXNUM 20 #define STARMAXLEN 100 #define STACK_INIT_SIZE 100 /栈的最大长度。

6、#define STACKINCREAMENT 10 /每次增加的栈的长度#define ElemType char 将elemtype定义为char型typedef struct BiTNode /创建树节点 按照书上原样创建struct BiTNode * Lchild;struct BiTNode * Rchild;ElemType data; /字符型BiTNode , *BiTree;typedef struct Node /栈BiTree * base;BiTree *top;int stacksize;SqStack;char OPTRCHART77= /此举是为了后面的优先级考。

7、虑,|,&,(,),#,|,&,(,),#,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(SqStack * stack,B。

8、iTree 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-top+;return OK;。

9、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;for(i=0;idata。

10、=#;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) /开始判断优先级case data=*p;temp-Lchild=NULL;temp-Rchild=NULL;Push(&OPTR,temp);p+;break;case =:temp=Pop(&OPTR);free(temp);p+;break。

11、;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 if(tree-Lchild=NULL)&(tree-Rchild=NULL)free(tree);ret。

12、urn;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-Lchild)|GetValue(tree-Rchild);case &:return (GetValue。

13、(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() / 为了能继续输入需要判别的式子char *p,*q;printf(请输入要判断的式子中变量的数目n);s。

14、canf(%d,varitab);while(*varitabi)%2;void table()int i,j,value;printf(真值表为:n);for(i=1;ibase=(BiTree*)realloc(stack-base,(stack-stacksize+STACKINCREAMENT)*sizeof(BiTree);此句原来写的事stack-base=(BiTree *)malloc(stack-stacksize+STACKINCREAMENT)*sizeof(BiTree);程序无法执行,不知为什么。6、stack-base=(BiTree )malloc(stack-stacksize*(sizeof(BiTree) 此句本来在(BiTree *)结果报多* 去掉没问题,但是不明白五、用户手册本程序采用需要用户输入或者判别的时候步步都有提示如图所示六、测试结果需要测试的数据为:(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。测试结果如图所示:七、用户手册#include #include#include#include。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值