__________________________________________________
__________________________________________________
实验报告
(/学年第一学期)
课程名
称离散数学
实验名称利用真值表法求主析取范式及主合
取范式的实现
实验时
间
年月日
指导单
位
指导教师
学生姓名班级学号
__________________________________________________
__________________________________________________
学院(系)专业
实验报告
实验名称利用真值表法求主析取范式及
主合取范式的实现
指导教师
实验类型上机实验学时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)
returnfal;
st[++top]=x;
__________________________________________________
__________________________________________________
returntrue;
}
boolSeqStack::Pop()
{
if(top==-1)
returnfal;
top--;
returntrue;
}
intp,q,r,s,t,u;
inta,b,result;
intv=0;
intnumber;//用number表示变元的个数
SeqStackstack(200);
voidNot()//否定
{
a=();
();
result=a==1?0:1;
(result);
}
__________________________________________________
__________________________________________________
voidOr()//析取
{
result=a+b;
result=result>1?1:result;
(result);
}
voidAnd()//合取
{
result=a*b;
(result);
}
voidIf()//条件,b->a
{
result=(b==1&&a==0)?0:1;
(result);
}
voidDoubleif()//双条件
{
result=(b==a)?1:0;
(result);
}
boolCanIn(charout)//优先级的判断
__________________________________________________
__________________________________________________
{
charin=();
inti,o;
switch(in)
{
ca'#':i=0;break;
ca'(':i=1;break;
ca'-':i=3;break;
ca'>':i=5;break;
ca'|':i=7;break;
ca'&':i=9;break;
ca'!':i=11;break;
ca')':i=12;break;
}
switch(out)
{
ca'#':o=0;break;
ca'(':o=12;break;
ca'-':o=2;break;
ca'>':o=4;break;
ca'|':o=6;break;
ca'&':o=8;break;
__________________________________________________
__________________________________________________
ca'!':o=10;break;
ca')':o=1;break;
}
if(i
returntrue;
el
returnfal;
}
voidInfixToPostfix()//中缀表达式转后缀表达式
{
stringtmp="";
('#');
for(inti=0;(unsigned)i<();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]))
__________________________________________________
__________________________________________________
(OriginalForm[i]);
elif(OriginalForm[i]==')')
{
while(()!='(')
{
tmp=tmp+();
();
}
();
}
el
{
do
{
tmp=tmp+();
();
}while(!CanIn(OriginalForm[i]));
(OriginalForm[i]);
}
}
while(()!='#')
{
__________________________________________________
__________________________________________________
tmp=tmp+();
();
}
();
OriginalForm=tmp;
}
voidCalculate()//计算主析取范式和主合取范式的函数
{
if(number==3)
{
for(inti=0;(unsigned)i<();i++)
{
if(OriginalForm[i]=='P'||OriginalForm[i]=='Q'||
OriginalForm[i]=='R')
{
v=OriginalForm[i]=='P'?p:OriginalForm[i]=='Q'?
q:r;
(v);
continue;
}
if(OriginalForm[i]!='!')
{
__________________________________________________
__________________________________________________
a=();
();
b=();
();
}
switch(OriginalForm[i])
{
ca'-':Doubleif();break;
ca'>':If();break;
ca'|':Or();break;
ca'&':And();break;
ca'!':Not();break;
}
}
}
if(number==2)
{
for(inti=0;(unsigned)i<();i++)
{
if(OriginalForm[i]=='P'||OriginalForm[i]=='Q')
{
v=OriginalForm[i]=='P'?p:q;
__________________________________________________
__________________________________________________
(v);
continue;
}
if(OriginalForm[i]!='!')
{
a=();
();
b=();
();
}
switch(OriginalForm[i])
{
ca'-':Doubleif();break;
ca'>':If();break;
ca'|':Or();break;
ca'&':And();break;
ca'!':Not();break;
}
}
}
}
voidPrint()
__________________________________________________
__________________________________________________
{
if(number==3)
{
cout<<"Pt"<<"Qt"<<"Rt"<<"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")+")"+"|";
el
Hequ=Hequ+"("+(p==0?"P":"!P")+"|"
+(q==0?"Q":"!Q")+"|"
+(r==0?"R":"!R")+")"+"&";
cout<
<
}
__________________________________________________
__________________________________________________
}
}
}
if(number==2)
{
cout<<"Pt"<<"Qt"<<"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")+")"+"|";
el
Hequ=Hequ+"("+(p==0?"P":"!P")+"|"+(q
==0?"Q":"!Q")+")"+"&";
cout<
}
}
}
cout<
__________________________________________________
__________________________________________________
if(()!=0)
(()-2);
if(()!=0)
(()-2);
cout<<"主析取范式:"<
cout<<"主合取范式:"<
}
intmain()
{
intflag=1;
while(flag==1)
{
SetConsoleTextAttribute(GetStdHandle
(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
|FOREGROUND_GREEN|FOREGROUND_BLUE);
//设置绿色和蓝色相加(即青色)
system("cls");//清屏
cout<<"-----------------"<
cout<<"欢迎使用!"<
cout<<"!表示否定"<
cout<<"|表示析取"<
__________________________________________________
__________________________________________________
cout<<"&表示合取"<
cout<<">表示条件"<
cout<<"-表示双条件"<
cout<<"-----------------"<
cout<
cin>>number;
cout<<"请输入合式公式:";
switch(number)
{
ca2:cout<
break;
ca3:cout<
endl;break;
}
charstr[100];
cin>>str;
OriginalForm=str;
InfixToPostfix();
Print();
cout<
cin>>flag;
}
__________________________________________________
__________________________________________________
return0;
}
流程图:
开始
输入变元个数
输入合式公式
输出真值表
计算主析取范式和
主合取范式
输出主析取范式
和主合取范式
是否继续使用(Y/N)
Y
__________________________________________________
__________________________________________________
N
举例使用:
退出程序
__________________________________________________
__________________________________________________
__________________________________________________
__________________________________________________
__________________________________________________
__________________________________________________
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
刚开始思考如何写这个程序的时候,我不知道该如何处理输入进来的合
式公式,在翻阅了数据结构书籍之后我才忽然反应过来,可以用堆栈的知识,
将输入进来的中缀表达式转化为后缀表达式,这样就方便计算合式公式的真
值了。
这次离散数学实验中,我成功地将所学习得C++的编程知识和数据结构
里的堆栈的知识运用了起来,虽然中途遇到了一些困难,但最终都很好地解
决了。这次实验让我学会了利用编程语言来求主析取范式和主合取范式,更
加深刻地理解了这两种范式,并且也让我对C、C++等编程语言有了更强的
运用能力,让我明白了离散数学和编程知识是息息相关、密不可分的。以后
我将更加认真学习离散数学,并且更多地将编程的知识运用起来。
五、指导教师评语
成绩批阅人日期
本文发布于:2023-01-03 17:28:00,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/85573.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |