#include<string>
using namespace std;
string calcValue(string value1);
string calcValueNop(string value1);
string caclAnd(string x,string y);
string caclOr(string x,string y);
string caclNot(string x);
int main()
{ string in,varList="";//="!a+b^c"
cout<<"請輸入命題公式: 註意: !,^,+,(,),字母為合法,不要有數字、空格,括號也要匹配!"<<endl;
cin>>in;
cout<<"輸入命題公式"<<in<<"的真值表如下:"<<endl;
int length=in.length();
for(int i=0;i<length;i++)
{
char code=in[i];
if( ((code>=97)&&(code<123)||((code>=65))&&(code<81))&&varList.find(code,0)==-1 )
varList+=code;
}
int n=varList.length();
for(i=0;i<n;i++)
cout<<varList[i]<<"\t";
cout<<in<<"\t\t"<<"值"<<endl;
int m=1;
int flag;
char *trow=new char[n];
for(i=0;i<n;i++){m*=2;trow[i]='0';}
for(i=0;i<m;i++)
{
for(int j=0;j<n;j++)
cout<<trow[j]<<"\t";
string value1=in;
for(j=0;j<n;j++)
{
char x=varList[j];
for(int k=0;k<length;k++)
if(value1[k]==x)
value1[k]=trow[j];
}
cout<<value1<<"\t\t"<<calcValue(value1)<<endl;
flag=1;
for(j=n-1;j>-1;j--)
{ int temp;
temp=int(trow[j])-48;
flag=flag+temp;
if(flag==2)
{
trow[j]='0';
flag=1;
}
else
{
trow[j]='1';
flag=0;
break;
}
}
}
delete trow;
return 0;
}
string calcValue(string value1)
{
int nlp=value1.find('(',0);
int nrp=value1.length();
string x="",v="";
int i=nlp+1;
while(nlp>=0)
{
x=value1.substr(i,1);
if(x=="(")
{
nlp=i;
i++;
}
else
{
if(x==")")
{
nrp=i;
v=calcValueNop(value1.substr(nlp+1,nrp-nlp-1));
value1=(nlp>0?value1.substr(0,nlp):"")+v+((nrp+1)<=value1.length()?value1.substr(nrp+1):"");
nlp=value1.find('(',0);
i=nlp+1;
}
else
{
i=i+1;
}
}
if(i>=value1.length())
{
nlp=value1.find('(',0);
i=nlp+1;
}
}
return calcValueNop(value1);
}
string calcValueNop(string value1)
{
int nnot=value1.find('!',0);
while(nnot>=0)
{
value1=(nnot>0?value1.substr(0,nnot):"")+caclNot(value1.substr(nnot+1,1))+((nnot+2)<=value1.length()?value1.substr(nnot+2):"");
nnot=value1.find('!',0);
}
int nand=value1.find('^',0);
while (nand>0)
{
value1=((nand-1)>0?value1.substr(0,nand-1):"")+caclAnd(value1.substr(nand-1,1),value1.substr(nand+1,1))+((nand+2)<=value1.length()?value1.substr(nand+2):"");
nand=value1.find('^',0);
}
int nOr=value1.find('+',0);
while (nOr>0)
{
value1=((nOr-1)>0?value1.substr(0,nOr-1):"")+
caclOr(value1.substr(nOr-1,1),value1.substr(nOr+1,1))+
((nOr+2)<=value1.length()?value1.substr(nOr+2):"");
nOr=value1.find('+',0);
}
return value1;
}
string caclAnd(string x,string y)
{
if ((x=="1") && (y=="1"))
{
return "1";
}
else
{
return "0";
}
}
string caclOr(string x,string y)
{
if ((x=="0") && (y=="0"))
{
return "0";
}
else
{
return "1";
}
}
string caclNot(string x)
{ if (x=="1")
{
return "0";
}
else
{
return "1";
}
}