欧卡2中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

需要三步,才能开始

只需两步,慢速开始

玩欧卡就用莱仕达V99方向盘欧卡2入门方向盘选莱仕达V9莱仕达折叠便携游戏方向盘支架欢迎地图Mod入驻
查看: 4302|回复: 0
收起左侧

自动生成真值表

[复制链接]
script 发表于 2011-11-10 21:03 | 显示全部楼层 |阅读模式
//自动生成真值表
#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;
}

联系我们|手机版|欧卡2中国 ( 湘ICP备11020288号-1 )

GMT+8, 2024-12-29 13:06 , Processed in 0.035578 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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