命題邏輯--主析取主合取正規化
阿新 • • 發佈:2018-11-19
主要是對位運算的操作,,每次加一。
#include <iostream> #include <math.h> using namespace std; int main() { int n, num, a[1024], b[1024][10], cnt, cmp,cnt1 = 0, cnt2 = 0, k = 0; char name[10]={'P','Q','R','S','T','U','V','W','X','Y',}; cout<<"Please enter the number of propositions:"<<endl; cin>>n; num=pow(2,n); cout<<"Please enter the "<<num<<" num.The 1 represent the true,the 0 is flase."<<endl; for (int i=0;i<num;i++) { cin>>a[i]; } cout<<"Truth table:"<<endl; for (int i=0;i<n;i++) { cout<<name[i]<<" "; } cout<<"value"<<endl; cnt=num-1;//初始化所有位為一 cmp=pow(2,n-1);//初始化最高位為一 for (int i=0;i<num;i++) { for (int j=0;j<n;j++) { if (cnt&cmp) { cout<<1<<" "; b[i][j]=1; } else { cout << 0 << " "; b[i][j] = 0; } cmp>>=1; } cnt--; cmp=pow(2,n-1); cout<<a[i]<<endl; }//位運算判斷並列印一和零 for (int i = 1; i < num;i++) { if (a[i]) cnt1++; else cnt2++; } cnt1 -= 1;//避免出現多餘的行尾符號 cnt2 -= 1; cout << "Main disjunction paradigm:" << endl; for (int i=0;i<num;i++) { if (a[i]) { cout<<"("; for (int j=0;j<n;j++) { if (b[i][j]) { cout<<" "<<name[j]<<" "; if (j!=n-1) cout<<"^"; } else { cout << " !" << name[j]<<" "; if (j!=n-1) cout << "^"; } } cout<<")"; if (k<cnt1) { k++; cout << "V" ; } } }//按格式輸出 k = 0; cout << endl; cout << "Master conjunction paradigm:" << endl; for (int i=0;i<num;i++) { if (!a[i]) { cout<<"("; for (int j=0;j<n;j++) { if (!b[i][j]) { cout<<" "<<name[j]<<" "; if (j!=n-1) cout<<"V"; } else { cout << " !" << name[j]<<" "; if (j!=n-1) cout << "V"; } } cout<<")"; if (k<cnt2) { cout << "^"; k++; } } } getchar(); getchar(); return 0; } //3 //1 0 0 1 0 0 0 1