| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3512 人关注过本帖
标题:求输入逻辑表达式然后得出真值表的算法思路,程序很难写求帮助
只看楼主 加入收藏
ccmike98
Rank: 2
来 自:苏州
等 级:论坛游民
帖 子:76
专家分:56
注 册:2010-7-13
结帖率:75%
收藏
已结贴  问题点数:50 回复次数:9 
求输入逻辑表达式然后得出真值表的算法思路,程序很难写求帮助
要求:输入一个逻辑表达式(如A&B|C)然后得出真值表
A  B   C       A&B|C
0  0   0        0
0  0   1        1
0  1   0        0
0  1   1        1
1  0   0        0
1  0   1        1
1  1   0        1
1  1   1        1
很难写的程序希望大家给点思路,
不需要程序,只要把思路说一下就行了

另外,里面有一个运算符优先级的函数不知道怎么写
运算符有  +(双条件)、-(条件)、|、&、!、((左括号)、)(右括号)

  + - | & ! ( )
+ > < < < < < >
- > > < < < < >
| > > > < < < >
& > > > > < < >
! > > > > > < >
( < < < < < < =
) > > > > > E >     E表示错误
这是运算符优先级的比较表  比法:先看竖列再在第一行找(例:+与&比较  +<&  即&优先级高)

我记得老师是用一个2维数组写的这个函数。

求那位大神来帮帮我

[ 本帖最后由 ccmike98 于 2010-10-24 11:17 编辑 ]
搜索更多相关主题的帖子: 算法 真值 思路 逻辑 
2010-10-23 20:39
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:12 
真的不想写

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-10-23 20:40
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
#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@)            **\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 编辑 ]

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-10-23 20:41
ccmike98
Rank: 2
来 自:苏州
等 级:论坛游民
帖 子:76
专家分:56
注 册:2010-7-13
收藏
得分:0 
回复 2楼 vandychan
只要说下思路就行了,我自己搞定它
2010-10-23 20:42
ccmike98
Rank: 2
来 自:苏州
等 级:论坛游民
帖 子:76
专家分:56
注 册:2010-7-13
收藏
得分:0 
回复 3楼 vandychan
大哥,把那个头文件也发个我吧,我试试
2010-10-23 20:50
煎熬
Rank: 2
等 级:论坛游民
帖 子:2
专家分:14
注 册:2010-10-20
收藏
得分:12 
回复 4楼 ccmike98
定义一个a[N][3]的数组 然后把a[i][3]依次赋给a,b,c 就行了
2010-10-23 22:48
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:12 
利用堆栈很容易实现!!

If You Want Something, Go Get It, Period.
2010-10-23 23:07
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
怎么又是帮你?m21wo

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-10-23 23:09
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
收藏
得分:12 
顶一下!
2010-10-26 10:59
rxxcow
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-4-10
收藏
得分:0 
回复 3楼 vandychan
这位大神,你能给出bintree.h和stack.cpp吗?还有,你可以讲解一下这个程序的思路吗?
2013-04-10 19:59
快速回复:求输入逻辑表达式然后得出真值表的算法思路,程序很难写求帮助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.070298 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved