知行社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2978|回复: 0
收起左侧

自动生成真值表

[复制链接]
script 发表于 2011-11-10 21:03 | 显示全部楼层 |阅读模式
  1. //自动生成真值表
  2. #include<iostream>
  3. #include<string>
  4. using namespace std;

  5. class Gongshi{//得到任意公式真值表的类
  6. private:
  7.     string yuanshimingti;//用来保存输入的原始公式。
  8. string guodu;//过渡用的字符串。
  9. string zuijian;//保存命题变元的字符串。
  10. int num;//原子命题个数

  11. public:
  12. Gongshi(string a)//构造函数
  13. {
  14.   yuanshimingti=a;
  15.   guodu="00000000000000000000";//初始化为0000....为了更好的储存数据
  16.   zuijian="00000000000000000000";
  17.   huoquzimu();//调用设置函数
  18. }

  19. void huoquzimu()//得到原子命题的函数
  20. {
  21.   int k=0;
  22.   for(int i=0;yuanshimingti[i]!=0;i++)
  23.    if((yuanshimingti[i]>='a')&&(yuanshimingti[i]<='z')){//原子命题必须是小写字母
  24.     guodu[k]=yuanshimingti[i];
  25.     k++;
  26.    }
  27.    guodu[k]='\0';//字符串结束符
  28.    setguodu();//调用函数,去掉重复的
  29. }
  30. void setguodu()//化简所得到的命题变元,去掉重复的。
  31. {
  32.   int k=1;
  33.   zuijian[0]=guodu[0];
  34.   for(int i=1;guodu[i]!=0;i++){
  35.    if(jianyan(guodu[i],i)){
  36.     zuijian[k]=guodu[i];
  37.     k++;
  38.    }
  39.   }
  40.   guodu[k]='\0';
  41.   num=k;//记下命题变元的个数
  42. }
  43. bool jianyan(char a,int n)//检验是否重复的子函数
  44. {
  45.   for(int i=0;i<n;i++){
  46.    if(a==zuijian[i])
  47.     return 0;
  48.   }
  49.   return 1;
  50. }

  51. void operator1()//主操作函数1
  52. {
  53.   int i;
  54.   for(i=0;i<num;i++)//输出第一行不变的格式
  55.         cout<<zuijian[i]<<" ";
  56.      cout<<yuanshimingti<<" "<<"真值"<<endl;

  57.      int a=1;//用来储存一共有多少种解释。
  58.   for(i=0;i<num;i++)
  59.    a=a*2;

  60.        //分2^num种情况,来解释真值表
  61.   int b=0,c[10]={0,0,0,0,0,0,0,0,0,0};
  62.   for(i=0;i<a;i++){
  63.    int d=b;
  64.          for(int j=0;j<num;j++){
  65.     //将十进制转化为二进制
  66.     c[j]=d%2;
  67.     d=(int)d/2;
  68.    }
  69.    for(int j=num-1;j>-1;j--){
  70.     cout<<c[j]<<" ";
  71.    }
  72.    b++;
  73.    string cc="0000000000";
  74.    for(int j=0;j<num;j++){
  75.     if(c[j]==1)
  76.      cc[j]='1';
  77.     else
  78.      cc[j]='0';
  79.    }
  80.       string aa;
  81.    aa=yuanshimingti;
  82.    //通过双重循环,用0/1来替代命题变员
  83.       for(int k=0;k<num;k++){//变员
  84.      for(int j=0;aa[j]!=0;j++){//原始公式
  85.       if(aa[j]==zuijian[k])
  86.       aa[j]=cc[num-k-1];                 
  87.      }
  88.    }
  89.             cout<<aa<<" "<<operator2(aa);
  90.         cout<<"\n";  
  91.   }
  92. }
  93. char operator2(string chushi)//操作函数2,得到某种解释下真值表的值,主要思路:从前到后,从外到里!
  94. {
  95.         //第一步,先找到和计算出最外面的括号!
  96.   int a,b=0,k=0;
  97.   for(int i=0;chushi[i-1]!=')'&&chushi[i]!=0;i++){
  98.    if(chushi[i]==')')
  99.      b=i;
  100.   }
  101.   for(int i=0;chushi[i]!=')'&&chushi[i]!=0;i++){
  102.    if(chushi[i]=='(')
  103.      a=i;
  104.   }
  105.   if(b!=0){
  106.       for(int i=a+1;i<b;i++){
  107.        guodu[k]=chushi[i];
  108.        k++;
  109.    }
  110.       guodu[k]='\0';
  111.    char t;
  112.       t=operator2(guodu);
  113.    chushi[a]=t;
  114.    int z=a+1;
  115.   for(k=b+1;chushi[k-1]!=0;k++){
  116.     chushi[z]=chushi[k];
  117.     z++;
  118.    }
  119.   return operator2(chushi);
  120.   }
  121.   //第二步再去掉否定
  122.   for(int i=0;chushi[i]!=0;i++){
  123.    if(chushi[i]=='!'){
  124.     if(chushi[i+1]=='1')
  125.      chushi[i+1]='0';
  126.     else
  127.         chushi[i+1]='1';
  128.     int z=i;
  129.           for(k=z+1;chushi[k-1]!=0;k++){
  130.         chushi[z]=chushi[k];
  131.         z++;
  132.     }
  133.    }
  134.   }
  135.   //第三步直接计算真值
  136.   char c='1';
  137.   for(int i=0;chushi[i]!=0;i++){
  138.    if(chushi[i]=='+'){
  139.     if((chushi[i-1]=='1')||(chushi[i+1]=='1'))
  140.      chushi[i+1]='1';
  141.     else
  142.      chushi[i+1]='0';
  143.    }
  144.    if(chushi[i]=='^'){
  145.     if((chushi[i-1]=='1')&&(chushi[i+1]=='1'))
  146.      chushi[i+1]='1';
  147.     else
  148.      chushi[i+1]='0';
  149.    }
  150.    if(chushi[i+1]!=0)
  151.     c=chushi[i+1];
  152.   }
  153.   return c;
  154. }
  155. };
  156. int main()
  157. {
  158. string a1;//用来接收输入的字符串
  159. cout<<"(合取用^代替,析取用+代替,命题变元用小写字母)"<<endl;
  160. cout<<"请输入表达式:";
  161. cin>>a1;
  162. cout<<endl;

  163. Gongshi gongshi1(a1);//初始化一个类的对象.

  164. gongshi1.operator1();//调用该类的主操作函数,实现目的.

  165. return 0;
  166. }
复制代码


QQ|小黑屋|手机版|知行技术社区 ( 湘ICP备11020288号-1 )

GMT+8, 2020-9-27 14:53 , Processed in 0.020218 second(s), 11 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表