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

  1. php版的求表达式的真值表-TrueValueTable

    贴上代码: <?php error_reporting(E_ALL & ~E_NOTICE); $expression=$_GET['TrueTable']; //读取输入框数据 if( ...

  2. 离散数学——python实现真值表和打印主范式

    最近用python实现了真值表,经过有点儿曲折,刚开始没考虑优先级,直到前天才发现这个问题(离散数学没学好啊),用栈改了一下.话说python就是强,把列表类型当栈用,直接调用列表的pop()和app ...

  3. 关于74HC4051的逻辑真值表及延时的重要性/在AD测量中的校准

    一 关于74HC4051: 在/E=0使能输出的条件下,S2S1S0的三个值,能选通Y0~Y7其中的一个通道从Z输出. 二:问题提出:在按照IC给出的真值表进行芯片操作时,输出逻辑完全对不上 三:分析 ...

  4. 构造命题公式的真值表--biaobiao88

    对给出的任意一个命题公式(不超过四个命题变元),使学生会用C语言的程序编程表示出来,并且能够计算它在各组真值指派下所应有的真值,画出其真值表. #include<iostream> usi ...

  5. C++实现求离散数学命题公式的真值表

    一.实验内容 (1)求任意一个命题公式的真值表. (2)利用真值表求任意一个命题公式的主范式. (3)利用真值表进行逻辑推理. 注:(2)和(3)可在(1)的基础上完成. 二.实验目的 真值表是命题逻 ...

  6. C#生成真值表

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. python真值表

    author:headsen chen  date :2018-06-01  10:53:39 notice:not allowed to copy or you will count law que ...

  8. empty(), is_null(), isset()真值表(区别)

  9. CRC、反码求和校验 原理分析

    3月份开始从客户端转后台,算是幸运的进入全栈工程师的修炼阶段.这段时间一边是老项目的客户端加服务器两边的维护和交接,一边是新项目加加加班赶工,期间最长经历了连续工作三天只睡了四五个小时的煎熬,人生也算 ...

  10. [LeetCode] Single Number 单独的数字

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...

随机推荐

  1. MixCSE:困难样本在句子表示中的使用

    Unsupervised Sentence Representation via Contrastive Learning with Mixing Negatives 论文地址:https://www ...

  2. AI听曲识歌!哼曲、口哨吹,都能秒识! ⛵

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 自然语言处理实战系列:https://www.showmeai.tech ...

  3. ipad好伴侣

    https://museapp.com/ Muse是用于研究笔记,阅读,草图,屏幕截图和书签的空间画布.

  4. winform, 实现窗口程序像QQ一样靠近桌面边缘自动隐藏窗口

    实现原理: 步骤如下: 1.判断窗体程序是否靠近桌面边缘: 2.获取桌面屏幕大小与窗体程序大小: 3.把窗体程序显示在桌面以外隐藏起来,预留部分窗体方便用户拉出程序: 4.判断鼠标是否在窗体程序上,在 ...

  5. 谣言检测——(GCAN)《GCAN: Graph-aware Co-Attention Networks for Explainable Fake News Detection on Social Media》

    论文信息 论文标题:GCAN: Graph-aware Co-Attention Networks for Explainable Fake News Detection on Social Medi ...

  6. keycloak~资源的远程授权

    17.1远程资源授权准备 17.1.1认证和访问流程图 参考:http://www.zyiz.net/tech/detail-141309.html 17.1.2为用户指定角色 可以使用ROLE_US ...

  7. portainer 1.24.2 升级到 portainer-ce 最新版

    官方升级步骤文档: https://docs.portainer.io/v/ce-2.9/start/upgrade/docker 若是现在的版本是 portainer-ce 2.0.0 ,看Opti ...

  8. Elasticsearch部署清单---前期准备工作

    1.了解ES集群拓扑结构 当我们启动Elasticsearch的实例,就会启动至少一个节点.相同集群名的多个节点的连接组成一个集群, 在默认情况下,集群中的每个节点都可以处理Http请求和集群节点的数 ...

  9. 配置 jenkins 权限管理

    安装插件 更改认证方式 创建用户 创建角色并授权 给用户指定角色 新用户登录

  10. Deployment故障排除图解

    PDF文件下载地址:https://files.cnblogs.com/files/sanduzxcvbnm/troubleshooting-kubernetes.pdf