利用真值表法求主析取范式及主合取范式的实现Word格式.docx

上传人:b****5 文档编号:20719182 上传时间:2023-01-25 格式:DOCX 页数:14 大小:87.98KB
下载 相关 举报
利用真值表法求主析取范式及主合取范式的实现Word格式.docx_第1页
第1页 / 共14页
利用真值表法求主析取范式及主合取范式的实现Word格式.docx_第2页
第2页 / 共14页
利用真值表法求主析取范式及主合取范式的实现Word格式.docx_第3页
第3页 / 共14页
利用真值表法求主析取范式及主合取范式的实现Word格式.docx_第4页
第4页 / 共14页
利用真值表法求主析取范式及主合取范式的实现Word格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

利用真值表法求主析取范式及主合取范式的实现Word格式.docx

《利用真值表法求主析取范式及主合取范式的实现Word格式.docx》由会员分享,可在线阅读,更多相关《利用真值表法求主析取范式及主合取范式的实现Word格式.docx(14页珍藏版)》请在冰豆网上搜索。

利用真值表法求主析取范式及主合取范式的实现Word格式.docx

三、实验原理及内容

内容:

编程实现用真值表法求任意含三个以内变量的合式公式的主析取范式和主合取范式。

原理:

首先读入变元个数,然后读入合式公式,用堆栈的知识将中缀表达式转化为后缀表达式,调用否定、析取、合取、条件、双条件的函数计算P、Q、R取不同真值时合式公式的真值,然后输出真值表,调用计算主析取范式和主合取范式的函数并输出。

程序:

#include<

iostream>

string>

>

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()

delete[]st;

charSeqStack:

Top()

returnst[top];

boolSeqStack:

Push(charx)

if(top==maxtop)

returnfalse;

st[++top]=x;

returntrue;

Pop()

if(top==-1)

top--;

intp,q,r,s,t,u;

inta,b,result;

intv=0;

intnumber;

//用number表示变元的个数

SeqStackstack(200);

voidNot()//否定

a=();

();

result=a==10:

1;

(result);

voidOr()//析取

result=a+b;

result=result>

11:

result;

voidAnd()//合取

result=a*b;

voidIf()//条件,b->

a

result=(b==1&

&

a==0)0:

voidDoubleif()//双条件

result=(b==a)1:

0;

boolCanIn(charout)//优先级的判断

charin=();

inti,o;

switch(in)

{

case'

#'

i=0;

break;

('

i=1;

-'

i=3;

'

i=5;

|'

i=7;

i=9;

!

i=11;

)'

i=12;

}

switch(out)

o=0;

o=12;

o=2;

o=4;

o=6;

o=8;

o=10;

o=1;

if(i<

o)

else

voidInfixToPostfix()//中缀表达式转后缀表达式

stringtmp="

"

;

('

);

for(inti=0;

(unsigned)i<

();

i++)

if(OriginalForm[i]=='

P'

||OriginalForm[i]=='

Q'

||OriginalForm[i]=='

R'

S'

T'

U'

tmp=tmp+OriginalForm[i];

continue;

if(CanIn(OriginalForm[i]))

(OriginalForm[i]);

elseif(OriginalForm[i]=='

while()!

='

tmp=tmp+();

do

}while(!

CanIn(OriginalForm[i]));

OriginalForm=tmp;

voidCalculate()//计算主析取范式和主合取范式的函数

if(number==3)

||OriginalForm[i]=='

v=OriginalForm[i]=='

p:

OriginalForm[i]=='

q:

r;

(v);

if(OriginalForm[i]!

b=();

switch(OriginalForm[i])

Doubleif();

If();

Or();

And();

Not();

if(number==2)

q;

voidPrint()

cout<

<

"

P\t"

<

Q\t"

R\t"

Z"

endl;

for(p=1;

p>

=0;

p--)

for(q=1;

q>

q--)

for(r=1;

r>

r--)

Calculate();

if(result==1)

Xiqu=Xiqu+"

("

+(p==1"

P"

:

)+"

+(q==1"

Q"

+(r==1"

R"

)"

+"

|"

Hequ=Hequ+"

+(p==0"

|"

+(q==0"

+(r==0"

&

p<

\t"

q<

r<

result<

Xiqu=Xiqu+"

+(p==1"

+(q==1"

Hequ=Hequ+"

+(p==0"

+(q==0"

cout<

endl;

if()!

=0)

()-2);

主析取范式:

Xiqu<

endl<

主合取范式:

Hequ<

intmain()

intflag=1;

while(flag==1)

SetConsoleTextAttribute(GetStdHandle

(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY

|FOREGROUND_GREEN|FOREGROUND_BLUE);

//设置绿色和蓝色相加(即青色)

system("

cls"

//清屏

-----------------"

欢迎使用!

endl<

!

表示否定"

endl<

|表示析取"

表示合取"

>

表示条件"

-表示双条件"

输入你的变元数目:

cin>

number;

cout<

请输入合式公式:

switch(number)

case2:

cout<

变元请用P、Q表示"

case3:

变元请用P、Q、R表示"

charstr[100];

str;

OriginalForm=str;

InfixToPostfix();

Print();

是否继续使用(继续请按1,退出请按0):

cin>

flag;

return0;

}

流程图:

N

举例使用:

四、实验小结(包括问题和解决方法、心得体会、意见与建议等)

刚开始思考如何写这个程序的时候,我不知道该如何处理输入进来的合式公式,在翻阅了数据结构书籍之后我才忽然反应过来,可以用堆栈的知识,将输入进来的中缀表达式转化为后缀表达式,这样就方便计算合式公式的真值了。

这次离散数学实验中,我成功地将所学习得C++的编程知识和数据结构里的堆栈的知识运用了起来,虽然中途遇到了一些困难,但最终都很好地解决了。

这次实验让我学会了利用编程语言来求主析取范式和主合取范式,更加深刻地理解了这两种范式,并且也让我对C、C++等编程语言有了更强的运用能力,让我明白了离散数学和编程知识是息息相关、密不可分的。

以后我将更加认真学习离散数学,并且更多地将编程的知识运用起来。

五、指导教师评语

成绩

批阅人

日期

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

当前位置:首页 > 初中教育 > 英语

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

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