|
- //自动生成真值表
- #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;
- }
复制代码
|
|