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

    背景 书接上文,我们很好的理解了xmin和xid的区别.我们继续上文<KingbaseESV8R6不同隔离级下xmin的区别>来讨论 snapshot too old 的功能. 当king ...

  2. 数仓Hive和分布式计算引擎Spark多整合方式实战和调优方向

    @ 目录 概述 Spark on Hive Hive on Spark 概述 编译Spark源码 配置 调优思路 编程方向 分组聚合优化 join优化 数据倾斜 任务并行度 小文件合并 CBO 谓词下 ...

  3. 学会Linux,看完这篇就行了!

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/797ab07d.html 你好,我是测试蔡坨坨. 对于测试同学来说,Linux基本属于必学必会内容,招聘要求中基本都会出现L ...

  4. 第五章:Admin管理后台 - 1:自定制Admin

    如果只是在admin中简单的展示及管理模型,那么在admin.py模块中使用admin.site.register将模型注册一下就好了: from django.contrib import admi ...

  5. k8s控制器理解

    DaemonSet 一个DaemonSet对象能确保其创建的Pod在集群中的每一台(或指定)Node上都运行一个副本.如果集群中动态加入了新的Node,DaemonSet中的Pod也会被添加在新加入N ...

  6. 学习ASP.NET Core Blazor编程系列五——列表页面

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  7. 前端程序员学习 Golang gin 框架实战笔记之一开始玩 gin

    原文链接 我是一名五六年经验的前端程序员,现在准备学习一下 Golang 的后端框架 gin. 以下是我的学习实战经验,记录下来,供大家参考. https://github.com/gin-gonic ...

  8. C++面向对象编程之堆、栈和内存形式

    1.stack 是存在与某个作用域的一块内存空间,当调用函数时,函数就会形成一个stack 存这它的一些参数.返回地址等,生闷气在函数执行完会自动消灭: 2.heap 是操作系统提供的全局的内存空间, ...

  9. BZOJ2654 tree (wqs二分)

    题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解.   一个最小生成树问题,但是我们要选need条白边,我们用g(i)表示选取i条 ...

  10. 分布式存储系统之Ceph集群CephFS基础使用

    前文我们了解了ceph之上的RBD接口使用相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16753098.html:今天我们来聊一聊ceph之上的另一 ...