




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
重言式的判别题目:一个逻辑表达式如果对于其変元的任一种取值都为真,则称为重言式;反之,如果对于其变元的任一种取值都为假,则称为矛盾式;然而,更多的情况下,既非重言式,也非矛盾式。试写一程序,通过真值表判别一个逻辑表达式属于上述哪一类。一、需求分析1、逻辑表达式从终端输入,长度不超过一行。2、逻辑运算符包括“|”“&”“”表示或 与 非。运算符优先程度递增,但是可由括号改变。3、逻辑变元为大写字母表达式中任何地方都可以含有多个空格符。4、运用自底向上的算符优先法5、重言式显示“true forever”;矛盾式显示“false forever”;否则显示“satisfactible”。二、概要设计为实现上述需求需要用到自底向上的算符优先法,和自顶向下分割,先序遍历建立二叉树的方法。自底向上的算符优先法: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;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(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 OK;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 /栈的最大长度#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= /此举是为了后面的优先级考虑 ,|,&,(,),#,|,&,(,),#,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,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 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;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) /开始判断优先级case data=*p;temp-Lchild=NULL;temp-Rchild=NULL;Push(&OPTR,temp); 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 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-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() / 为了能继续输入需要判别的式子char *p,*q;printf(请输入要判断的式子中变量的数目n);scanf(%d,varitab);while(*varitab0)printf(错误,请重新输入数字!n); printf(请输入要判断的式子中变量的数目: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;void 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=GetValue(root);if(value)truenum+;elsefalsenum+;if(truenum=sum)printf(true forever!n);else if(falsenum=sum)printf(false forever!n);elseprintf(请进行选择1:进行用户输入验证 其它:进行计算机列举n);scanf(%d,&cmd);if(cmd=1)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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设备安全管理培训总结课件
- 海鲜与水果作用机理课件
- 安全驾驶车辆培训心得
- 2025房屋买卖合同(参考)范文
- 模板二次结构支模合同4篇
- 2025年消防每日试题及答案
- 合同协议员工培训表格样本7篇
- 2025年会务组织试题及答案
- 甘肃省武威市民勤县2026届英语九上期末统考试题含解析
- 安全驾驶培训报道课件
- 农业产业强镇建设资金申请项目可行性研究及风险评估报告
- 秋形势与政策正确认识中国经济热点问题-教案2025版本
- 药品注册审评员考核试题及答案
- GB/T 7251.10-2025低压成套开关设备和控制设备第10部分:规定成套设备的指南
- 森林防灭火知识培训材料课件
- 成本管控的课件
- 2025年全国中小学校党组织书记网络培训示范班在线考试题库及答案
- CT检查的课件教学课件
- 年产50万吨钙系列产品项目可行性研究报告
- 提高中小学班主任和思政课教师专业素养和育人能力的策略及实施路径
- 2025年学校意识形态工作要点
评论
0/150
提交评论