离散数学实验一 利用真值表法求取主析取范式以及主合取范式的实现
实验原理
使用的数据结构和存储结构:
- 栈(中缀转后缀并计算)
- 数组(存放真值表)
- map(存放命题变元以及对应的真假值)
#include<iostream>
#include <string>
#include <map>
#include <stack>
#define MAX 100using namespace std;map<char,bool> statements; //存储命题变元
int Prio(char ch);
string Trans(string str);
bool Judge(string str);
void Output(string wff,string suffix);int main()
{string wff,suffix;cout << " 由于命题逻辑的一些符号不在ASCII表中,所以做以下规定:" << endl;cout << " ! :否定" << endl;cout << " * :合取" << endl;cout << " + :析取" << endl;cout << " > :单条件" << endl;cout << " - :双条件" << endl;cout << "请输入合式公式:";cin >> wff;suffix = Trans(wff);Output(wff,suffix);return 0;
}int Prio(char ch) //定义联结词优先级
{if (ch == '!')return 4;if (ch == '*')return 3;if (ch == '+')return 2;if (ch == '>')return 1;if (ch == '-') return 0;if (ch == '(')return -1;return 0;
}string Trans(string str)
{string suffix;stack<char> stk;for (int i = 0; i < str.length(); i++){if (isalpha(str[i]))statements[str[i]]=0;}for (int i = 0; i < str.length(); i++){if (statements.count(str[i])) //操作数直接写入后缀表达式suffix+=str[i];else{if (stk.empty())stk.push(str[i]);else if (str[i] == '(') //'('直接入栈 stk.push(str[i]);else if (str[i] == ')') //当遇到')'时弹出栈中元素加入后缀表达式直到'('弹出为止{while (stk.top() != '('){suffix += stk.top();stk.pop();}stk.pop(); //'('不需要加入后缀表达式}else{while (!stk.empty() && Prio(str[i]) <= Prio(stk.top())) //当所遇到的操作符的优先级小于或等于栈顶元素的优先级时{suffix += stk.top(); //取出栈顶元素放入后缀表式,并弹出该栈顶元素stk.pop();}stk.push(str[i]);}}}while (!stk.empty()) //最后,如果栈不空,则弹出所有元素并放入后缀表式{suffix += stk.top();stk.pop();}return suffix;
}bool Judge(string str)
{stack<bool> stk; //用来计算真假值bool a, b;for (int i = 0; i < str.length(); i++){if (statements.count(str[i])) //命题直接入栈stk.push(statements[str[i]]);else{switch (str[i]){case '!':a = stk.top();stk.pop();stk.push(!a);break;case'*':a = stk.top();stk.pop();b = stk.top();stk.pop();stk.push(a * b);break;case'+':a = stk.top();stk.pop();b = stk.top();stk.pop();stk.push(a + b);break;case'>':a = stk.top();stk.pop();b = stk.top();stk.pop();stk.push(a + !b);break;case'-':a = stk.top();stk.pop();b = stk.top();stk.pop();stk.push((!a + b) * (a + !b));break;}}}return stk.top();
}void Output(string wff,string suffix)
{string pdnf, pcnf,state;int n = statements.size();int truthTable[MAX][MAX];for ( auto iter = statements.begin(); iter !=statements.end(); iter++){state += iter->first; cout << iter->first << '\t';}cout << wff << endl;for (int i = 0; i < pow(2,n); i++){int tmp = i;int j = n - 1;for (auto it = statements.rbegin(); it !=statements.rend(); it++) //10->2进制对其进行赋值(倒叙){truthTable[i][j] = it->second = tmp % 2;tmp /= 2;j--;}truthTable[i][n] = Judge(suffix);}for (int i = 0; i < pow(2, n); i++) //拼接主析取和主合取范式{if (truthTable[i][n])pdnf += '(';elsepcnf += '(';for (int j = 0; j < n; j++){cout << truthTable[i][j]<<'\t'; //输出真值表if (truthTable[i][n]){if (truthTable[i][j] == 0) pdnf += '!';pdnf += state[j];if (j < n - 1)pdnf += '*';}else{if(truthTable[i][j] == 1)pcnf += '!';pcnf += state[j];if (j < n - 1)pcnf += '+';}}cout << truthTable[i][n] << endl;if (truthTable[i][n])pdnf += ")+";elsepcnf += ")*";}pdnf.erase(pdnf.size() - 1); //删除多余的联结词pcnf.erase(pcnf.size() - 1);cout << "主析取范式为:" << pdnf << endl;cout << "主合取范式为:" << pcnf << endl;
}
离散数学实验一 利用真值表法求取主析取范式以及主合取范式的实现相关推荐
- 离散数学范式c语言实验报告,离散数学实验报告-利用真值表法求主析取范式及主合取范式的实现...
1.实 验 报 告( / 学年 第 一 学期)课程名称离散数学实验名称利用真值表法求主析取范式及主合取范式的实现实验时间年月日指导单位指导教师学生姓名班级学号学院(系)专 业 实 验 报 告实验名称利 ...
- 利用真值表法求取主析取范式以及主合取范式的实现(C++)
代码如下: #include <iostream> #include <stack> #include <string> #include <vector&g ...
- 【离散数学】Java语言实现利用真值表法求主析取范式和主合取范式
C++版本的看这个链接: [离散数学]C++语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/ ...
- 【离散数学】C++语言实现利用真值表法求主析取范式和主合取范式
Java版本的如下链接所示: Java语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/art ...
- 离散数学实验报告三——真值表与主范式
离散数学实验报告三--真值表与主范式 一.预习内容: 1.真值表:把变量的各种可能取值与想对应的函数值,用表格的形式一一列举出来,这种表格就叫做真值表 2.命题公式的析(合)取范式 ⑴文字:命题变元及 ...
- 离散实验 真值表求主析取范式、主合取范式的计算机语言实现
离散数学 实验一 标题:真值表求主析取范式.主合取范式的计算机语言实现 其他课程的一些其他实验源码也可在本人github主页找到哦 链接如下:https://github.com/Schiz0mani ...
- 【数理逻辑】范式 ( 合取范式 | 析取范式 | 大项 | 小项 | 极大项 | 极小项 | 主合取范式 | 主析取范式 | 等值演算方法求主析/合取范式 | 真值表法求主析/合取范式 )
文章目录 一. 相关概念 1. 简单 析取 合取 式 ( 1 ) 简单合取式 ( 2 ) 简单析取式 2. 极小项 ( 1 ) 极小项 简介 ( 2 ) 极小项 说明 ( 3 ) 两个命题变项 的 极 ...
- 离散数学 求命题公式的主析取范式和主合取范式
Description 输入命题公式的合式公式,求出公式的真值表,并输出该公式的主合取范式和主析取范式. Input 命题公式的合式公式 Output 公式的主析取范式和主合取范式,输出形式为:&qu ...
- 使用C++求命题公式的主析取范式与主合取范式
最近的离散数学的一个上机作业,要求任意输入一个命题公式,求它的真值表与主析取范式和主合取范式.其中的命题连接词都是用特殊符号来表示(怕麻烦--),并最终选择使用C++来编写程序. 先贴代码: // 五 ...
- 离散数学实践一编程判断主析取范式和主合取范式【java实现】
文章目录 实验要求 二 编程思路分析 困难所在 二 完整代码 实验要求 实验类型:设计性 实验目的 通过算法设计并编程实现,使学生掌握利用计算机语言判别合式公式主范式的基本方法. 实验内容 给定合式公 ...
最新文章
- 自学python需要多长时间-零基础自学python要多久?
- junit动态忽略测试_有条件忽略测试的JUnit规则
- Windows 10 Creators Update隐私策略变动一览
- 【Science】颠覆三观的超强聚类算法
- Unix环境高级编程(十九)终端I/O
- Linux信号量操作
- php laravel mvc模式,laravel框架之MVC设计
- 阿里云短信服务java发送短信验证码
- 金融理论与实务公式汇总
- centos查询 硬盘序列号查询_CentOS查看主板型号、CPU、显卡、硬盘等信息
- maya2020 redshift3.0.31demo版安装方法。
- 74LSxx versus. 74HCxx
- 机器视觉实验三 工件尺寸和面积测量
- 蜂窝物联网通信技术的演进,有人竟然用“谈恋爱”的过程给讲明白了
- 海阔凭鱼跃 天高任鸟飞-大上海,人人都向往的城市
- html页面其中有添加员工的,编写一个添加员工信息的HTML页面,当用户点击添加按钮,请求AddEmpServlet,实现将用户提交的员工基本信息返回给客户端显示出来。...
- Memory loss【记忆缺失】
- Gym 101142G Gangsters in Central City【思维+Lca】
- 淘宝新店如何推广效果比较好?有哪些渠道?
- C++ Primer Plus第四章课后编程