| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 703 人关注过本帖
标题:写出下面程序对应头文件"bintree.h","stack.cpp" 程序没错误的 ...
取消只看楼主 加入收藏
aufish
Rank: 2
等 级:论坛游民
威 望:1
帖 子:59
专家分:94
注 册:2010-4-22
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:2 
写出下面程序对应头文件"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("**     本计算器前只支持或(|)、与(&)、非(!)以及蕴涵(-)运算            **\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));
}

 8

[ 本帖最后由 aufish 于 2010-4-22 19:24 编辑 ]
搜索更多相关主题的帖子: bintree stack cpp 
2010-04-22 19:10
aufish
Rank: 2
等 级:论坛游民
威 望:1
帖 子:59
专家分:94
注 册:2010-4-22
收藏
得分:0 
是吗?头文件你写了吗?
2010-04-23 20:49
aufish
Rank: 2
等 级:论坛游民
威 望:1
帖 子:59
专家分:94
注 册:2010-4-22
收藏
得分:0 
回复 5楼 itma
连头文件都没有,编译时就只有这两个头文件问题。其他的我不清楚,你所提出来的我不知在哪。但是这个程序是人家的作品,应该没错的啊,只是他没有给那两个头文件而已的啊。

[ 本帖最后由 aufish 于 2010-4-24 08:50 编辑 ]
2010-04-24 08:48
快速回复:写出下面程序对应头文件"bintree.h","stack.cpp" 程序没错误的 ...
数据加载中...
 
   



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

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