这一片文章主要是关于真值表,在完成之前我也遇到了许多问题。比如怎么去求解表达式的值,怎么去将每个变量进行赋值,也就是如何 将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 }

最新文章

  1. Struts2 源码分析——项目分析
  2. Unity3d 扩展自定义类Inspector
  3. Docker CPU 资源限制——CPU固定核功能测试
  4. C# Index 定义索---引具体使用2
  5. yii2 model常用验证规则
  6. Linux远程访问windows时,出现&quot;连接被对端重置&quot;错误
  7. BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )
  8. 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)
  9. 十九. 想快速开发app,需要找外包吗?
  10. Cocos Creator—如何给资源打MD5版本号
  11. Laravel 的十八个最佳实践
  12. 【MySQL】MySQL中查询出数据表中存在重复的值list
  13. ubuntu-docker入门到放弃(八)创建支持SSH服务的镜像
  14. Web常见安全漏洞-SQL注入
  15. JS中innerHTML、outerHTML、innerText 、outerText、value的区别与联系?jQuery中的text()、html()和val()
  16. jquery插件--在input下输入密码时提示大写锁定键
  17. 【转】c#的逆向工程-IL指令集
  18. POJ1950----DFS
  19. kafka介绍与搭建(单机版)
  20. nodejs json-t 基本测试

热门文章

  1. 安装配置华为Fusion acces(Lite AD)并使Windows登录
  2. KingbaseES R6 集群修改ssh端口执行sys_backup.sh备份案例
  3. spring native 初体验实现 小米控制美的空调
  4. 华南理工大学 Python第1章课后小测
  5. selenium爬取图片
  6. Python数据科学手册-Pandas:层级索引
  7. 查看当前看k8s集群支持的版本命令
  8. gitlab添加新用户
  9. 2_jQuery
  10. 《Deep Feature Extraction and Classification of Hyperspectral Images Based on Convolutional Neural Networks》论文笔记