| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1936 人关注过本帖
标题:求一个“输入一条命题公式(与或非条件,最好有双条件的)求真值表的程序”
只看楼主 加入收藏
aufish
Rank: 2
等 级:论坛游民
威 望:1
帖 子:59
专家分:94
注 册:2010-4-22
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:3 
求一个“输入一条命题公式(与或非条件,最好有双条件的)求真值表的程序”
求一个“输入一条命题公式(与或非,条件,最好有双条件的)求真值表的程序”
搜索更多相关主题的帖子: 命题 公式 真值 条件 
2010-04-25 10:30
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:21 
照着书上的真值表敲就是了
2010-04-25 20:11
aufish
Rank: 2
等 级:论坛游民
威 望:1
帖 子:59
专家分:94
注 册:2010-4-22
收藏
得分:0 
回复 2楼 hahayezhe
我晕,现在就是让你帮忙,把一个表都输出来的系统啊。让你做一个系统啊大哥。参考以下程序:

#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));
}
2010-04-26 11:46
xuexueshimei
Rank: 1
等 级:新手上路
帖 子:4
专家分:5
注 册:2012-3-20
收藏
得分:0 
为什么我运行了在#include "bintree.h"处有错误
这个不是二叉树函数吗?
具体如何用?
2012-03-20 17:22
快速回复:求一个“输入一条命题公式(与或非条件,最好有双条件的)求真值表的程 ...
数据加载中...
 
   



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

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