什么是c语言程序的真值表,求输入逻辑表达式然后得出真值表的算法思路,程序很难写求帮助...

#include

#include

#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 st;

Stack 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@)            **\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));

}

[本帖最后由 vandychan 于 2010-10-23 20:43 编辑]

6f83fddf9cb9ff6843fffd45e1807199.gif

到底是“出来混迟早要还”还是“杀人放火金腰带”?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值