-------YYC
#include #include #include #include using namespace std; /* *说明: * 用!表示 否定 * 用& 表示 合取 * 用| 表示 析取 * 用- 表示 条件 * 用~ 表示 双条件 */ list> inlist_value_map ;//用于记录所有最初变量的真值组合 list> hqlist_value_map;//用于记录所有符合主合取范式条件的真值组合 list> xqlist_value_map;//用于记录所有符合主析取范式条件的真值组合 int value=0; //string expr; //真值转换函数 void change_val(int & s) { if(0==s) s=1; else s=0; } //处理基本连接词的函数 int deal_cal(int par1,char par2,int par3) { // cout<& value_map) { int a; int par_value;//该部分表达式的值 string::size_type l=str.length(); string::const_iterator it = str.begin(); for(;it!=str.end();it++) { if(*it=='!') { //利用string类型的迭代器实现对String对象的字符的遍历访问。erase string::const_iterator init_it = it+1;//保存!符后的下一个位置 change_val(value_map[*(init_it)]);//转换真值 str.erase(it);//删除否定符号 } } it = str.begin(); par_value=value_map[*it]; if(l==1)//如果该部分只有一个命题则返回该命题的真值 { return par_value; } else { for(;it !=str.end()-1;) { // cout<& value_map) { //扫描括号 int sum_kh=0;//括号数 string::const_iterator iter; string::const_iterator addr_kh[50];//用于记录括号的位置 char kind_kh[50];//用于记录括号的类型 for(iter = Expr.begin();iter!=Expr.end();iter++) { if(*iter=='('||*iter==')') { addr_kh[sum_kh]=iter; kind_kh[sum_kh]=*iter; sum_kh++; } } if(0==sum_kh)//如果没有括号 { value=run_unkh_expr(Expr,value_map); return value; } else { int i=0; for(;i<=sum_kh;i++) { if(kind_kh[i]==')')//找到最内级的括号并跳出循环 break; } //取出最内层没有括号的字符串 string in_str = string(addr_kh[i-1]+1,addr_kh[i]); //算出最内层表达式的值 value = run_unkh_expr(in_str,value_map); static char var = '1'; value_map[var]=value;//将括号整体设为一个字符‘1’ string::const_iterator ite = addr_kh[i-1];//"字符(的位置" //判断(是不是表达式的开头 string::const_iterator init_i; bool is_begin=false; if(ite==Expr.begin()) {is_begin = true; } else { init_i = addr_kh[i-1]-1; } { Expr.erase(ite,addr_kh[i]+1);//删除掉最内层表达式包括括号在内 } //再在删除的地方插入新的字符‘1’ if(is_begin==true) { Expr = var+Expr; } else {Expr.insert(init_i+1,var); } var = var +1; value = run_expr(Expr,value_map); return value; } } //求主析取范式和主合取范式的函数 //为value_map取到所有不同真值组合的函数 //回溯法 map::iterator it; map in_value_map; void init_value_map(map& value_map) { map::size_type lern = value_map.size();//用于记录变量的个数 if(it == in_value_map.begin()) { cout<::const_iterator bb= value_map.begin();bb!=value_map.end();bb++) { in_value_map[bb->first]=bb->second; } it = in_value_map.begin();//重新对it赋值 } if(it == in_value_map.end())//如果已经赋值完毕则想队列中加载组合 { inlist_value_map.push_back(in_value_map);//向队列中加载组合 --it;//如果到底了则只往回走一步,释放最后一步的资源 return ;//跳出函数 } for(int i=0;i<2;i++) { it->second = i; ++it; init_value_map(value_map); } --it;//每一个子树结束则往回退一步 } int main() { string expr; map initial_value_map; cout<>expr; string::const_iterator iter = expr.begin(); for(;iter!=expr.end();iter++) { if(*iter!='!'&&*iter!='&'&&*iter!='~'&&*iter!='-'&&*iter!='|'&&*iter!='('&&*iter!=')') { initial_value_map[*iter]=1;//为每一个原子命题默认为真 } } //输出测试组合赋值函数 it = in_value_map.begin(); init_value_map(initial_value_map); cout<>::iterator ii=inlist_value_map.begin();ii!=inlist_value_map.end();ii++) { map::iterator ai = (*ii).begin(); if(ai==(*ii).end()) { cout<::iterator yy = (*ii).begin();yy !=(*ii).end();yy++) { cout<first<second<>::iterator xqchei; xqchei = xqlist_value_map.begin(); if(xqchei ==xqlist_value_map.end()) { cout<>::iterator iit = xqlist_value_map.begin();iit != xqlist_value_map.end();iit++) { cout<::iterator i = (*iit).begin();i !=(*iit).end();i++) { if(i->first>='0'&&i->first<='9')//不输出表达式中的临时数字字符 { ; } else { if(0==i->second) { cout<first; map::iterator iii=i; ++iii; if((iii)==(*iit).end())//如果是最后一位元素则不用再输出合取符 { ; } else { cout<>::iterator aaa = iit; ++aaa; if(aaa == xqlist_value_map.end())//如果是最后一组组合则不用再输出吸取符 { ; } else { cout<>::iterator hqchei; hqchei = hqlist_value_map.begin(); if(hqchei ==hqlist_value_map.end()) { cout<>::iterator iit = hqlist_value_map.begin();iit != hqlist_value_map.end();iit++) { cout<::iterator i = (*iit).begin();i !=(*iit).end();i++) { if(i->first>='0'&&i->first<='9')//不输出表达式中的临时数字字符 { ; } else { if(1==i->second) { cout<first; map::iterator iii=i; ++iii; if((iii)==(*iit).end())//如果是最后一位元素则不用再输出合取符 { ; } else { cout<>::iterator aaa = iit; ++aaa; if(aaa == hqlist_value_map.end())//如果是最后一组组合则不用再输出吸取符 { ; } else { cout<