第一次写博客,新鲜又紧张,写的不好,大犇轻喷。
实现功能 从文本中读取复合命题,并在文本文件中打印真值表
[如果不清楚文本读取,可以先浏览这个博客](https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html)
简单来说就是用ifstream和ofstream实例化一个对象,并将其与你要操作的文本文件绑定;
ifstream用于从文本里读取数据,它重载了>>;
ofstream用于创建一个文本文件,并将数据输入到改文本里,它重载了<<。
[这里还用到了栈和后缀表达式,不太清楚的可以参考这个博客](https://blog.csdn.net/PaRzVaL/article/details/105360855?tdsourcetag=s_pctim_aiomsg)
#整体思路
由于这里需要对数据进行频繁的随机访问,而且只需要在容器的尾端进行删除和添加的操作,所以这里可以直接使用vector或者指针,
下面的代码是以vector为例实现的
这里支持的逻辑连接词包括析取,合取,否定,蕴含和等价连接词
|表示析取,&表示合取,!表示取反,>表示蕴含,=表示等价
#代码
#include<bits/stdc++.h>
using namespace std;
class Pro
{
private:
vector<char> book_1; //储存子命题
vector<bool> ans; //储存后缀表达式
vector<char> pro_2,pro; //堆栈储存复合命题
bool book_2[20]; //储存子命题对应的布尔变量
string pro_1;
bool contain(bool a,bool b); //自定义蕴含运算
bool equ(bool a,bool b); //自定义等价运算
void star(); //文本处理工作
void add(); //统计子命题及其个数
void put_out(); //对后缀表达式进行运算
void mind(); //对用户指令进行判断
public:
void slove()
{
star();
add();
put_out();
}
};
void Pro::mind()
{
char op;
cin>>op;
if(op=='Y')
{
cin>>pro_1;
}
else if(op=='N')
{
ifstream infile("复合命题.txt");
getline(infile,pro_1);
}
else
{
cout<<"指令错误,请重新输入指令"<<endl;
mind();
}
}
void Pro::star()
{
//此处规定 子命题为小写字母 !为非 &为合取 |为析取 >为蕴含 =为等价
ofstream outfile("复合命题.txt");
outfile<<"!(q|p)>!r&m" ;
outfile.close();
cout<<"!注意 ! 此处规定 自命题为小写字母 !为非 &为合取 |为析取 >为蕴含 =为等价 " <<endl<<endl;
cout<<"目前计算的是: p|!q>r|((!p&!r>q)>r&(q|p&!r)>p|!q>r|)(!p&!r>q)>r&(q|p&!r) 的真值表"<<endl;
cout<<"如果你要自己输入一个复合命题打表 请输入Y 否则输入N"<