當前位置:編程學習大全網 - 編程語言 - 如何用C或C+編程序實現:從鍵盤任意輸入壹個命題公式,用真值表法判斷其類型

如何用C或C+編程序實現:從鍵盤任意輸入壹個命題公式,用真值表法判斷其類型

#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";

}

}

  • 上一篇:編程cat層序列
  • 下一篇:「倉頡」內測人員辟謠:不是中文編程
  • copyright 2024編程學習大全網