代码如下:

#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
const int N = 300;
stack<char> s;
stack<char> v;
int seq;
bool vis[N];
bool flag[N];
void dfs(int n);
vector<int> ans_v;
vector<int> ans_vf;void printMenu()
{cout << "代码其实有点不健壮,需要用括号来手动处理优先级!" << endl;cout << "比如:!!!(a&b&c)  要写成!(!(!(a&b&c)))" << endl;cout << "比如:!(a&b)->c 要写成 (!(a&b))>c" << endl;cout << "合取& 析取| 非! 条件> 双条件~ 括号() " << endl;cout << endl;
}void printAns(vector<int> &ans_v, char f, char v)
{for (int i = 0; i < ans_v.size(); i++){cout << f << ans_v[i];if (i != ans_v.size() - 1){cout << v;}}cout << endl;
}void calculator(int n, string &str)
{str = '(' + str + ')';for (int i = 0; i < str.length(); i++){char tmp = str[i];if (tmp >= 'a' && tmp <= 'z'){vis[tmp - 'a'] = true;s.push(tmp);}else if (tmp == '('){v.push(tmp);}else if (tmp == ')'){while (v.top() != '('){s.push(v.top());v.pop();}v.pop();}else{v.push(tmp);}}stack<char>t;while (!s.empty()){t.push(s.top());s.pop();}s = t;stack<char>h(s);while (!h.empty()){cout << h.top();h.pop();}cout << endl;dfs(0);cout << "主合取范式为:" << endl;printAns(ans_v, 'm', '&');cout << "主析取范式为:" << endl;printAns(ans_vf, 'M', '|');}void dfs(int n)
{if (n == 26){stack<char> s_s(s);stack<bool> s_t;while (!s_s.empty()){if (s_s.top() == '&' || s_s.top() == '|' || s_s.top() == '~' || s_s.top() == '>'){if (s_s.top() == '&'){s_s.pop();bool a2 = s_t.top();s_t.pop();bool a1 = s_t.top();s_t.pop();bool ans = a2 && a1;s_t.push(ans);}else if (s_s.top() == '|'){s_s.pop();bool a2 = s_t.top();s_t.pop();bool a1 = s_t.top();s_t.pop();bool ans = a2 || a1;s_t.push(ans);}else if (s_s.top() == '>'){s_s.pop();bool a2 = s_t.top();s_t.pop();bool a1 = s_t.top();s_t.pop();if (a1 == true && a2 == true){s_t.push(true);}else if (a1 == true && a2 == false){s_t.push(false);}else if (a1 == false){s_t.push(true);}}else if (s_s.top() == '~'){s_s.pop();bool a2 = s_t.top();s_t.pop();bool a1 = s_t.top();s_t.pop();if (a1 == a2){s_t.push(true);}else s_t.push(false);}}else if (s_s.top() == '!'){s_s.pop();bool tmp = !s_t.top();s_t.pop();s_t.push(tmp);}else{s_t.push(flag[s_s.top() - 'a']);s_s.pop();}}for (int i = 0; i < 26; i++){if (vis[i]){cout << char(i + 'a') << "=" << flag[i] << " ";}}if (s_t.top()){ans_v.push_back(seq);cout << "ans=true" << endl;}else{ans_vf.push_back(seq);cout << "ans=false" << endl;}seq++;return;}if (vis[n]){for (int i = 0; i <= 1; i++){flag[n] = i;dfs(n + 1);}}else{dfs(n + 1);}}int main()
{int n;string str;printMenu();cout << "请先输入式子含有的变量个数" << endl;cin >> n;cout << "按格式输入式子" << endl;cin >> str;calculator(n, str);return 0;
}

运行示例:

利用真值表法求取主析取范式以及主合取范式的实现(C++)相关推荐

  1. 离散数学范式c语言实验报告,离散数学实验报告-利用真值表法求主析取范式及主合取范式的实现...

    1.实 验 报 告( / 学年 第 一 学期)课程名称离散数学实验名称利用真值表法求主析取范式及主合取范式的实现实验时间年月日指导单位指导教师学生姓名班级学号学院(系)专 业 实 验 报 告实验名称利 ...

  2. 【离散数学】Java语言实现利用真值表法求主析取范式和主合取范式

    C++版本的看这个链接: [离散数学]C++语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/ ...

  3. 【离散数学】C++语言实现利用真值表法求主析取范式和主合取范式

    Java版本的如下链接所示: Java语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/art ...

  4. 【数理逻辑】范式 ( 合取范式 | 析取范式 | 大项 | 小项 | 极大项 | 极小项 | 主合取范式 | 主析取范式 | 等值演算方法求主析/合取范式 | 真值表法求主析/合取范式 )

    文章目录 一. 相关概念 1. 简单 析取 合取 式 ( 1 ) 简单合取式 ( 2 ) 简单析取式 2. 极小项 ( 1 ) 极小项 简介 ( 2 ) 极小项 说明 ( 3 ) 两个命题变项 的 极 ...

  5. 离散实验 真值表求主析取范式、主合取范式的计算机语言实现

    离散数学 实验一 标题:真值表求主析取范式.主合取范式的计算机语言实现 其他课程的一些其他实验源码也可在本人github主页找到哦 链接如下:https://github.com/Schiz0mani ...

  6. 使用C++求命题公式的主析取范式与主合取范式

    最近的离散数学的一个上机作业,要求任意输入一个命题公式,求它的真值表与主析取范式和主合取范式.其中的命题连接词都是用特殊符号来表示(怕麻烦--),并最终选择使用C++来编写程序. 先贴代码: // 五 ...

  7. 求主析取范式与主合取范式

    定义设A为恰含命题变元p1,-,pn的公式.公式A称为A的主析(合)取范式(majordisjunctive(conjunctive)normal form),如果A是A的析(合)取范式,并且其每个合 ...

  8. 离散数学 求命题公式的主析取范式和主合取范式

    Description 输入命题公式的合式公式,求出公式的真值表,并输出该公式的主合取范式和主析取范式. Input 命题公式的合式公式 Output 公式的主析取范式和主合取范式,输出形式为:&qu ...

  9. 离散数学实践一编程判断主析取范式和主合取范式【java实现】

    文章目录 实验要求 二 编程思路分析 困难所在 二 完整代码 实验要求 实验类型:设计性 实验目的 通过算法设计并编程实现,使学生掌握利用计算机语言判别合式公式主范式的基本方法. 实验内容 给定合式公 ...

最新文章

  1. 三代测序数据分析之文献推荐
  2. [Android Pro] svn实例
  3. C++ 之 string
  4. C#中数据类型的安全转换(is,as)
  5. MD5和SHA加密实现
  6. 使用fastcoll进行md5碰撞,两个不同的文件md5值一样。
  7. 纯CSS实现气泡聊天框的方法
  8. HoloLens开发手记 - Unity之Tracking loss
  9. pdf文档遇到了共享冲突_如何将链接共享为PDF格式的Google文档链接
  10. [转帖]真TM长的:SQL Server 2008存储结构——GAM和SGAM、PFS结构、IAM结构、DCMBCM
  11. docker mysql57_docker安装mysql57
  12. 图本检索的Zero-Shot超过CLIP模型!FILIP用细粒度的后期交互获得更好的预训练效率。...
  13. 当才华还配不上野心,就静下来学习
  14. MSSQL → 04:表的创建与维护
  15. 2011年上半年国内优秀初创企业产品汇总
  16. 网络安全之黑客入侵的步骤
  17. TDM阅读笔记,在推荐系统的应用
  18. java--表格的使用
  19. 使用AutoIt自动登录sohu搜狐网页邮箱的代码
  20. cuda11.2版本的对应安装的pytorch版本

热门文章

  1. EditPlust 批量添加自定义工具
  2. 利用Excel VBA实现批量数据分组转置
  3. Windows之Fiddler抓HTTP和HTTPS请求
  4. 回溯算法之布罗夫卫队(最大团问题)
  5. C++之typename
  6. C++之virtual 方法
  7. Activity之launchMode:singleTop,singleTask与singleInstance
  8. Android之mvp和mvc对比分析以及实际应用
  9. Android之webview与js交互
  10. Qt 第二步 熟悉文件结构组成(二)