输入一个逻辑表达式,输出它的真值表,要用c语言写的 20

谢谢各位了。。。... 谢谢各位了。。。 展开
 我来答
创作者CrzTPPVSY0
2019-04-20 · TA获得超过3736个赞
知道大有可为答主
回答量:3058
采纳率:25%
帮助的人:242万
展开全部
/*本程序支持任意输入的逻辑表达式,可以进行与或非和蕴涵的运算,表达式中可带括号.bintree.h和stack.cpp为二叉树和栈的定义及实现*/
#include
<stdio.h>
#include
<malloc.h>
#define
MAXNUM
100
//栈最大元素个数
#define
MAXEXP
30
//允许用户输入的表达式最大字符数
#include
"bintree.h"
#include
"stack.cpp"
const
char
and
=
'&',
or
=
'|',
then
=
'-';
bool
InOpt(char
c)
{
return
(c
==
'&'
||
c
==
'|'
||
c
==
'-'
||
c
==
'#');
}
bool
IsNum(char
c)
{
return
(c
>=
'0'
&&
c
<=
'9');
}
bool
IsAlp(char
c)
{
return
((c
<=
'z'
&&
c
>=
'a')
||
(c
>=
'A'
&&
c
<=
'Z'));
}
bool
CheckSyntax(char*
exp)
{
char*
cp
=
exp;
while
(*cp
!=
'\0')
{
if
(!(IsNum(*cp)
||
IsAlp(*cp)
||
InOpt(*cp)
||
*cp
==
'('
||
*cp
==
')'))
return
FALSE;
cp++;
}
if
(*(--cp)
!=
'#')
return
FALSE;
return
TRUE;
}
PBinTree
TransferTree(char
*exp)
{
PBinTreeNode
pbt
=
CrtBinTree();
Stack<BinTreeNode*>
st;
Stack<char>
sc;
char*
ch
=
exp,c;
sc.Push('#');
while
(!(sc.GetTop()==
'#'
&&
*ch
==
'#'))
{
if
(IsAlp(*ch))
{
PBinTreeNode
t
=
CrtBinTree();
t->data
=
*ch;
st.Push(t);
}
else
if
(IsNum(*ch))
{
while
(IsNum(*ch))
{
ch++;
}
ch--;
PBinTreeNode
t
=
CrtBinTree();
t->data
=
*ch;
st.Push(t);
}
else
{
switch
(*ch)
{
case
'(':
sc.Push(*ch);
break;
case
')':
{
c
=
sc.Pop();
while
(c
!=
'(')
{
PBinTreeNode
t
=
CrtBinTree();
t->data
=
c;
t->rChild
=
st.Pop();
t->lChild
=
st.Pop();
st.Push(t);
c
=
sc.Pop();
}
break;
}
default:
{
while
(sc.GetTop()
!=
'#'
&&
sc.GetTop()
!=
'(')
{
PBinTreeNode
t
=
CrtBinTree();
c
=
sc.Pop();
t->data
=
c;
t->rChild
=
st.Pop();
t->lChild
=
st.Pop();
st.Push(t);
}
if
(*ch
!=
'#')
sc.Push(*ch);
break;
}
}
}
if
(!sc.IsEmpty()
&&
*ch
!=
'#')
ch++;
}
pbt
=
st.Pop();
return
pbt;
}
void
GetVariable(PBinTree
pbt)
{
PBinTree
vpt
=
pbt;
if
((pbt->data
>=
'a'
&&
pbt->data
<=
'z')
||
(pbt->data
>=
'A'
&&
pbt->data
<=
'Z'))
{
printf
("请输入%c的值(1或0):\n",vpt->data);
scanf
("%c",&vpt->data);
getchar();
}
if
(vpt->lChild
!=
NULL)
GetVariable(vpt->lChild);
if
(vpt->rChild
!=
NULL)
GetVariable(vpt->rChild);
}
char
Caculate(PBinTree
pbt)
{
PBinTree
vpt
=
pbt;
if
(vpt
==
NULL)
{
printf("没有任何表达式可计算!");
return
FALSE;
}
if
(vpt->lChild
==
NULL)
//找到叶子结点
return
vpt->data;
if
(InOpt(vpt->data)
&&
Caculate(vpt->lChild)
&&
Caculate(vpt->rChild))
{
switch(vpt->data)
{
case
and:
if
(Caculate(vpt->lChild)
==
'1'
&&
Caculate(vpt->rChild)
==
'1')
vpt->data
=
'1';
else
vpt->data
=
'0';
break;
case
or:
if
(Caculate(vpt->lChild)
==
'0'
&&
Caculate(vpt->rChild)
==
'0')
vpt->data
=
'0';
else
vpt->data
=
'1';
break;
case
then:
if
(Caculate(vpt->lChild)
==
'1'
&&
Caculate(vpt->rChild)
==
'0')
vpt->data
=
'0';
else
vpt->data
=
'1';
break;
}
}
return
vpt->data;
}
void
main()
{
char*
exp
=
(char*)
malloc
(sizeof(char)*MAXEXP);
printf("****************************************************************************\n");
printf("**
逻辑表达式计算器1.10
**\n");
printf("**
Created
by
YangPengfei(pkusocold@gmail.com)
**\n");
printf("**
本计算器前只支持或(|)、与(&)、非(!)以及蕴涵(-)运算
**\n");
printf("****************************************************************************\n");
printf("\n");
printf("请输入需要计算的逻辑表达式(需要在表达式后加一个\"#\"号):\n");
gets(exp);
while
(!CheckSyntax(exp))
{
printf("表达式输入错误,请重新输入:\n");
gets(exp);
}
PBinTree
pbt
=
TransferTree(exp);
GetVariable(pbt);
printf
("这个逻辑表达式的值为:
%c
\n",Caculate(pbt));
}
zhishupp
2006-10-11
知道答主
回答量:35
采纳率:0%
帮助的人:27.8万
展开全部
C 程序设计(第二版) 谭浩强 著 清华大学出版社
第88页,89页。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
井峰明辉
2006-10-11 · 超过28用户采纳过TA的回答
知道答主
回答量:154
采纳率:0%
帮助的人:0
展开全部
详细说明一下要求,是对任意的逻辑表达式吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
生活忙忙U
2006-10-11
知道答主
回答量:4
采纳率:0%
帮助的人:0
展开全部
给个示例题目。
没看懂什么要求。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式