xiqu

更新时间:2023-01-03 17:28:00 阅读: 评论:0


2023年1月3日发(作者:1 6年级古诗)

__________________________________________________

__________________________________________________

实验报告

(/学年第一学期)

课程名

称离散数学

实验名称利用真值表法求主析取范式及主合

取范式的实现

实验时

年月日

指导单

指导教师

学生姓名班级学号

__________________________________________________

__________________________________________________

学院(系)专业

实验报告

实验名称利用真值表法求主析取范式及

主合取范式的实现

指导教师

实验类型上机实验学时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小时内删除。

上一篇:勿施于人
下一篇:北极雪
标签:xiqu
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图