如何用C或C+编程序实现:从键盘任意输入一个命题公式,用真值表法判断其类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用C或C+编程序实现:从键盘任意输入一个命题公式,用真值表法判断其类型相关的知识,希望对你有一定的参考价值。
参考技术A #include<iostream>#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";
参考资料:信息安全的孩子来啦
本回答被提问者采纳以上是关于如何用C或C+编程序实现:从键盘任意输入一个命题公式,用真值表法判断其类型的主要内容,如果未能解决你的问题,请参考以下文章
如何用switch语句判断从键盘输入字符的属性属于大写字母,小写字母,数字或其他的符号