【重言式判别】

[ 问题描述]

一个逻辑表达式如果对于其变元的任一种取值均为真,则成为重言式;反之,如果对于其变元的任一种取值都为假,则称为矛盾式,然而,更多的情况下,既非重言式,也非矛盾式。试写一个程序,通过真值表判别一个逻辑表达式属于上述哪一类。,

[ 基本要求]

(1 ) 逻辑表达式从终端输入,长度不超过一行。逻辑运算符包括 “ | ” 、 “ & ” 和 “ ~ ” ,分别表示或、与和非,运算优先程度递增,但可有括号改变,即括号内的运算优先。逻辑变元为大写字母。表达式中任何地方都可以含有多个空格符。

(2 )若是重言式或矛盾式,可以只显示 “ True  Forever ” 或 “ False Forever ” ,否则显示 “ Satisfactible ” 以及变量名序列,与用户交互。若用户对表达式变元取定一组值,程序就求出并显示逻辑表达式的值。

[ 测试数据]

(1 )(A |~A )&(B|~B )

(2 )(A& ~A )&C

(3 )A|B|C|D|E |~A

[ 实现提示]

(1) 识别逻辑表达式的符号形式并建立二叉树可以有两种策略:自底向上的算符优先法和自顶向下分割,先序遍历建立二叉树的方法。

(2) 可设表达式中逻辑变量数不超过20 。真值的产生可以通过在一维数组上维护一个 “ 软计数器 ” 实现,用递归算法实现更简单。#include<iostream> using namespace std; struct Arr { char letter; int weight; }; class Cys { public: Cys(); void GetTautology();//输入表达式 int _CreateT(int ,int );//虚拟创建二叉树 int FindMin(int ,int );//找到weight最小的 int count(); //计算可满足式的值 void _recursion(Arr *_arr,int i );//递归,穷举 void recursion();//使用接口函数 void Print();//输出结果 ~Cys();//析构释放空间 private: int num; Arr *array; Arr _arr[20]; //存放字母 int _arrNum; int trueforever; int falseforever; }; Cys::Cys() { trueforever=0; falseforever=0; array=new Arr[20]; for(int i=0;i<20;i++){ array[i].weight-1; array[i].letter='0'; } _arrNum=0; num=0; } void Cys::GetTautology() { int has[27]={0}; int weight=0; char ch; cout<<"请输入一个逻辑表达式,以#结束"<<endl; while(cin>>ch && ch!='#') { if(ch==' ') continue; switch(ch) { case '(': weight+=4; break; case ')': weight-=4; break; case '&': array[num].letter=ch; array[num++].weight=weight+2; break; case '|': array[num].letter=ch; array[num++].weight=weight+1; break; case '~': array[num].letter=ch; array[num++].weight=weight+3; break; default: array[num].letter=ch; if(!has[array[num].letter-'A']){ _arr[_arrNum++].letter=array[num].letter; has[array[num].letter-'A']=1; } array[num++].weight=0; break; } } } int Cys:: FindMin(int low,int high) { int min=low; while(!array[min].weight) min++; if(min<high){ for(int i=min;i<high+1;i++) if(array[i].weight && array[i].weight<array[min].weight) min=i; return min; } else return 0; } int Cys::_CreateT(int low,int high) { int Min=0; // cout<<"create"<<endl; if(low>high) return 1; else if(low==high) { // cout<<"letter"<<array[low].letter<<endl; int i; for(i=0;_arr[i].letter!=array[low].letter;i++);//从array[]中寻找与_arr[]中相同的字母 return _arr[i].weight;//返回它的weight(1或0) } else{ Min=FindMin(low,high); //cout<<"array[Min].letter: "<<array[Min].letter; switch(array[Min].letter){ case '&': return( _CreateT(low,Min-1)&& _CreateT(Min+1,high)); break; case '|': return( _CreateT(low,Min-1)|| _CreateT(Min+1,high)); break; case '~': return(!_CreateT(Min+1,high)); break; } } } int Cys:: count() //计算可满足式的值 { int i=0; cout<<"请给字母赋值"<<endl; while(_arrNum--){ cout<<_arr[i].letter; cin>>_arr[i++].weight; } if(_CreateT(0,num-1)) trueforever++; else falseforever++; } void Cys::_recursion(Arr _arr[],int i)//递归调用 { if(i<_arrNum){ _arr[i].weight=0; // cout<<"0"<<endl; _recursion(_arr,i+1); _arr[i].weight=1; // cout<<"1"<<endl; _recursion(_arr,i+1); } else if(!trueforever||!falseforever) { switch(_CreateT(0,num-1)) { case 1: // cout<<"trueforever++;"<<endl; trueforever++; break; case 0: // cout<<"falseforever++;"<<endl; falseforever++; break; default : break; } } } void Cys::Print() { if(trueforever && falseforever)//如果真假同时存在就判断它为 satisfactible. cout<<"satisfactible."<<endl; else if(!trueforever) cout<<"falseforever."<<endl; else cout<<"trueforever. "<<endl; } void Cys::recursion() { _recursion(_arr,0); } Cys::~Cys() { delete[] array; } int main() { cout<<"-------------------重言式判别--------------------"<<endl; Cys cys; char c; cys.GetTautology(); cout<<"计算机穷举请按't' or 用户赋值请按'n'"<<endl; cin>>c; if(c=='t') cys.recursion();//穷举 else cys.count();//赋值 cys.Print(); system("pause"); return 0; }

重言式判定------参考了别人的代码。。相关推荐

  1. 记录一次和朋友聊天遇到的面试题 ip地址字符串和long类型的相互转换 都是参考了别人的代码 加了一些个人理解的总结

    package zyr.demo02;import java.util.*;/*** ip地址和long的相互转换*/ public class Test{/*ip->long:*1.将ip地址 ...

  2. 【C++】如何阅读别人的代码?如何阅读别人的C++代码?如何高效学习他人代码

    [ C/C++ ] 程序学习--如何阅读别人的代码 ++++++++++++ 第一章: 导论 ++++++++++++ 1.要养成一个习惯, 经常花时间阅读别人编写的高品质代码. 2.要有选择地阅读代 ...

  3. 如何快速看懂别人的代码

    我们在写程式时,有不少时间都是在看别人的代码.  例如看小组的代码,看小组整合的守则,若一开始没规划怎么看,  就会"噜看噜苦(台语) " 不管是参考也好,从开源抓下来研究也好,为 ...

  4. 看懂别人的代码,只是成为高效程序员的第一步!

    作者 | SeattleDataGuy 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 在为面试做准备的时候,很多软件工程师都花费了大量时间做编程题和完善简历. 最终在找 ...

  5. 怎么从gitlab上下载别人的代码

    提要 当需要从gitlab上下载别人的代码时,这里简述一下如何操作. 方法 按如下的步骤来实现: 1.在自己的电脑脑上新建一个空文件夹,文件夹的名称自己取. 2.在新建的文件夹上右键,选择git ba ...

  6. python快速接手别人的代码_十步教你如何接手别人的代码!

    想必在很多程序员的职业生涯中,都有过一种难以避免的状况,即接下别人的代码.而这是种怎样的体验?有人说,接手别人的代码之后我也想辞职:有人说,一个连注释都没有的代码有何灵魂可言:更有网友说,如果你恨一个 ...

  7. 十步教你如何接手别人的代码!

    想必在很多程序员的职业生涯中,都有过一种难以避免的状况,即接下别人的代码.而这是种怎样的体验?有人说,接手别人的代码之后我也想辞职:有人说,一个连注释都没有的代码有何灵魂可言:更有网友说,如果你恨一个 ...

  8. 看懂别人的代码,和自己能写代码是两回事

    看懂别人的代码,和自己能写代码是两回事--在理解了别人代码中功能后,自己还是要多动手实现 -- 往往这个时候才能有更大的收获. 转载于:https://www.cnblogs.com/lazyboy1 ...

  9. 如果你恨一个人,就让他去接手别人的代码

    那一年我招募了一个具备三年工作经验的前端开发工程师,他有一个很英雄的名字:萧峰. 我让萧峰接管了产品代码里的数据统计分析模块,我告诉他这个模块功能不难,但非常重要!功能主要包括推广渠道.支付流水.用户 ...

  10. lrd热加载方式启动本地web服务(我用于从github把别人服务器代码拉倒本地去搭建自己的网络服务)

    作者:吴甜甜 个人博客网站: wutiantian.github.io lrd启动本地web服务(我用于从github把别人服务器代码拉倒本地去搭建自己的网络服务) 主要用于局域网布置物联网项目,当然 ...

最新文章

  1. 消息服务发送短信,手机接收不到短信解决思路
  2. 常见却又不太了解的一些Windows文件类型
  3. 浅谈k8s cni 插件
  4. MySQL 错误1418
  5. perm函数c语言_理解C语言(三) 字符串处理函数
  6. 3、常用数据库访问接口简介
  7. Spring Session快速入门
  8. 时下最流行前端构建工具Webpack 入门总结
  9. 操作系统:虚拟页式存储管理(缺页中断、页面置换算法)
  10. mysql联合索引like_MySQL全文索引、联合索引、like查询、json查询速度大比拼
  11. TypeScript 安装与使用
  12. android obd编程,Android蓝牙连接汽车OBD设备
  13. 吴恩达神经网络和深度学习-学习笔记-37-inception网络
  14. [转载] python divmod()函数
  15. 【转载】SpringMVC访问静态资源
  16. 2.0显示为整数 java_关于java:我知道为什么我需要在这里将整数文字转换为(int)?...
  17. 联想笔记本上Ubuntu无线网卡问题
  18. 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种
  19. 第二课:创建三层神经网络解决非线性问题
  20. django html菜单,使用Django模板的导航菜单

热门文章

  1. OA系统行业解析:中小型企业OA选型常见问题
  2. 数独解法/n皇后的回溯算法
  3. 小程序出现 返回顶部按钮 top
  4. 英特尔服务器芯片组路线图,英特尔处理器路线图:14nm用到2021年 7nm再等3年
  5. 不用转化器PDF怎么转换成Word
  6. Excel-DATEDIF函数计算两日期天数差
  7. 武汉理工大学数据库综合实验——教学管理信息系统--本科专业培养计划
  8. java 公众号发送消息_java微信公众号发送消息模板
  9. C# StreamReader 读取ANSI编码文本文件乱码
  10. 修改apk图标及名字