C++实现真值表
2022/9/9 1:23:08
本文主要是介绍C++实现真值表,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
这一片文章主要是关于真值表,在完成之前我也遇到了许多问题。比如怎么去求解表达式的值,怎么去将每个变量进行赋值,也就是如何 将n个字符进行01全排列。
01全排列真的神奇,01全排列其实就是2^n。他可以表示全部的01,真是神奇。
怎么去判断表达式的值呢?我们可以分步骤:
1.先去括号 即 ()/(a);
2.去非 !;
3.去&和|,经证明,他们两个的先后顺序不影响表达式的值;
4.去蕴含 -> 根据其含义进行判断就行;
5.最后就是去等价了 <-> ,同上。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 string s, tmp; //表达式 6 int cnt; //变量个数 7 char st[26];//统计字母,全部小写字母表示 8 int f[26];//统计每个变量的赋值情况 9 int f_t, f_f;//判断表达式的类别 10 void input(); //界面提示 11 void Vs(string s, char *c);//变量统计 12 void output();//输出变量符合和表达式 13 string vSubstitution();//变量替换 14 string rBrackets(); //去括号 包括()/(p) 15 string gToAfrica();//去非 16 string tJoin();//去析取 17 string tDisjunct();//去合取 18 string tContain();//去蕴含 19 string dEquivalent();//去等价 20 int main() { 21 input(); 22 cin >> s; 23 puts(""); 24 puts(""); 25 cout << s << ' '; 26 puts("的真值表如下:"); 27 puts(""); 28 tmp = s; 29 Vs(s, st); 30 output(); 31 int n;//不同赋值的方法数 32 n = pow(2, cnt); 33 cout << '|'; 34 for (int i = 0; i < cnt; i++) cout << "---"; 35 for (int i = 1; i <= tmp.length(); i ++) cout << '-'; 36 cout << '|'; 37 puts(""); 38 for (int i = 0; i < n; i ++) { 39 cout << '|'; 40 for (int j = 0; j < cnt; j ++) { //赋值过程 41 f[st[j] - 'a'] = (1 & (i >> (cnt - 1 - j))); 42 } 43 for (int j = 0; j < cnt; ++j) { 44 cout << f[st[j] - 'a'] << " |"; 45 } 46 for (int i = 0; i < tmp.length() / 2; i ++) cout << ' '; 47 s = vSubstitution(); 48 49 while (s.length() > 1) { //循环判断 50 s = rBrackets(); 51 s = gToAfrica(); 52 s = tJoin(); 53 s = tDisjunct(); 54 s = tContain(); 55 s = dEquivalent(); 56 } 57 cout << s; 58 if (!(tmp.length() % 2)) { 59 for (int i = 1; i < tmp.length() / 2; i ++) cout << ' '; 60 cout << '|'; 61 } else if (tmp.length() == 1) cout << "|"; 62 else { 63 for (int i = 1; i < tmp.length() / 2; i ++) cout << ' '; 64 cout << " |"; 65 } 66 puts(""); 67 if (s == "0") f_f++; 68 else f_t++; 69 s = tmp; 70 } 71 72 cout << '|'; 73 for (int i = 0; i < cnt; i++) cout << "---"; 74 for (int i = 1; i <= tmp.length(); i ++) cout << '-'; 75 cout << '|'; 76 puts(""); 77 cout << tmp << " 的类型是:"; 78 if (f_f == n) puts("矛盾式"); 79 else if (f_t == n) puts("重言式"); 80 else puts("可满足式"); 81 82 83 return 0; 84 } 85 86 void input() { 87 puts("表达式规则如下:"); 88 puts("否定连接词:!"); 89 puts("合取连接词:|"); 90 puts("析取连接词:&"); 91 puts("蕴含连接词:->"); 92 puts("等价连接词:<->"); 93 puts("请按规范输入表达式,字符间请不要有空格!否则将会程序无法正常运行。"); 94 puts("----------------------------------------------------------------------------------------------------------------------"); 95 puts("请输入你的表达式:") ; 96 } 97 98 void Vs(string s, char *c) { 99 int ch[26] = {}; 100 for (int i = 0; i < s.length(); i ++) { 101 if (isalpha(s[i])) ch[s[i] - 'a']++; //isalpha判断字符是否为小写字母 102 } 103 for (int i = 0; i < 26; i ++) { 104 if (ch[i]) st[cnt++] = i + 97; 105 } 106 } 107 108 void output() { 109 cout << '|'; 110 for (int i = 0; i < cnt; i++) cout << "---"; 111 for (int i = 1; i <= tmp.length(); i ++) cout << '-'; 112 cout << '|'; 113 puts(""); 114 cout << '|'; 115 for (int i = 0; i < cnt; i ++) { 116 cout << st[i] << " |"; 117 } 118 cout << s << '|' << endl; 119 } 120 121 string vSubstitution() { 122 string ss = ""; 123 for (int i = 0; i < s.length(); i ++) { 124 if (s[i] <= 'z' && s[i] >= 'a') { 125 ss += f[s[i] - 'a'] ? "1" : "0"; 126 } else ss += s[i]; 127 } 128 return ss; 129 } 130 131 string rBrackets() { 132 string ss = ""; 133 for (int i = 0; i < s.length(); i ++) { 134 if (s[i] == '(' && (i + 2) < s.length() && s[i + 2] == ')') ss += s[i + 1], i += 2; 135 else ss += s[i]; 136 } 137 return ss; 138 } 139 140 string gToAfrica() { 141 string ss = ""; 142 for (int i = 0; i < s.length(); i ++) { 143 if (s[i] == '!' && (i + 1) < s.length() && s[i + 1] == '0') ss += '1', i ++; 144 else if (s[i] == '!' && (i + 1) < s.length() && s[i + 1] == '1') ss += '0', i ++; 145 else ss += s[i]; 146 } 147 return ss; 148 } 149 150 string tJoin() { 151 string ss = ""; 152 for (int i = 0; i < s.length(); i ++) { 153 if ((s[i] == '0' && (i + 2) < s.length() && s[i + 2] == '1' && s[i + 1] == '|') || (s[i] == '1' && (i + 2) < s.length() && s[i + 2] == '0' && s[i + 1] == '|') || (s[i] == '1' && (i + 2) < s.length() && s[i + 2] == '1' && s[i + 1] == '|')) ss += '1', i += 2; 154 else if ((s[i] == '0' && (i + 2) < s.length() && s[i + 2] == '0' && s[i + 1] == '|')) ss += '0', i += 2; 155 else ss += s[i]; 156 } 157 return ss; 158 } 159 160 string tDisjunct() { 161 string ss = ""; 162 for (int i = 0; i < s.length(); i ++) { 163 if ((s[i] == '0' && (i + 2) < s.length() && s[i + 2] == '1' && s[i + 1] == '&') || (s[i] == '0' && (i + 2) < s.length() && s[i + 2] == '0' && s[i + 1] == '&') || (s[i] == '1' && (i + 2) < s.length() && s[i + 2] == '0' && s[i + 1] == '&')) ss += '0', i += 2; 164 else if ((s[i] == '1' && (i + 2) < s.length() && s[i + 2] == '1' && s[i + 1] == '&')) ss += '1', i += 2; 165 else ss += s[i]; 166 } 167 return ss; 168 } 169 170 string tContain() { 171 string ss = ""; 172 for (int i = 0; i < s.length(); i ++) { 173 if (s[i] == '1' && (i + 3) < s.length() && s[i + 3] == '0' && s[i + 1] == '-' && s[i + 2] == '>') ss += '0', i += 3; 174 else if ((s[i] == '1' && (i + 3) < s.length() && s[i + 3] == '1' && s[i + 1] == '-' && s[i + 2] == '>') || (s[i] == '0') && (i + 3) < s.length() && s[i + 1] == '-' && s[i + 2] == '>' && (s[i + 3] == '0' || s[i + 3] == '1') ) ss += '1', i += 3; 175 else ss += s[i]; 176 } 177 return ss; 178 } 179 180 string dEquivalent() { 181 string ss = ""; 182 for (int i = 0; i < s.length(); i ++) { 183 if ((s[i] == '0' && (i + 4) < s.length() && s[i + 4] == '0' && s[i + 1] == '<' && s[i + 2] == '-' && s[i + 3] == '>') || (s[i] == '1' && (i + 4) < s.length() && s[i + 4] == '1' && s[i + 1] == '<' && s[i + 2] == '-' && s[i + 3] == '>') ) ss += '1', i += 4; 184 else if ((s[i] == '1' && (i + 4) < s.length() && s[i + 4] == '0' && s[i + 1] == '<' && s[i + 2] == '-' && s[i + 3] == '>') || (s[i] == '0' && (i + 4) < s.length() && s[i + 4] == '1' && s[i + 1] == '<' && s[i + 2] == '-' && s[i + 3] == '>') ) ss += '0', i += 4; 185 else ss += s[i]; 186 } 187 return ss; 188 }
这篇关于C++实现真值表的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享