重言式判别课程设计c语言栈,重言式判别源码及课程设计-c语言版.docx

44cb7578e1df5412b94317daaa3307ba.gif重言式判别源码及课程设计-c语言版.docx

下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。

2.下载的文档,不会出现我们的网址水印。

3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。

文档包含非法信息?点此举报后获取现金奖励!

下载文档到电脑,查找使用更方便

20

积分

还剩页未读,继续阅读

关 键 词:重言式

判别

源码

课程设计

语言版

资源描述:

重言式的判别

题目:

一个逻辑表达式如果对于其変元的任一种取值都为真,则称为重言式;反之,如果对于其变元的任一种取值都为假,则称为矛盾式;然而,更多的情况下,既非重言式,也非矛盾式。试写一程序,通过真值表判别一个逻辑表达式属于上述哪一类。

一、需求分析

1、逻辑表达式从终端输入,长度不超过一行。

2、逻辑运算符包括“|”“&”“~”表示或 与 非。运算符优先程度递增,但是可由括号改变。

3、逻辑变元为大写字母表达式中任何地方都可以含有多个空格符。

4、运用自底向上的算符优先法

5、重言式显示“true forever”;矛盾式显示“false forever”;

否则显示“satisfactible”。

二、概要设计

为实现上述需求需要用到自底向上的算符优先法,和自顶向下分割,先序遍历建立二叉树的方法。

自底向上的算符优先法:

char OPTRCHART[7][7]=

{

,|,&,~,(,),#,

|,>,,>,

&,>,>,,>,

~,>,>,>,,>,

(,,

),>,>,>,>,>,>,

#,data,*p))

{

case :

break;

}/*switch*/

建立二叉树:

typedef struct BiTNode

{

struct BiTNode * Lchild;

struct BiTNode * Rchild;

ElemType data;

}BiTNode , *BiTree;

栈中的操作:

typedef struct Node

{

BiTree * base;

BiTree *top;

int stacksize;

}SqStack;

入栈操作及出栈销毁栈的操作:

int InitStack(SqStack * stack)

{

stack->base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree));

if(!stack->base)

exit(OVERFLOW);

stack->top=stack->base;

stack->stacksize=STACK_INIT_SIZE;

return OK;

}

BiTree GetTop(SqStack * stack)

{

if(stack->top==stack->base)

return NULL;

return *(stack->top-1);

}

int Push(SqStack * stack,BiTree Bitnode)

{

if(stack->top-stack->base>=stack->stacksize)

{

stack->base=(BiTree*)realloc(stack->base,(stack->stacksize+STACKINCREAMENT)*sizeof(BiTree));

if(!stack->base)

exit(OVERFLOW);

stack->top=stack->base+stack->stacksize;

stack->stacksize+=STACKINCREAMENT;

}

*(stack->top)=Bitnode;

stack->top++;

return OK;

}

BiTree Pop(SqStack * stack)

{

if(stack->top==stack->base)

return ERROR;

return *(--stack->top);

}

int DestroyStack (SqStack * stack)

{

free(stack->base);

return OK;

}

三、详细设计

详细程序如下:

#include#include#include#include#define OK 1

#define ERROR 0

#define VARIMAXNUM 20

#define STARMAXLEN 100

#define STACK_INIT_SIZE 100 //栈的最大长度

#define STACKINCREAMENT 10 //每次增加的栈的长度

#define ElemType char 将elemtype定义为char型

typedef struct BiTNode //创建树节点 按照书上原样创建

{

struct BiTNode * Lchild;

struct BiTNode * Rchild;

ElemType data; //字符型

}BiTNode , *BiTree;

typedef struct Node //栈

{

BiTree * base;

BiTree *top;

int stacksize;

}SqStack;

char OPTRCHART[7][7]= //此举是为了后面的优先级考虑

{

,|,&,~,(,),#,

|,>,,>,

&,>,>,,>,

~,>,>,>,,>,

(,,

),>,>,>,>,>,>,

#,base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree));

if(!stack->base)

exit(OVERFLOW);

stack->top=stack->base;

stack->stacksize=STACK_INIT_SIZE;

return OK;

}

BiTree GetTop(SqStack * stack) //返回值为BiTree类型的 取栈头

{

if(stack->top==stack->base)

return NULL;

return *(stack->top-1);

}

int Push(SqStack * stack,BiTree Bitnode) //将树的节点放进栈的操作,入栈

{

if(stack->top-stack->base>=stack->stacksize)

{

stack->base=(BiTree*)realloc(stack->base,(stack->stacksize+STACKINCREAMENT)*sizeof(BiTree));

if(!stack->base)

exit(OVERFLOW);

stack->top=stack->base+stack->stacksize;

stack->stacksize+=STACKINCREAMENT;

}

*(stack->top)=Bitnode;

stack->top++;

return OK;

}

BiTree Pop(SqStack * stack) //取值指针后移

{

if(stack->top==stack->base)

return ERROR;

return *(--stack->top);

}

int DestroyStack (SqStack * stack) //毁栈

{

free(stack->base);

return OK;

}

char str[STARMAXLEN];

int varitab[VARIMAXNUM+1];

int sum;

BiTree root;

SqStack OPTR,OPND;

char cmp(char a,char b) //取左右交叉的符号即“”“=”

{

int i,j;

for(i=0;i<=6;i++)

{

if(OPTRCHART[i][0]==a)

break;

}

for(j=0;j<=6;j++)

{

if(OPTRCHART[0][j]==b)

break;

}

return OPTRCHART[i][j];

}

void CreatBiTree() // 建树

{

BiTree temp,a,b;

char *p=str;

temp=(BiTree)malloc(sizeof(BiTNode));

temp->data=#;

Push(&OPTR,temp);

while((*p!=#)||(GetTop(&OPTR)->data!=#))

{

if((*p>=65)&&(*p<=90)||(*p>=97)&&(*p<=122))

{

temp=(BiTree)malloc(sizeof(BiTNode));

temp->data=*p;

temp->Lchild=NULL;

temp->Rchild=NULL;

Push(&OPND,temp);

p++;

}

else

{

switch(cmp(GetTop(&OPTR)->data,*p)) //开始判断优先级

{

case data=*p;

temp->Lchild=NULL;

temp->Rchild=NULL;

Push(&OPTR,temp);

p++;

break;

case =:

temp=Pop(&OPTR);

free(temp);

p++;

break;

case >:

temp=Pop(&OPTR);

b=Pop(&OPND);

temp->Rchild=b;

if(temp->data!=~)

{

a=Pop(&OPND);

temp->Lchild=a;

}

Push(&OPND,temp);

break;

}/*switch*/

}/*else*/

}/*while*/

root=Pop(&OPND);

temp=Pop(&OPTR);

free(temp);

}

void DestroyBiTree(BiTree tree){ //销毁树并取出需要的值

if(!tree){

return;

}

else if((tree->Lchild==NULL)&&(tree->Rchild==NULL)){

free(tree);

return;

}

else{

DestroyBiTree(tree->Lchild);

DestroyBiTree(tree->Rchild);

free(tree);

}

}

int GetValue(BiTree tree){

if(!tree){

return 0;

}

else if((tree->data>=65)&&(tree->data<=90)){

return varitab[tree->data-64];

}

else if((tree->data>=97)&&(tree->data<=122))

{

return varitab[tree->data-96];

}

else{

switch(tree->data){

case |:

return (GetValue(tree->Lchild)||GetValue(tree->Rchild));

case &:

return (GetValue(tree->Lchild)&&GetValue(tree->Rchild));

case ~:

return (!GetValue(tree->Rchild));

}

}

}

void destroy() //销毁栈

{

DestroyStack (&OPTR);

DestroyStack (&OPND);

}

void init(){

InitStack(&OPTR);

InitStack(&OPND);

*varitab=0;

sum=(int)pow(2.0,*varitab);

root=NULL;

str[0]=#;

}

void input(){ // 为了能继续输入需要判别的式子

char *p,*q;

printf("请输入要判断的式子中变量的数目\n");

scanf("%d",varitab);

while(*varitab<0){

printf("错误,请重新输入数字!\n");

printf("请输入要判断的式子中变量的数目:\n");

scanf("%d",varitab);

}

getchar();

sum=(int)pow(2.0,*varitab);

printf("输入要判别的式子:\n");

gets(str);

for(p=q=str;*p;p++)

if(*p!= )

*q++=*p;

*q=#;

}

void Varitab(int n)

{

int i;

for(i=0;i>i)%2;

}

void table()

{

int i,j,value;

printf("真值表为:\n");

for(i=1;i<=*varitab;i++)

printf(" %c",64+i);

printf("\n");

for(i=0;ibase=(BiTree*)realloc(stack->base,(stack->stacksize+STACKINCREAMENT)*sizeof(BiTree));此句原来写的事stack->base=(BiTree *)malloc((stack->stacksize+STACKINCREAMENT)*sizeof(BiTree));程序无法执行,不知为什么。

6、stack->base=(BiTree )malloc(stack->stacksize*(sizeof(BiTree))) 此句本来在(BiTree *)结果报多* 去掉没问题,但是不明白

五、用户手册

本程序采用需要用户输入或者判别的时候步步都有提示如图所示

六、测试结果

需要测试的数据为:

(1)(A|~A)&(B|~B)

(2)(A&~A)&C

(3)A|B|C|D|E|~A

(4)A&B&C&~B

(5)(A|B)&(A|~B)

(6)A&~B|~A&B;0,0;0,1;1,0;1,1。

测试结果如图所示:

七、用户手册

#include#include#include#include

展开阅读全文

温馨提示:

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。

2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。

3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。

4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。

5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。

6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。

7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

bb6249c6567dd4384e6ab3556cfc22ed.gif 

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

关于本文

本文标题:重言式判别源码及课程设计-c语言版.docx

链接地址:https://www.renrendoc.com/p-49447419.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值