您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 离散数学实验报告课案
实验报告(2015/2016学年第二学期)课程名称离散数学实验名称利用真值表法求取主析取范式以及主合取范式的实现实验时间2016年9月20日指导单位计算机科学与技术系指导教师刘茜萍学生姓名吉峰班级学号B14041515学院(系)计算机学院、软件学院专业软件工程实验报告实验名称利用真值表法求取主析取范式以及主合取范式的实现指导教师刘茜萍实验类型验证实验学时4实验时间2016年9月20日一、实验目的和要求实验目的:通过编程实现主析取范式以及主合取范式的真值表求法以巩固相关理论的掌握。实验要求:从屏幕输入含三个以内变量的合式公式(其中联结词按照从高到底的顺序出现)。规范列出所输合式公式的真值表。给出相应主析取和主合取范式。二、实验环境(实验设备)Windows+VC2三、实验原理及内容实验原理:开始时在屏幕提示上提示非、合取、析取、条件、双条件在计算机上的字符表示,因为有些数学符号在计算机上不能表示出来。然后在屏幕中输入含三个以内变量的合式公式,其中联结词按照从高到底的顺序出现。把输入的合式公式,分别存放在相应的数组中,设计一个真值判断表达式,并使其赋值计算。依次从左向右计算对应的一组真值指派下合式公式的真值。多重循环计算,并将最终的结果存入相应的数组里,而后输出真值表。最后根据真值表求主析取范式和主合取范式的方法输出所求的相应的主析取范式和主合取范式。实验内容:#includestdio.h#includestdlib.h#includestring.h#includeconio.h#includemath.h#defineN50voidpanduan(intb[N],intf);//赋值函数inttkh(charsz[N],charccu[N],inticu[N],inth0);//分级运算函数intfkh(charsz[N],charccu[N],inticu[N],inth0);//主运算函数main(){3inti1,i2,d=1,icu[N],jg,j=0,h0;//icu[N]用于存放变量值,jg存放结果intbj=0,hq[N],h=0,x=0,xq[N];//hq[N]存放合取结果xq[N]存放析取结果charsz[N],ccu[N],sz0[N],s;//sz[N]存放式子,ccu[N]存放变量,sz0[N]也是用于存放式子hq[0]=-1;xq[0]=-1;printf(***************************************\n);//标语printf(\n);printf(欢迎进入菜单\n);printf(***************************************\n\n);printf(用!表示非\n);printf(用&表示合取\n);printf(用|表示析取\n);printf(用^表示条件\n);printf(用~表示双条件\n);printf(\n);printf(***************************************\n\n);printf(请输入一个合法的命题公式:\n);//输入式子gets(sz);//读取式子strcpy(sz0,sz);//复制式子for(i1=0;i1strlen(sz);i1++){4if(sz[i1]==')'||sz[i1]=='(')//存储括号数量kh++;if(sz[i1]='a'&&sz[i1]='z'||sz[i1]='A'&&sz[i1]='Z'){for(i2=0;i2j;i2++)//判断并储存变量。if(ccu[i2]==sz[i1])//去除重复变量d=0;if(d==1){ccu[j]=sz[i1];j++;}d=1;}}printf(\nd该式子中的变量个数为:%d\n,j);//输出变量个数h0=j;printf(\n输出真值表如下:\n\n);//输出真值表表头for(i1=0;i1h0;i1++)printf(%c,ccu[i1]);printf();puts(sz);5printf(\n);for(i1=0;i1j;i1++)///////先将所有的变量赋值为零。icu[i1]=0;for(i2=0;i2j;i2++)//输出真值表前项printf(%d,icu[i2]);jg=tkh(sz,ccu,icu,h0);//用函数求结果if(jg==0)//结果为0,合取加1hq[h++]=bj;else//否则,析取加1xq[x++]=bj;printf(%d\n,jg);//输出运算结果strcpy(sz,sz0);for(i1=0;i1(int)pow(2,j)-1;i1++){++bj;panduan(icu,j-1);//赋值变量jg=tkh(sz,ccu,icu,h0);if(jg==0)//结果为0,合取加1hq[h++]=bj;else//否则,析取加1xq[x++]=bj;strcpy(sz,sz0);//恢复被修改的数组。6for(i2=0;i2j;i2++)printf(%d,icu[i2]);//输出真值表前项printf(%d\n,jg);//输出运算结果}if(hq[0]==-1)//不存在合取范式时printf(\n该命题公式不存在主合取范式。\n);else{printf(\n该命题公式的主合取范式:\n\t);for(i1=0;i1h;i1++){if(i10)//判断并添加符号printf(\\/);printf(M(%d),hq[i1]);//输出主合取范式}}if(xq[0]==-1)//不存在析取范式时printf(\n该命题公式不存在主析取范式。\n);else{printf(\n\n该命题公式的主析取范式:\n\t);for(i1=0;i1x;i1++)7{if(i10)//判断并添加符号printf(/\\);printf(m(%d),xq[i1]);//输出主析取范式}}printf(\n);printf(\n欢迎下次再次使用!\n);//结束getch();}voidpanduan(intb[N],intf)//二进制赋值。{inti;i=f;if(b[f]==0)//加1b[f]=1;else//进位{b[f]=0;panduan(b,--i);}8}intfkh(charsz[N],charccu[N],inticu[N],inth0)//主运算函数{inti,h=0,j=0,j1=0,j2=0,j3=0,j4=0,j5=0,i1,i2,p1=-1,p2=-1,s;chardt[N];s=strlen(sz);if(s==1)if(sz[0]==-2)//判断是否是最后一项return0;elsereturn1;//1就是sz[0]的值、else{for(i=0;is-j;i++)//先处理非if(sz[i]=='!'){for(i1=0;i1h0;i1++)if(sz[i+1]==ccu[i1])//将变量赋值并给P1p1=icu[i1];if(sz[i+1]==-2)//如果是前运算结果的0,则P1等于0p1=0;if(p1==-1)//如果是数字,直接给P19p1=sz[i+1];dt[j+2]=!p1;//非运算sz[i]=j+2;j++;p1=0;for(i1=i+1;i1s-j;i1++)sz[i1]=sz[i1+1];//将后续式子前移一项}p1=-1;j1=j;for(i=0;is-j1-2*j2;i++)//处理与if(sz[i]=='&'){for(i1=0;i1h0;i1++){if(sz[i-1]==ccu[i1])//将变量赋值并给P1p1=icu[i1];if(sz[i+1]==ccu[i1])//将变量赋值并给P2p2=icu[i1];}for(i2=2;i2j+2;i2++){10if(sz[i-1]==i2)//如果为前计算结果,将结果赋值并给P1p1=dt[i2];if(sz[i+1]==i2)//如果为前计算结果,将结果赋值并给P2p2=dt[i2];}if(sz[i-1]==-2)//如果是前运算结果的0,则P1等于0p1=0;if(sz[i+1]==-2)//如果是前运算结果的0,则P2等于0p2=0;if(p1==-1)//如果是数字,直接给P1p1=(int)(sz[i-1]);if(p2==-1)//如果是数字,直接给P2p2=(int)(sz[i+1]);dt[j+2]=p1&&p2;//与运算sz[i-1]=j+2;j++;j2++;p1=-1;p2=-1;for(i1=i;i1s-j1-2*j2;i1++)//将后续式子前移两项sz[i1]=sz[i1+2];i=i-1;11}for(i=0;is-j1-2*j2-2*j3;i++)//处理或。if(sz[i]=='|'){for(i1=0;i1h0;i1++){if(sz[i-1]==ccu[i1])//将变量赋值并给P1p1=icu[i1];if(sz[i+1]==ccu[i1])//将变量赋值并给P2p2=icu[i1];}for(i2=2;i2j+2;i2++){if(sz[i-1]==i2)//如果为前计算结果,将结果赋值并给P1p1=dt[i2];if(sz[i+1]==i2)//如果为前计算结果,将结果赋值并给P2p2=dt[i2];}if(sz[i-1]==-2)//如果是前运算结果的0,则P1等于0p1=0;if(sz[i+1]==-2)//如果是前运算结果的0,则P2等于0p2=0;12if(p1==-1)//如果是数字,直接给P1p1=sz[i-1];if(p2==-1)//如果是数字,直接给P2p2=sz[i+1];dt[j+2]=p1||p2;//或运算sz[i-1]=j+2;j++;j3++;p1=-1;p2=-1;for(i1=i;i1s-j1-2*j2-2*j3;i1++)//将后续式子前移两项sz[i1]=sz[i1+2];i--;}for(i=0;is-j1-2*j2-2*j3-2*j4;i++)//处理蕴含。if(sz[i]=='^'){for(i1=0;i1h0;i1++){if(sz[i-1]==ccu[i1])//将变量赋值并给P1p1=icu[i1];if(sz[i+1]==ccu[i1])//将变量赋值并给P213p2=icu[i1];}for(i2=2;i2j+2;i2++){if(sz[i-1]==i2)//如果为前计算结果,将结果赋值并给P1p1=dt[i2];if(sz[i+1]==i2)//如果为前计算结果,将结果赋值并给P2p2=dt[i2];}if(sz[i-1]==-2)//如果是前运算结果的0,则P1等于0p1=0;if(sz[i+1]==-2)//如果是前运算结果的0,则P2等于0p2=0;if(p1==-1)//如果是数字,直接给P1p1=sz[i-1];if(p2==-1)//如果是数字,直接给P2p2=sz[i+1];dt[j+2]=!p1||p2;//蕴含运算sz[i-1]=j+2;j++;j4++;p1=-1;14p2=-1;for(i1=i;i1s-j1-2*j2-2*j3-2*j4;i1++)//将后续式子前移两项sz[i1]=sz[i1+2];i--;}for(i=0;is-j1-2*j2-2*j3-2*j4-2*j5;i++)//处理等值。if(sz[i]=='~'){for(i1=0;i1h0;i1++){if(sz[i-1]==ccu[i1])//将变量赋值并给P1p1=icu[i1];if(sz[i+1]==ccu[i1])//将变量赋值并给P2p2=icu[i1];}for(i2=2;i2j+2;i2++){if(sz[i-1]==i2)//如果为前计算结果,将结果赋值并给P1p1=dt[i2];if(sz[i+1]==i2)//如果为
本文标题:离散数学实验报告课案
链接地址:https://www.777doc.com/doc-3515368 .html