




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实习报告题目:重言式判别班级:计算机学院12052313 姓名:卢魏旭 学号:12051521 完成日期:2012年11月一、 需求分析试写一个程序,通过真值表判断一个逻辑表达式属于哪一类的表达式基本要求:1) 逻辑表达式从终端输入,长度不超过一行,逻辑运算符包括“|”,“&”和“”,分别表示或,与和非,运算优先程度递增,但可以由括号改变,即括号内的运算符优先。逻辑变元为大写字母,表达式中任意地方都可以含有空格符。2) 若是重言式或者矛盾式,可以只显示“True forever”或者“False forever”,否者显示“Statisfactible”,与用户交互,若用户对表达式中变
2、元取定一组值,程序就求出并显示逻辑表达式的值。3) 附加要求,可以根据用户要求,列出该逻辑表达式的真值表。测试数据:1) (A|A)&(B|B)2) (A&A)&C3) A|B|C|D|E|A二、 概要设计为实现上述程序功能,以二叉树的结构来存储逻辑表达式,通过一个辅助栈来完成建树过程二叉树的抽象数据类型定义为:ADT Bitree数据对象 D:D是具有相同特性的数据元素的集合数据关系 R:基本操作:creatbitree(&B,&S1,&S2,*a)初始条件:树B,栈S1,S2存在操作结果:通过两个辅助的栈S1,S2将元素a值建在二叉树内sho
3、wtree(B)初始条件:二叉树B存在操作结果:先序遍历二叉树,输出每一个节点中的信息(用于检测)voluation($B,c,value)初始条件:二叉树B存在操作结果:通过先序遍历二叉树,对树中变量为c的结点赋值value excel(B,i,c,v,*x)初始条件:二叉树存在操作结果:通过递归的算法在一维数组v中记录各个变量各种赋值情况(所有赋值情况的真值结果记录)此外以栈的存储结构做辅助栈的抽象数据类型定义为:ADT Bstack数据对象:D=a|ai<-ElemSet,i=1,2,3n数据关系:R1=<ai-1,ai>|ai-1,ai <-D,i=1,2,3n
4、基本操作:creatstack(&S)操作结果:建立一个空栈SPushstack(&S,&B)初始条件:栈S存在操作结果:将一个二叉树的结点入栈Popstack(&S,&B)初始条件:栈S存在操作结果:从栈中取出一个二叉树的结点showstack(S)初始条件:栈S存在操作结果:访问栈内结点,查看元素信息Gettop(S)初始条件:栈S存在操作结果:返回栈顶元素三、 详细设计#include<stdio.h>#include<malloc.h>#include<windows.h>#include<math.h&
5、gt;typedef struct BiTnodechar data;int value;struct BiTnode *lchild,*rchild;*Bitree;typedef struct BstackBitree *top;Bitree *base;void creatstack(Bstack &S)S.base=(Bitree*)malloc(sizeof(BiTnode);S.top=S.base;void Pushstack(Bstack &S,Bitree &B)*S.top=B;S.top+;void Popstack(Bstack &S,B
6、itree &B)S.top-;B=*S.top;Bitree Gettop(Bstack S)return *(S.top-1);int Judge(char c) /判断字符是运算符还是操作符if(c>='A'&&c<='Z'|c>='a'&&c<='z'|c='0'|c='1')return 1;elsereturn 0;char compare(char c1,char c2) /比较两个运算符的优先级char c='-
7、1'switch(c1)case '|':switch(c2) case '|':c='>'break;case '&':c='<'break;case '':c='<'break;case '(':c='<'break;case ')':c='>'break;case '#':c='>'break; break;case '&a
8、mp;':switch(c2) case '|':c='>'break;case '&':c='>'break;case '':c='<'break;case '(':c='<'break;case ')':c='>'break;case '#':c='>'break; break;case '':switch(c2) case '
9、;|':c='>'break;case '&':c='>'break;case '':c='>'break;case '(':c='<'break;case ')':c='>'break;case '#':c='>'break; break;case '(':switch(c2) case '|':c='<'brea
10、k;case '&':c='<'break;case '':c='<'break;case '(':c='<'break;case ')':c='='break; break;case ')':switch(c2) case '|':c='>'break;case '&':c='>'break;case '':c='&g
11、t;'break;case '(':c='>'break;case ')':c='>'break;case '#':c='>'break; break;case '#':switch(c2) case '|':c='<'break;case '&':c='<'break;case '':c='<'break;case '('
12、;:c='<'break;case '#':c='='break; break;return c;void showstack(Bstack S)while(S.base!=S.top)S.top-;printf("%cn",(*S.top)->data);int creatBiTree(Bitree &B,Bstack &S1,Bstack &S2,char *a) /S1为a操作符栈,为运算数栈 建立二叉树过程类似于算术表达式求值int i=0,len=0,flag=1; char c;
13、Bitree b1;b1=(Bitree)malloc(sizeof(BiTnode);b1->data='#'b1->value=0;b1->lchild=NULL;b1->rchild=NULL;Pushstack(S1,b1); /先在运算符栈里存放一个data值为“#”的结点做标记while(ai)len+;i+;i=0;c=a0;while(c!='#'|Gettop(S1)->data!='#')c=ai;if(c=' ') /若有空格,直接忽略掉i+;continue;if(i>=
14、len)c='#'Bitree b;b=(Bitree)malloc(sizeof(BiTnode); 建立一个树的结点b->data=c;b->value=0;b->lchild=NULL;b->rchild=NULL;if(Judge(c)Pushstack(S2,b); /若是操作数的结点则进栈i+;continue;elsechar c1=compare(Gettop(S1)->data,c);if(c1='-1')flag=0;break;switch(c1)case '<':printf("
15、;执行D“<”:n ");Pushstack(S1,b);i+;break;case '=':printf("执行D“=”: n");if(c!='#')Popstack(S1,b);i+;break;elsebreak;case '>':printf("执行D“>”: n"); /如果栈顶运算符优先级高,则先建立二叉树char c2=Gettop(S1)->data;Bitree a0,a1; /先取一个运算符和一个操作数,将操作数连接在运算符的右孩子上Popstack(
16、S1,a0);Popstack(S2,a1);a0->rchild=a1;if(c2!='') /如果不是“”运算符,再取一个结点连接在运算符结点的左孩子上Bitree a2;Popstack(S2,a2);a0->lchild=a2;Pushstack(S2,a0);elsePushstack(S2,a0);if(flag) /表达式输入无误则继续进行B=Gettop(S2);return 1;elsereturn 0;void caculate(Bitree B) /采用后序遍历判断逻辑表达式的真值if(B)caculate(B->lchild);cacu
17、late(B->rchild);switch(B->data)case '|':B->value=B->lchild->value|B->rchild->value;break;case '&':B->value=B->lchild->value&&B->rchild->value;break;case '':B->value=!B->rchild->value;break;case '0':B->value=0
18、;break;case '1':B->value=1;break;void showtree(Bitree B) /先序遍历二叉树if(B)printf("%c ",B->data);showtree(B->lchild);showtree(B->rchild);void voluation(Bitree B,char c,int value)/采用先序遍历为二叉树的变量赋值if(B)if(B->data=c)B->value=value;voluation(B->lchild,c,value);voluation(
19、B->rchild,c,value);void show(char *a)int i=0;while(ai)if(ai=' ')i+;continue;printf("%c",ai);i+;void excel(Bitree B,int i,char *c,int v,int *x) /采用递归算法为所有的变量赋值,用数组v记录下每一种变量复制后逻辑表达式的真值if(ci!='0')voluation(B,ci,0);i+;excel(B,i,c,v,x);i-;voluation(B,ci,1);i+;excel(B,i,c,v,x)
20、;elsecaculate(B);v*x=B->value;(*x)-;int search(char *a,char *ch) /查找表达式中的变量,放入ch数组中int i=0,k=0,flag=1;while(ai) if(ai>='A'&&ai<='Z')int j=0;while(chj!='0')if(chj=ai)flag=0;break;j+;if(flag)chk=ai;k+;i+;flag=1;/printf("%d n",k);return k;char Judge2(i
21、nt *v) /根据所有赋值情况,判断逻辑表达式是哪种类型的int i=0,flag1=0,flag2=0,flag3=0;while(vi!=-1)if(vi=0)flag1=1;if(vi=1)flag2=1;if(flag1&&flag2)return 'O'i+;if(flag1)return 'F'if(flag2)return 'T'void selfvoluation(Bitree b,char ch,char a) /用户自行赋值printf("是否自行为表达式赋值以计算真值?(Y/N)n");
22、char c;c=getchar();if(c='Y'|c='y')int k=0,x; while(chk!='0')printf("为%c赋值:êo%c=",chk,chk);scanf("%d",&x);while(x!=0&&x!=1)printf("赋值有误!请重新输入:");scanf("%d",&x);voluation(b,chk,x);k+;caculate(b);printf("表达式? &quo
23、t;);show(a);printf(" 的真值为%dn",b->value);void change(int *b,int x,int sum) /将十进制转换为二进制while(x!=0)bsum=(x%2);x=x/2;sum-;void TrueExcel(char *a,char *ch,int j,int *v2,int *v1) /输出真值表int i=0;while(chi!='0')printf("%c ",chi);i+;printf("|");show(a);printf("n&q
24、uot;);for(int l=0,m=pow(2,(double)j)-1;l<pow(2,(double)j);l+,m-)change(v2,l,j-1);for(int k=0;k<j;k+)if(v2k=-1)printf("0 ");elseprintf("%d ",v2k);printf("| %dn",v1m);void main()int j=0,i=0,n,v1200,v2200,flag=0;Bitree b;Bstack S1,S2;creatstack(S1);creatstack(S2);cha
25、r a100,ch10;/a记录表达式,ch记录变量值for(int k=0;k<10;k+)/初始化变量数组chk='0'for(int m=0;m<200;m+)/初始化真值表数组v2m=-1;v1m=-1;gets(a);/输入表达式j=search(a,ch);/获取所有变量的个数yn=pow(2,(double)j)-1;/要赋值的次数flag=creatBiTree(b,S1,S2,a);/根据表达式建立二叉树if(flag)excel(b,0,ch,v1,&n);/计算所有变量赋值的真值switch(Judge2(v1)case 'T&
26、#39;:printf("表达式为永真式n");break;case 'F':printf("表达式为永假式n");break;case 'O':printf("表达式为不确定式n");selfvoluation(b,ch,a);break;elseprintf("表达式输入有误n");TrueExcel(a,ch,j,v2,v1);system("PAUSE");四、 调试分析1、 本程序实现了逻辑表达式的求值,判断,以及真值表的输出,程序的难点在于逻辑表达式的
27、二叉树建立,以及其判断,二叉树的建立creatbitree()依靠两个工作栈实现的,形式类似于算术表达式的求值,不过这里是建树,存放变量的结点作为叶子结点,存放运算符的结点作为根结点,这是自底向上的算符优先法,第二个难点在于对所有的变量的所有情况赋值,这里采用了简单的递归算法,这个算法我自己做的时候花了很长时间来想,excel()递归时候,对每个变量有0和1两种赋值情况,每当递归到最顶层时,调用caculate()算法计算一次真值,然后将值存放到函数携带的一维数组中去。2、 本程序中最核心的算法应该是caculate()算法,采用的是后序遍历的方法,通过根节点的运算符结合左右孩子结点中变量所携带的value值计算真值,并将结果写入到根结点里去,最终一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 精准农业技术提升油菜种植效益
- 构建语文教学新形态的面临的问题、机遇与挑战
- 社交媒体时代出版行业的用户体验升级
- 校企协同育人的探索与实践
- 影视产业对区域创新生态的驱动
- 肢体语言的教学魔力
- 游戏技术的革新之路
- 万圣节与怪兽世界
- 双十二旅游创新策略
- 2025标准企业办公室租赁合同模板
- 湖北省襄阳市谷城县2022-2023学年五年级下学期期末科学
- 经租房的法律思考
- 《孔乙己》《变色龙》教学设计 统编版语文九年级下册
- 太阳能热利用技术邵理堂课后部分参考答案
- 流程优化理论及技巧
- 井下电气设备防爆完好图册(新)
- 移动通信行业典型安全隐患图解
- 重度子痫前期子痫急救演练
- 以助产士为主导的连续护理模式的发展现状
- 生态系统对全球变化的响应
- 风电场风机塔筒清洗项目四措两案(三措两案)
评论
0/150
提交评论