离散实验报告一.docx

上传人:b****6 文档编号:5248533 上传时间:2022-12-14 格式:DOCX 页数:16 大小:127.62KB
下载 相关 举报
离散实验报告一.docx_第1页
第1页 / 共16页
离散实验报告一.docx_第2页
第2页 / 共16页
离散实验报告一.docx_第3页
第3页 / 共16页
离散实验报告一.docx_第4页
第4页 / 共16页
离散实验报告一.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

离散实验报告一.docx

《离散实验报告一.docx》由会员分享,可在线阅读,更多相关《离散实验报告一.docx(16页珍藏版)》请在冰豆网上搜索。

离散实验报告一.docx

离散实验报告一

离散数学实验报告

(一)

一、实验目的

求命题公式的真值表及其主析取范式和主合取范式

二、问题分析

本程序最终的目的应是求命题公式的主析取范式和主合取范式,而在有命题真值表的情况下,主析取范式和主合取范式的求解将变得十分简单。

所以,该程序的关键问题应该是求解命题公式的真值表,此后在真值表的基础上完成主析取范式和主合取范式的求解。

(一)前期分析与部分变量准备

规定前提,真值表中的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;

}

四、程序测试用例截图

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1