利用真值表法求主析取范式及主合取范式的实现.docx
《利用真值表法求主析取范式及主合取范式的实现.docx》由会员分享,可在线阅读,更多相关《利用真值表法求主析取范式及主合取范式的实现.docx(17页珍藏版)》请在冰豆网上搜索。
利用真值表法求主析取范式及主合取范式的实现
实验报告
(/学年第一学期)
课程名称
离散数学
实验名称
利用真值表法求主析取范式及主合取范式的实现
实验时间
年
月
日
指导单位
指导教师
学生姓名
班级学号
学院(系)
专业
实验报告
实验名称
利用真值表法求主析取范式及主合取范式的实现
指导教师
实验类型
上机
实验学时
4
实验时间
一、实验目的和要求
能够列出合式公式的真值表并给出相应主析取范式和主合取范式。
二、实验环境(实验设备)
硬件:
PC机。
软件:
Code:
:
Blocks(C++)
三、实验原理及内容
内容:
编程实现用真值表法求任意含三个以内变量的合式公式的主析取范式和主合取范式。
原理:
首先读入变元个数,然后读入合式公式,用堆栈的知识将中缀表达式转化为后缀表达式,调用否定、析取、合取、条件、双条件的函数计算P、Q、R取不同真值时合式公式的真值,然后输出真值表,调用计算主析取范式和主合取范式的函数并输出。
程序:
#include
#include
#include
#include
usingnamespacestd;
stringOriginalForm;//原式
stringHequ;//主合取范式
stringXiqu;//主析取范式
classSeqStack//建立一个堆栈,利用将中缀表达式转为后缀表达式
{
public:
SeqStack(intmSize);
~SeqStack();
charTop();
boolPush(charx);
boolPop();
private:
char*st;
inttop;
intmaxtop;
};
SeqStack:
:
SeqStack(intmSize)
{
maxtop=mSize-1;
top=-1;
st=newchar[mSize];
}
SeqStack:
:
~SeqStack()
{
delete[]st;
}
charSeqStack:
:
Top()
{
returnst[top];
}
boolSeqStack:
:
Push(charx)
{
if(top==maxtop)
returnfalse;
st[++top]=x;
returntrue;
}
boolSeqStack:
:
Pop()
{
if(top==-1)
returnfalse;
top--;
returntrue;
}
intp,q,r,s,t,u;
inta,b,result;
intv=0;
intnumber;//用number表示变元的个数
SeqStackstack(200);
voidNot()//否定
{
a=stack.Top();
stack.Pop();
result=a==1?
0:
1;
stack.Push(result);
}
voidOr()//析取
{
result=a+b;
result=result>1?
1:
result;
stack.Push(result);
}
voidAnd()//合取
{
result=a*b;
stack.Push(result);
}
voidIf()//条件,b->a
{
result=(b==1&&a==0)?
0:
1;
stack.Push(result);
}
voidDoubleif()//双条件
{
result=(b==a)?
1:
0;
stack.Push(result);
}
boolCanIn(charout)//优先级的判断
{
charin=stack.Top();
inti,o;
switch(in)
{
case'#':
i=0;break;
case'(':
i=1;break;
case'-':
i=3;break;
case'>':
i=5;break;
case'|':
i=7;break;
case'&':
i=9;break;
case'!
':
i=11;break;
case')':
i=12;break;
}
switch(out)
{
case'#':
o=0;break;
case'(':
o=12;break;
case'-':
o=2;break;
case'>':
o=4;break;
case'|':
o=6;break;
case'&':
o=8;break;
case'!
':
o=10;break;
case')':
o=1;break;
}
if(ireturntrue;
else
returnfalse;
}
voidInfixToPostfix()//中缀表达式转后缀表达式
{
stringtmp="";
stack.Push('#');
for(inti=0;(unsigned)i{
if(OriginalForm[i]=='P'||OriginalForm[i]=='Q'||OriginalForm[i]=='R'||OriginalForm[i]=='S'||OriginalForm[i]=='T'||OriginalForm[i]=='U')
{
tmp=tmp+OriginalForm[i];
continue;
}
if(CanIn(OriginalForm[i]))
stack.Push(OriginalForm[i]);
elseif(OriginalForm[i]==')')
{
while(stack.Top()!
='(')
{
tmp=tmp+stack.Top();
stack.Pop();
}
stack.Pop();
}
else
{
do
{
tmp=tmp+stack.Top();
stack.Pop();
}while(!
CanIn(OriginalForm[i]));
stack.Push(OriginalForm[i]);
}
}
while(stack.Top()!
='#')
{
tmp=tmp+stack.Top();
stack.Pop();
}
stack.Pop();
OriginalForm=tmp;
}
voidCalculate()//计算主析取范式和主合取范式的函数
{
if(number==3)
{
for(inti=0;(unsigned)i{
if(OriginalForm[i]=='P'||OriginalForm[i]=='Q'||OriginalForm[i]=='R')
{
v=OriginalForm[i]=='P'?
p:
OriginalForm[i]=='Q'?
q:
r;
stack.Push(v);
continue;
}
if(OriginalForm[i]!
='!
')
{
a=stack.Top();
stack.Pop();
b=stack.Top();
stack.Pop();
}
switch(OriginalForm[i])
{
case'-':
Doubleif();break;
case'>':
If();break;
case'|':
Or();break;
case'&':
And();break;
case'!
':
Not();break;
}
}
}
if(number==2)
{
for(inti=0;(unsigned)i{
if(OriginalForm[i]=='P'||OriginalForm[i]=='Q')
{
v=OriginalForm[i]=='P'?
p:
q;
stack.Push(v);
continue;
}
if(OriginalForm[i]!
='!
')
{
a=stack.Top();
stack.Pop();
b=stack.Top();
stack.Pop();
}
switch(OriginalForm[i])
{
case'-':
Doubleif();break;
case'>':
If();break;
case'|':
Or();break;
case'&':
And();break;
case'!
':
Not();break;
}
}
}
}
voidPrint()
{
if(number==3)
{
cout<<"P\t"<<"Q\t"<<"R\t"<<"Z"<for(p=1;p>=0;p--)
{
for(q=1;q>=0;q--)
{
for(r=1;r>=0;r--)
{
Calculate();
if(result==1)
Xiqu=Xiqu+"("+(p==1?
"P":
"!
P")+"&"+(q==1?
"Q":
"!
Q")+"&"
+(r==1?
"R":
"!
R")+")"+"|";
else
Hequ=Hequ+"("+(p==0?
"P":
"!
P")+"|"+(q==0?
"Q":
"!
Q")+"|"
+(r==0?
"R":
"!
R")+")"+"&";
cout<
}
}
}
}
if(number==2)
{
cout<<"P\t"<<"Q\t"<<"Z"<for(p=1;p>=0;p--)
{
for(q=1;q>=0;q--)
{
Calculate();
if(result==1)
Xiqu=Xiqu+"("+(p==1?
"P":
"!
P")+"&"+(q==1?
"Q":
"!
Q")+")"