离散实验报告一.docx
《离散实验报告一.docx》由会员分享,可在线阅读,更多相关《离散实验报告一.docx(16页珍藏版)》请在冰豆网上搜索。
离散实验报告一
离散数学实验报告
(一)
一、实验目的
求命题公式的真值表及其主析取范式和主合取范式
二、问题分析
本程序最终的目的应是求命题公式的主析取范式和主合取范式,而在有命题真值表的情况下,主析取范式和主合取范式的求解将变得十分简单。
所以,该程序的关键问题应该是求解命题公式的真值表,此后在真值表的基础上完成主析取范式和主合取范式的求解。
(一)前期分析与部分变量准备
规定前提,真值表中的T/F在该程序中用布尔类型的1/0来表达。
如此,可以方便程序的编写与运算。
首先,我们要确定各个联结词的符号表达,为了方便讨论,不妨在此先令各联结词表达如下:
合取(*)、析取(/)、否定(-)、单条件(%)、双条件(@)。
接着,我们就需要明确各联结词所对应符号在程序中的功能。
具体来看,合取与析取可以分别使用c++自带的&&(且)和||(或)进行布尔运算,取否定也可以直接使用!
(取非)运算;而对于单条件、双条件这两个联结词来看,在c++中并无已有的运算定义,所以我们要利用函数定义的方式重新明确其含义。
而后,定义char类型数组a[]用于存储命题公式,为了方便程序的实现,我们将命题变元与联结词分开存储于char类型数组b[]和c[]中。
(二)真值表输出算法
以下,我们便进入了程序的核心部分——完成真值表的计算与输出。
碍于本人c++编程知识的局限,暂时只能实现输入三个变元、无否定情况下的命题公式的真值表输出。
为了完成真值表的输出,要解决以下几个问题
1.真值表的格式与指派控制
对此,我们使用三层for语句嵌套完成真值表的每一行输出。
在循环的同时,我们还需要提前定义一个布尔数组p[],以根据每一行的输出完成三个变元的指派,并将其存储于数组p[]中。
2.真值表每一行结尾的结果计算
首先,我们需要定义一个布尔类型的过程存储数组x[],利用switch语句的嵌套分别判断两个联结词,使用相应的运算符(&&、||、!
)和已定义的两个布尔类型函数(imp、equ),一次计算,并且将每一次的计算结果存储至x[]中,运算直至最后一步完成结果的输出。
(三)利用真值表求解主析取范式和主合取范式
根据离散数学知识,一个公式的真值为T的指派所对应的小项的析取,即为此公式的主析取范式;一个公式的真值为F的指派所对应的大项的合取,即为此公式的主合取范式。
如此,我们需要分别定义两个数组m[]和M[],以在每次循环结尾输出x[]的同时完成对该指派的记录:
如果x[]为1,那么将该指派信息记录于m[]中;否则,将该指派记录于M[]中。
(具体实施指派信息存储的时候,我们需要提前定义两个控制变量count1与count2)
最后,在程序的结尾,通过对m[]和M[]的循环判断,即可很方便的完成主析取范式和主合取范式的输出。
三、具体程序实现
#include
#include
usingnamespacestd;
boolimp(boolm,booln)
{
if(m==1&&n==1)return1;
if(m==1&&n==0)return0;
if(m==0&&n==1)return1;
if(m==0&&n==0)return1;
}
boolequ(boolm,booln)
{
if(m==1&&n==1)return1;
if(m==1&&n==0)return0;
if(m==0&&n==1)return0;
if(m==0&&n==0)return1;
}
intmain()
{
cout<<"各联结词符号表示如下:
"<cout<<"请输入命题:
"<chara[8];
charb[5];
charc[5];
boolp[5];
boolx[5];
intm[30];
intM[30];
intq=0,h=0;
intcount1=0;
intcount2=0;
cin>>a;
cout<<"该命题真值表为:
"<intn=strlen(a);
for(inti=0;i{
if(a[i]>='a'&&a[i]<='z')
{
cout<b[h]=a[i];
h++;
}
else
{
c[q]=a[i];
q++;
}
}
cout<//真值表输出
switch(c[0]){
case'*':
for(i=0;i<2;i++)
{
for(intj=0;j<2;j++)
{
if(i==1)p[i]=1;
elsep[i]=0;
if(j==1)p[j]=1;
elsep[j]=0;
x[0]=p[i]&&p[j];
for(intl=0;l<2;l++)
{
switch(c[1])
{
case'*':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=x[0]&&p[l];
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'/':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=x[0]||p[l];
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'%':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=imp(x[0],p[1]);
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'@':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=equ(x[0],p[l]);
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
}
}
}
}
break;
case'/':
for(i=0;i<2;i++)
{
for(intj=0;j<2;j++)
{
if(i==1)p[i]=1;
elsep[i]=0;
if(j==1)p[j]=1;
elsep[j]=0;
x[0]=p[i]||p[j];
for(intl=0;l<2;l++){
switch(a[3]){
case'*':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=x[0]&&p[l];
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'/':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=x[0]||p[l];
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'%':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=imp(x[0],p[1]);
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'@':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=equ(x[0],p[l]);
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
}
}
}
}
break;
case'%':
for(i=0;i<2;i++)
{
for(intj=0;j<2;j++)
{
if(i==1)p[i]=1;
elsep[i]=0;
if(j==1)p[j]=1;
elsep[j]=0;
x[0]=imp(p[i],p[j]);
for(intl=0;l<2;l++){
switch(a[3]){
case'*':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=x[0]&&p[l];
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'/':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=x[0]||p[l];
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'%':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=imp(x[0],p[1]);
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'@':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=equ(x[0],p[l]);
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
}
}
}
}
break;
case'@':
for(i=0;i<2;i++)
{
for(intj=0;j<2;j++)
{
if(i==1)p[i]=1;
elsep[i]=0;
if(j==1)p[j]=1;
elsep[j]=0;
x[0]=equ(p[i],p[j]);
for(intl=0;l<2;l++){
switch(a[3]){
case'*':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=x[0]&&p[l];
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'/':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=x[0]||p[l];
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'%':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=imp(x[0],p[1]);
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
case'@':
cout<if(l==1)p[l]=1;
elsep[l]=0;
x[1]=equ(x[0],p[l]);
cout<if(x[1]==1)
{
m[count1]=i;m[count1+1]=j;m[count1+2]=l;
count1+=3;
}
else
{
M[count2]=i;M[count2+1]=j;M[count2+2]=l;
count2+=3;
}
break;
}
}
}
}
break;
}
cout<<"主析取范式:
"<for(i=0;i{
cout<<"(";
if(m[i]==1)cout<
elsecout<<"-"<
if(m[i+1]==1)cout<
elsecout<<"-"<
if(m[i+2]==1)cout<
elsecout<<"-"<
if(i!
=count1-3)cout<<"/";
}
cout<cout<<"主合取范式"<for(i=0;i{
cout<<"(";
if(M[i]==1)cout<
elsecout<<"-"<
if(M[i+1]==1)cout<
elsecout<<"-"<
if(M[i+2]==1)cout<
elsecout<<"-"<
if(i!
=count2-3)cout<<"*";
}
cout<return0;
}
四、程序测试用例截图