C++实现离散数学之真值表(试着自写头文件)
思路参考:https://blog.csdn.net/wjh2622075127/article/details/79843339 感谢作者。
试着写了一下头文件,并修改优化了。
头文件:
#ifndef TRUTH_TABLE_H
#define TRUTH_TABLE_H
#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>
#include<algorithm>
using namespace std;
class TruthTable
{friend void read(istream& is, TruthTable& formula); //读取输入friend void print(TruthTable& formula); //计算并输出
public:void GetVariable(string str, string& var, int& count); //获取命题变元void fei(string& str); //非void hequ(string& str); //合取void xiqu(string& str); //析取void tiaojian(string& str); //条件void shuangtiaojian(string& str); //双条件void ToValue(string& str, int val[]); //赋真值给 变元void DelKuohao(string& str); //去除无用的括号(括号内只有一个变元的情况)
private:string str, tmp, var;int count = 0;int val[30]{};
};
void TruthTable::GetVariable(string str, string& var, int& count)
{int ch[30]{};for (auto i = 0; i != str.size(); ++i)if (isalpha(str[i]))++ch[str[i] - 'A'];for (auto i = 0; i < 26; ++i)if (ch[i]){var.push_back(i + 65);++count;}
}
void TruthTable::fei(string& str)
{for (auto i = 0;i!=str.size();++i){if (i + 1 < str.size() && str[i] == '!' && str[i + 1] == '0')str.replace(i, 2 , "1");else if ( i + 1 < str.size() && str[i] == '!' && str[i + 1] == '1')str.replace(i, 2, "0");}
}
void TruthTable::hequ(string& str)
{for (auto i = 0;i!=str.size();++i){if (str[i] == '1' && i + 2 < str.size() && str[i + 2] == '1' && str[i + 1] == '&')str.replace(i, 3 , "1");else if (i + 2 < str.size() && str[i + 1] == '&' && ((str[i] == '1' && str[i + 2] == '0')|| (str[i] == '0' && str[i + 2] == '1') || (str[i] == '0' && str[i + 2] == '0')))str.replace(i, 3, "0");}
}
void TruthTable::xiqu(string& str)
{for (auto i = 0; i != str.size(); ++i){if (str[i] == '0' && i + 2 < str.size() && str[i + 2] == '0' && str[i + 1] == '|')str.replace(i, 3, "0");else if (i + 2 < str.size() && str[i + 1] == '|' && ((str[i] == '1' && str[i + 2] == '0')|| (str[i] == '0' && str[i + 2] == '1') || (str[i] == '1' && str[i + 2] == '1')))str.replace(i, 3, "1");}
}
void TruthTable::tiaojian(string& str)
{for (auto i = 0; i != str.size(); ++i){if (str[i + 1] == '>' && str[i] == '1' && str[i + 2] == '0')str.replace(i, 3, "0");else if (str[i + 1] == '>' && ((str[i] == '1' && str[i + 2] == '1')|| str[i] == '0' && (str[i + 2] == '1' || str[i + 2] == '0')))str.replace(i, 3, "1");}
}
void TruthTable::shuangtiaojian(string& str)
{for (auto i = 0; i != str.size(); ++i){if (str[i + 1] == '-' && ((str[i] == '1' && str[i + 2] == '1') || (str[i] == '0' && str[i + 2] == '0')))str.replace(i, 3, "1");else if (str[i + 1] == '-' && ((str[i] == '1' && str[i + 2] == '0') || (str[i] == '0' && str[i + 2] == '1')))str.replace(i, 3, "0");}
}
void TruthTable::ToValue(string& str, int val[])
{for (auto i = 0; i != str.size(); ++i){if (isalpha(str[i]))str.replace(i, 1, val[str[i] - 'A'] ? "1" : "0");}
}
void TruthTable::DelKuohao(string& str)
{for (auto i = 0; i != str.size(); ++i){if (str[i] == '(' && i + 2 < str.size() && str[i + 2] == ')'){string s;s += str[i + 1];str.replace(i, 3, s);}}
}
void read(istream& is, TruthTable& formula)
{is >> formula.str;transform(formula.str.begin(), formula.str.end(), formula.str.begin(), ::toupper);formula.tmp = formula.str;formula.GetVariable(formula.str, formula.var, formula.count);
}void print(TruthTable& formula)
{for (auto i : formula.var) //输出真值表格式第一行cout << i << " ";cout << formula.str << endl;for (int i = 0; i != pow(2, formula.count); ++i) //二进制枚举法{for (int j = 0; j != formula.count; ++j)formula.val[formula.var[j] - 'A'] = (1 & (i >> (formula.count - 1 - j))); //位运算赋值for (int j = 0; j != formula.count; ++j)cout << formula.val[formula.var[j] - 'A'] << " ";formula.ToValue(formula.str, formula.val);while (formula.str.size() != 1){formula.DelKuohao(formula.str);formula.fei(formula.str);formula.hequ(formula.str);formula.xiqu(formula.str);formula.tiaojian(formula.str);formula.shuangtiaojian(formula.str);}cout << setw(formula.tmp.size() / 2 + 1) << formula.str << endl;formula.str = formula.tmp;}
}
#endif // !TRUTH_TABLE
C++文件:
//定义: !为非 &为合取 |为析取 >为条件 -为双条件
#include"TrueTable.h"
int main()
{TruthTable formula;cout << "请输入命题公式(命题变元是大写字母)" << endl;cout << "注:定义:!为非 &为合取 |为析取 >为条件 -为双条件" << endl;read(cin, formula);print(formula);system("pause");
}
C++实现离散数学之真值表(试着自写头文件)相关推荐
- 机试记不住头文件_计算机考研机试攻略
目录 写在前面的话 2 关于N诺 4 如何使用本书? 5 第一章 从零开始 8 1.1机试分析 8 1.2 IDE的选择与评测结果 10 1.3 DreamJudge的使用 11 1.4输入输出技巧 ...
- 离散数学真值表(c语言编程实现),C语言 实现离散数学合式公式真值表
我们介绍了什么是合式公式以及怎样用C语言实现判断机制 现在我们来谈谈怎样用C语言去实现合式公式的真值表. 该程序功能就是任意给定一个合式公式我们都能把它的真值表输出出来. 步骤1: 引用上一篇的程序, ...
- C语言 实现离散数学合式公式真值表
我们介绍了什么是合式公式以及怎样用C语言实现判断机制 现在我们来谈谈怎样用C语言去实现合式公式的真值表. 该程序功能就是任意给定一个合式公式我们都能把它的真值表输出出来. 步骤1: 引用上一篇的程序, ...
- JMeter 压力測试使用函数和 CSV 文件參数化 json 数据
在 http Load Testing 中.json 数据的提交是个让人头疼的问题.本文具体介绍怎样进行 JMeter 的 json 測试提交,以及怎样将其參数化. Step 1 ht ...
- 拒绝无脑试错:写给萌新的“科学炼丹”入门手册
近期在订阅号后台和文章评论区review了一下大家的问题,发现很多小伙伴现在已经把机器学习.深度学习的理论基础打好了,但是真正要解决一个现实中的算法问题的时候经常两手抓瞎,一顿毫无目的乱试,甚至认为模 ...
- linux 调试引导程序,c-调试syslinux看到的引导文件系统环境?
好,我启动了它- 首先,我注意到根据Mbr – Syslinux Wiki和HowTos – Syslinux Wiki,内置git源中存在替代的mbr,因此我尝试了mbr.bin和altmbr.bi ...
- 【华为OD机试c++】区块链文件转储系统【 2023 Q1考试题 A卷 |100分】
时间限制:C/C++ 1秒,其他语言 2秒 空间限制:C/C++262144K,其他语言524288K 64bit IO Format:%lld 语言限定: C(clang11), C++(clang ...
- 推箱子小游戏自制100关,有兴趣可以试一试。(头文件和源文件分开)游戏截图已发。
因为地图是从文件中读取,所以关卡地图发成了资源. key.cpp #include <conio.h> #include "pushBox.h"//键盘操作(改变核心数 ...
- 《影子跟随算法》目前试着自己写一个联网双人对战的小游戏 看到一篇网络同步的文章很受启发 这里记录一下
文章转载于:http://www.skywind.me/blog/archives/131 影子跟随算法由普通DR(dead reckoning)算法发展而来,我将其称为"影子跟随" ...
- 机试记不住头文件_朱兆祺教你如何攻破C语言学习、笔试与机试的难点
第四节关键字.运算符与语句 1.1static 1. 如程序清单4. 1所示,请问输出i.j的结果? 程序清单4. 1 static #include static int j ; ...
最新文章
- 李沐团队新作Gluon,复现CV经典模型到BERT,简单好用 | 强烈推荐
- information_schema.triggers 学习
- frameset小结
- signature=0e42fe6b348b65f88748ba8ecefece12,Low power BIST
- python mmap对象
- C语言main()函数详解
- 通过反射创建动态代理对象(三)
- mysql二进制升级_MySQL二进制安装,升级,多实例部署
- loadrunner11录制不成功解决方法(收集)
- 前端自动化之nvm安装
- oracle自动撤销管理,Oracle 9i中自动撤销管理的优点分析
- coreos安装php,window_win10系统运行wps无响应的解决方案,wps是我们在日常办公中经常会 - phpStudy...
- OpenCV 2.4.9 +VS2013 开发环境配置
- L325 如何睡觉
- Linux C | 查看二进制文件的小工具HexView
- Android 使用反射调用StorageManager中 Hide方法getVolumeList、getVolumeState
- Origin2018安装教程
- ins信息服务器,ins怎么登录服务器
- 7-49 打印学生选课清单 (25 分)
- STRUTS 2 教程