//自动生成真值表
#include<iostream>
#include<string>
using namespace std;
class Gongshi{//得到任意公式真值表的类
private:
string yuanshimingti;//用来保存输入的原始公式。
string guodu;//过渡用的字符串。
string zuijian;//保存命题变元的字符串。
int num;//原子命题个数
public:
Gongshi(string a)//构造函数
{
yuanshimingti=a;
guodu="00000000000000000000";//初始化为0000....为了更好的储存数据
zuijian="00000000000000000000";
huoquzimu();//调用设置函数
}
void huoquzimu()//得到原子命题的函数
{
int k=0;
for(int i=0;yuanshimingti[i]!=0;i++)
if((yuanshimingti[i]>='a')&&(yuanshimingti[i]<='z')){//原子命题必须是小写字母
guodu[k]=yuanshimingti[i];
k++;
}
guodu[k]='\0';//字符串结束符
setguodu();//调用函数,去掉重复的
}
void setguodu()//化简所得到的命题变元,去掉重复的。
{
int k=1;
zuijian[0]=guodu[0];
for(int i=1;guodu[i]!=0;i++){
if(jianyan(guodu[i],i)){
zuijian[k]=guodu[i];
k++;
}
}
guodu[k]='\0';
num=k;//记下命题变元的个数
}
bool jianyan(char a,int n)//检验是否重复的子函数
{
for(int i=0;i<n;i++){
if(a==zuijian[i])
return 0;
}
return 1;
}
void operator1()//主操作函数1
{
int i;
for(i=0;i<num;i++)//输出第一行不变的格式
cout<<zuijian[i]<<" ";
cout<<yuanshimingti<<" "<<"真值"<<endl;
int a=1;//用来储存一共有多少种解释。
for(i=0;i<num;i++)
a=a*2;
//分2^num种情况,来解释真值表
int b=0,c[10]={0,0,0,0,0,0,0,0,0,0};
for(i=0;i<a;i++){
int d=b;
for(int j=0;j<num;j++){
//将十进制转化为二进制
c[j]=d%2;
d=(int)d/2;
}
for(int j=num-1;j>-1;j--){
cout<<c[j]<<" ";
}
b++;
string cc="0000000000";
for(int j=0;j<num;j++){
if(c[j]==1)
cc[j]='1';
else
cc[j]='0';
}
string aa;
aa=yuanshimingti;
//通过双重循环,用0/1来替代命题变员
for(int k=0;k<num;k++){//变员
for(int j=0;aa[j]!=0;j++){//原始公式
if(aa[j]==zuijian[k])
aa[j]=cc[num-k-1];
}
}
cout<<aa<<" "<<operator2(aa);
cout<<"\n";
}
}
char operator2(string chushi)//操作函数2,得到某种解释下真值表的值,主要思路:从前到后,从外到里!
{
//第一步,先找到和计算出最外面的括号!
int a,b=0,k=0;
for(int i=0;chushi[i-1]!=')'&&chushi[i]!=0;i++){
if(chushi[i]==')')
b=i;
}
for(int i=0;chushi[i]!=')'&&chushi[i]!=0;i++){
if(chushi[i]=='(')
a=i;
}
if(b!=0){
for(int i=a+1;i<b;i++){
guodu[k]=chushi[i];
k++;
}
guodu[k]='\0';
char t;
t=operator2(guodu);
chushi[a]=t;
int z=a+1;
for(k=b+1;chushi[k-1]!=0;k++){
chushi[z]=chushi[k];
z++;
}
return operator2(chushi);
}
//第二步再去掉否定
for(int i=0;chushi[i]!=0;i++){
if(chushi[i]=='!'){
if(chushi[i+1]=='1')
chushi[i+1]='0';
else
chushi[i+1]='1';
int z=i;
for(k=z+1;chushi[k-1]!=0;k++){
chushi[z]=chushi[k];
z++;
}
}
}
//第三步直接计算真值
char c='1';
for(int i=0;chushi[i]!=0;i++){
if(chushi[i]=='+'){
if((chushi[i-1]=='1')||(chushi[i+1]=='1'))
chushi[i+1]='1';
else
chushi[i+1]='0';
}
if(chushi[i]=='^'){
if((chushi[i-1]=='1')&&(chushi[i+1]=='1'))
chushi[i+1]='1';
else
chushi[i+1]='0';
}
if(chushi[i+1]!=0)
c=chushi[i+1];
}
return c;
}
};
int main()
{
string a1;//用来接收输入的字符串
cout<<"(合取用^代替,析取用+代替,命题变元用小写字母)"<<endl;
cout<<"请输入表达式:";
cin>>a1;
cout<<endl;
Gongshi gongshi1(a1);//初始化一个类的对象.
gongshi1.operator1();//调用该类的主操作函数,实现目的.
return 0;
}
|