离散数学实验报告课案Word文档格式.docx
《离散数学实验报告课案Word文档格式.docx》由会员分享,可在线阅读,更多相关《离散数学实验报告课案Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
![离散数学实验报告课案Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/9/1ba20e6c-2cc2-44da-94d4-926c82fe904b/1ba20e6c-2cc2-44da-94d4-926c82fe904b1.gif)
2016年9月20日
一、实验目的和要求
实验目的:
通过编程实现主析取范式以及主合取范式的真值表求法以巩固相关理论的掌握。
实验要求:
从屏幕输入含三个以内变量的合式公式(其中联结词按照从高到底的顺序出现)。
规范列出所输合式公式的真值表。
给出相应主析取和主合取范式。
二、实验环境(实验设备)
Windows+VC
三、实验原理及内容
实验原理:
开始时在屏幕提示上提示非、合取、析取、条件、双条件在计算机上的字符表示,因为有些数学符号在计算机上不能表示出来。
然后在屏幕中输入含三个以内变量的合式公式,其中联结词按照从高到底的顺序出现。
把输入的合式公式,分别存放在相应的数组中,设计一个真值判断表达式,并使其赋值计算。
依次从左向右计算对应的一组真值指派下合式公式的真值。
多重循环计算,并将最终的结果存入相应的数组里,而后输出真值表。
最后根据真值表求主析取范式和主合取范式的方法输出所求的相应的主析取范式和主合取范式。
实验内容:
#include"
stdio.h"
#include"
stdlib.h"
string.h"
conio.h"
math.h"
#defineN50
voidpanduan(intb[N],intf);
//赋值函数
inttkh(charsz[N],charccu[N],inticu[N],inth0);
//分级运算函数
intfkh(charsz[N],charccu[N],inticu[N],inth0);
//主运算函数
main()
{
inti1,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"
);
//标语
\n"
欢迎进入菜单\n"
***************************************\n\n"
用!
表示非\n"
用&
表示合取\n"
用|表示析取\n"
用^表示条件\n"
用~表示双条件\n"
***************************************\n\n"
请输入一个合法的命题公式:
\n"
//输入式子
gets(sz);
//读取式子
strcpy(sz0,sz);
//复制式子
for(i1=0;
i1<
strlen(sz);
i1++)
{
if(sz[i1]=='
)'
||sz[i1]=='
('
)//存储括号数量
kh++;
if(sz[i1]>
='
a'
&
&
sz[i1]<
z'
||sz[i1]>
A'
Z'
)
for(i2=0;
i2<
j;
i2++)//判断并储存变量。
if(ccu[i2]==sz[i1])//去除重复变量
d=0;
if(d==1)
ccu[j]=sz[i1];
j++;
}
d=1;
\nd该式子中的变量个数为:
%d\n"
j);
//输出变量个数
h0=j;
\n输出真值表如下:
\n\n"
//输出真值表表头
h0;
%c"
ccu[i1]);
"
puts(sz);
i1++)///////先将所有的变量赋值为零。
icu[i1]=0;
i2++)//输出真值表前项
%d"
icu[i2]);
jg=tkh(sz,ccu,icu,h0);
//用函数求结果
if(jg==0)//结果为0,合取加1
hq[h++]=bj;
else//否则,析取加1
xq[x++]=bj;
%d\n"
jg);
//输出运算结果
strcpy(sz,sz0);
(int)pow(2,j)-1;
++bj;
panduan(icu,j-1);
//赋值变量
//恢复被修改的数组。
i2++)
//输出真值表前项
}
if(hq[0]==-1)//不存在合取范式时
\n该命题公式不存在主合取范式。
else
{
\n该命题公式的主合取范式:
\n\t"
h;
if(i1>
0)//判断并添加符号
\\/"
M(%d)"
hq[i1]);
//输出主合取范式
if(xq[0]==-1)//不存在析取范式时
\n该命题公式不存在主析取范式。
\n\n该命题公式的主析取范式:
x;
/\\"
m(%d)"
xq[i1]);
//输出主析取范式
\n欢迎下次再次使用!
\n"
//结束
getch();
}
voidpanduan(intb[N],intf)//二进制赋值。
inti;
i=f;
if(b[f]==0)//加1
b[f]=1;
else//进位
b[f]=0;
panduan(b,--i);
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;
return1;
//1就是sz[0]的值、
for(i=0;
i<
s-j;
i++)//先处理非
if(sz[i]=='
!
'
)
if(sz[i+1]==ccu[i1])//将变量赋值并给P1
p1=icu[i1];
if(sz[i+1]==-2)//如果是前运算结果的0,则P1等于0
p1=0;
if(p1==-1)//如果是数字,直接给P1
p1=sz[i+1];
dt[j+2]=!
p1;
//非运算
sz[i]=j+2;
for(i1=i+1;
sz[i1]=sz[i1+1];
//将后续式子前移一项
p1=-1;
j1=j;
s-j1-2*j2;
i++)//处理与
if(sz[i-1]==ccu[i1])//将变量赋值并给P1
if(sz[i+1]==ccu[i1])//将变量赋值并给P2
p2=icu[i1];
for(i2=2;
j+2;
i2++)
if(sz[i-1]==i2)//如果为前计算结果,将结果赋值并给P1
p1=dt[i2];
if(sz[i+1]==i2)//如果为前计算结果,将结果赋值并给P2
p2=dt[i2];
if(sz[i-1]==-2)//如果是前运算结果的0,则P1等于0
if(sz[i+1]==-2)//如果是前运算结果的0,则P2等于0
p2=0;
if(p1==-1)//如果是数字,直接给P1
p1=(int)(sz[i-1]);
if(p2==-1)//如果是数字,直接给P2
p2=(int)(sz[i+1]);
dt[j+2]=p1&
p2;
//与运算
sz[i-1]=j+2;
j2++;
p2=-1;
for(i1=i;
i1++)//将后续式子前移两项
sz[i1]=sz[i1+2];
i=i-1;
s-j1-2*j2-2*j3;
i++)//处理或。
|'
{
}
{
if(sz[i+1]==i2)//如果为前计算结果,将结果赋值并给P2
p1=sz[i-1];
p2=sz[i+1];
dt[j+2]=p1||p2;
//或运算
j3++;
i--;
s-j1-2*j2-2*j3-2*j4;
i++)//处理蕴含。
^'
if(sz[i-1]==-2)//如果是前运算结果的0,则P1等于0
p1=0;
if(sz[i+1]==-2)//如果是前运算结果的0,则P2等于0
p2=0;
if(p1==-1)//如果是数字,直接给P1
p1=sz[i-1];
if(p2==-1)//如果是数字,直接给P2
p2=sz[i+1];
dt[j+2]=!
p1||p2;
//蕴含运算
sz[i-1]=j+2;
j++;
j4++;
p1=-1;
p2=-1;
for(i1=i;
sz[i1]=sz[i1+2];
i--;
s-j1-2*j2-2*j3-2*j4-2*j5;
i++)//处理等值。
~'
dt[j+2]=(!
p1||p2)&
(!
p2||p1);
//等值运算
j5++;
returndt[j+1];
//返回结果
实验结果:
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
问题:
对于括号和联结词的优先顺序这方面有不足。
解决方法:
因为对括号的运算这方面有不足,所以要求联结词按照从高到底的顺序出现。
括号这方面以后再拓展。
心得体会:
这个实验的目的是从逻辑思维上增进我们对于使用真值表来求某个合式的主析取范式和主合取范式,具体化求取的过程,并将之转化为计算机语言,这要求我们对此方法有足够的认识。
这个实验同时考察了我们的数学和计算机水平。
意见与建议:
无。
五、指导教师评语
成绩
批阅人
日期