求命题真值表及主范式

  1 #include "iostream"
  2 #include "cstring"
  3 #include "cstdlib"
  4 #include "stack"
  5 #include "cmath"
  6 #define maxsize 100
  7 using namespace std;
  8 char str[100];
  9 int  zhipai[20]={0};
 10 int length;
 11 char expression[100];
 12 class symbol {
 13 public:
 14     void solve();
 15 private:
 16     void change();    
 17     int Calculate();
 18     void DoOperator(char op);
 19     stack<int> s;        
 20 };
 21 
 22 void symbol ::DoOperator(char op){                       
 23     double left=0,right=0;
 24         switch(op){
 25         case '|':s.push(left||right);break;
 26         case '&':s.push(left&&right);break;
 27         case '>':s.push(!left||right);break;
 28         case '!':s.push((!right)&&left);break;
 29         case '=':s.push(left==right);break;
 30         }
 31     
 32 }
 33 void symbol ::change()  
 34 {
 35     int k=0;                             
 36     int flag=1;                         
 37     int count=0;                        
 38     for(int i=0;i<pow(2.0,count);i++)
 39     {
 40         k=1;
 41         for(int m=0;m<length;m++)
 42         {
 43             if(isalpha(str[m]))
 44             {
 45                 if(flag==1)
 46                 {
 47                 if(zhipai[k]==0)
 48                     expression[m]='0';
 49                 else
 50                     expression[m]='1';
 51                 k++;
 52                 }
 53                 else
 54                     expression[m]='0';
 55                 flag=1;
 56                 for(int t=m;t>=0;t--)
 57                 {
 58 
 59                     if((str[m+1]==str[t])&&isalpha(str[m+1])&&isalpha(str[t]))
 60                         flag=0;
 61                 }
 62             }
 63             else
 64                 expression[m]=str[m];
 65         }
 66         for(int t=0;t<length;t++)
 67         {
 68             for(int j=t;j<length;j++)
 69             {
 70                     if(str[t]==str[j])
 71                     {
 72                         expression[j]=expression[t];
 73                     }
 74                 }
 75         }
 76     }
 77 }
 78 void plus(int a[],int q)
 79 {
 80     a[q]=a[q]+1;
 81     for(int i=q;a[i]==2;i--)
 82     {    
 83         a[i]=0;
 84         a[i-1]=a[i-1]+1;
 85     }
 86 }
 87 int isp(char ch)     //联结词的栈内优先级
 88 {
 89     switch(ch){
 90     case '#':return 0;break;
 91     case '(':return 1;break;
 92     case '!':return 10;break;
 93     case '=':return 9;break;
 94     case '&':return 7;break;
 95     case '|':return 5;break;
 96     case '>':return 3;break;
 97     case ')':return 12;break;
 98     default:return -1;break;
 99     }
100 }
101 int icp(char ch)     //联结词的栈外优先级
102 {
103     switch(ch){
104     case '#':return 0;break;
105     case '(':return 12;break;
106     case '!':return 11;break;
107     case '=':return 8;break;
108     case '&':return 6;break;
109     case '|':return 4;break;
110     case '>':return 2;break;
111     case ')':return 1;break;
112     default:return -1;break;
113     }
114 }
115 int symbol ::Calculate()               
116 {
117     stack<char> h;
118     char ch,y;
119     h.push('#');
120     for(int temp=0;temp<length-1;temp++){
121         ch=expression[temp];
122         if(isdigit(ch))
123         {
124             if(ch=='0')
125             s.push(0);
126             else
127                 s.push(1);
128         }
129         else if(ch==')')
130         {
131             for(y=h.top(),h.pop();y!='(';y=h.top(),h.pop()){
132                 DoOperator(y);}
133         }
134         else{
135             if(ch=='!')
136             {
137                 s.push(1);
138             }
139             for(y=h.top(),h.pop();isp(y)>icp(ch);y=h.top(),h.pop())
140                 DoOperator(y);
141             h.push(y);
142             h.push(ch);
143         }
144     }
145     while(h.size()!=1){
146         y=h.top();
147         h.pop();
148         DoOperator(y);    
149     }
150     cout <<s.top()<<endl;
151     return s.top();
152 }
153 
154 void symbol::solve()
155 {
156     cout<<"请输入命题逻辑表达式:"<<endl;
157     cout<<"(|:或运算,&:与运算,!非运算,>蕴涵运算,=等价运算,以#结尾)"<<endl;
158     cout<<""<<endl;
159     int flag=1;                   
160     int count=0;                     
161     cin >>str;  
162     length=strlen(str);    
163     if(str[length-1]!='#')
164     {
165         cout<<"未以#结尾,重新输入!"<<endl;
166         system("pause");
167         exit(0);
168     }
169     char bianyuan[100];                            
170     for(int i=0;i<length;i++)
171     {
172         if(isalpha(str[i])&&(flag==1))
173         {
174             bianyuan[count]=str[i];count++;
175         }
176         flag=1;
177         for(int k=0;k<count;k++)
178         {
179             if(bianyuan[k]==str[i+1])flag=0;
180         }        
181     }    
182     if(count==0)
183     {
184         cout<<"无命题变元,重新输入!"<<endl;
185         solve();
186     }
187     cout<<"真值表(用0代替F,用1代替T):" <<endl;
188     
189     for(int w=0;w<count;w++)
190     cout<<bianyuan[w]<<' ';
191     cout<<"result"<<endl;
192     int* truth=new int[pow(2.0,count)];
193     stack<char> xh1;
194     xh1.push('(');
195     stack<char> xh2;
196     stack<char> hx1;
197     hx1.push('(');
198     stack<char> hx2;
199     for(int r=0;r<pow(2.0,count);r++)
200     {
201         for(int j=1;j<=count;j++)
202         {cout<<zhipai[j]<<' ';}
203         change(); 
204         truth[r]=Calculate(); 
205         if(truth[r]==1)    
206         {
207             for(int t=0;t<count;t++)
208             {
209                 if(zhipai[t+1]==1)
210                 {
211                     xh1.push(bianyuan[t]);
212                     xh1.push('&');
213                 }
214                 else
215                 {
216                     xh1.push('!');
217                     xh1.push(bianyuan[t]);
218                     xh1.push('&');
219                 }
220             }
221             xh1.pop();
222             xh1.push(')');
223             xh1.push('|');
224             xh1.push('(');
225         }
226         if(truth[r]==0)                
227         {
228             for(int c=0;c<count;c++)
229             {
230                 if(zhipai[c+1]==1)
231                 {
232                     hx1.push(bianyuan[c]);
233                     hx1.push('|');
234                 }
235                 else
236                 {
237                     hx1.push('!');
238                     hx1.push(bianyuan[c]);
239                     hx1.push('|');
240                 }
241             }
242             hx1.pop();
243             hx1.push(')');
244             hx1.push('&');
245             hx1.push('(');
246         }
247         plus(zhipai,count);
248     }
249     cout<<"析合范式为:";
250     if(xh1.size()==1)
251         cout<<"无析合范式,此表达式为矛盾式";
252     else{
253         xh1.pop();
254         xh1.pop();
255         while(xh1.size()!=0)
256         {
257             xh2.push(xh1.top());
258             xh1.pop();
259         }
260         while(xh2.size()!=0)
261         {
262             cout<<xh2.top();
263             xh2.pop();
264         }
265     }
266     cout<<endl;
267     cout<<"合析范式为:";
268     if(hx1.size()==1)
269         cout<<"无合析范式,此表达式为重言式";
270     else{
271         hx1.pop();
272         hx1.pop();
273         while(hx1.size()!=0)
274         {
275             hx2.push(hx1.top());
276             hx1.pop();
277         }
278         while(hx2.size()!=0)
279         {
280             cout<<hx2.top();
281             hx2.pop();
282         }
283     }
284     cout<<endl;    
285 }
286 void main()
287 {
288     
289     symbol a;
290     a.solve();
291     system("pause");
292 }
原文地址:https://www.cnblogs.com/zlgxzswjy/p/4937273.html