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++实现真值表的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程