编程实现用真值表法求取任意数量变量的合式公式的主析取范式和主合取范式。 要求: 能够列出任意合式公式的真值表并给出相应主析取和主合取范式。 内容: 编程实现用真值表法求取任意数量变量的合式公式的主析取...
一、实验目的和要求
内容:
编程实现用真值表法求取任意数量变量的合式公式的主析取范式和主合取范式。
要求:
能够列出任意合式公式的真值表并给出相应主析取和主合取范式。
内容:
编程实现用真值表法求取任意数量变量的合式公式的主析取范式和主合取范式。
原理:
先将中缀表达式转换成后缀表达式,再将后缀表达式中每一个字母变量一一赋值,用递归枚举的方法枚举所有赋值情况,并且用map映射将每一个字母变量与当前被枚举的值一一映射,对每一种赋值情况调用后缀表达式计算函数计算后缀表达式的值,打印真假情况。如果是真,记录到名为zhen的vector不定长数组中,如果是假,记录到名为jia的vector不定长数组中。最后根据zhen和jia的不定长数组来打印主析取范式和主合取范式。
此程序可以实现任意数量的字母变量的主析取范式求取和主合取范式求取,以及真值表打印。
//或运算 | , 与运算 & ,单条件 -> ,双条件,非运算 ! #include#include#include#include#include#include#include#include#includeusing namespace std; string zhong; //中缀表达式 char hou[1000]; //后缀表达式 string alpha; //存放所有字母变量 mapM; //映射,将字母变量与0或1一一对应 struct note {	int a[100]; }; vectorzhen; //不定长数组,存放主析取范式对应字母变量的01情况,也就是表达式真值为T vectorjia; //不定长数组,存放主合取范式对应字母变量的01情况,也就是表达式真值是F void ddd() //预处理,去除中缀表达式中条件->中的>,和双条件中的= and > ,将这两个运算符当成一个字符处理,更方便 {	string::iterator i=zhong.begin();	int flag=1;	while(flag) { flag=0; for(i=zhong.begin();i!=zhong.end();++i) { if(*i=='>') { zhong.erase(i); flag=1; break; } if(*i=='=') { zhong.erase(i); flag=1; break; } }	} } int icp(char a) {	if(a=='#') return 0;	if(a=='(') return 12;	if(a=='!') return 10;	if(a=='&') return 8;	if(a=='|') return 6;	if(a=='-') return 4;	if(a=='