谁帮我写一下重言式判别的程序,c语言或者c++都可以

谁帮我写一下重言式判别的程序,c语言或者c++都可以,第1张

#include<iostream.h>

#include<cctype>

#include<cmath>

char compare[8][8]={{" |&~()#"},{"|><<<>>"},{"&>><<>>"},{"~>><<>>"},{"(<<<<= "},{")>>>>>"},{"#<<<<="}}

char precede(char x,char y)

char calculator(char biao[])

char precede(char x,char y)

char operate_1(char x)

char operate_2(char x,char y,char thera)

void replace(char x,char c[],char y)

void panduan(char c[])

bool is_hefa(char c[])

int main()

{

char c[80]={'\0'},ch

int flag

do

{

flag=0

do{

flag=0

cout<<"亮态Please input the expression to judge:\n"

cin>>c

if(!is_hefa(c))

{

flag=1

cout<<"The expression is not valid, please input again \n"

}

}while(flag)

panduan(c)

cout<<"do you want to continue(y/n)?\n"

cin>>ch

}while(ch=='y'||ch=='Y')

return 0

}

char calculator(char biao[])

{

char result,thera,a,b,c

char *optr=new char[80]

char *opnd=new char[80]

char *temp=new char[80]

int r=0,d=0

for (int i=0biao[i]!='\0'i++)

temp[i]=biao[i]

temp[i]='#'

temp[i+1]='\0'

optr[r++]='#'

i=0

c=temp[i++]

while(c!='#'||optr[r-1]!='#')

{

if(c=='0'||c=='1'段键带) { opnd[d++]=cc=temp[i++]}

else

switch(precede(optr[r-1],c))

{

case '<':

optr[r++]=c

c=temp[i++]

break

case '=':

r--

c=temp[i++]

break

case '>':

thera=optr[--r]

if(thera=='~')

{ a=opnd[--d]

result=operate_1(a)

}

else

{ a=opnd[--d]

b=opnd[--d]

result=operate_2(a,b,thera)

}

opnd[d++]=result

}

}

result=opnd[0]

delete [] temp

delete [] optr

delete [] opnd

return result

}

char precede(char x,char y)

{

int i=0,j=0

for (i=0i<8i++)

if(compare[i][0]==x)

break

for (j=0j<8j++)

if(compare[0][j]==y)

break

return compare[i][j]

}

char operate_1(char x)

{

return (x>'0'?'0':'1')

}

char operate_2(char x,char y,char thera)

{

if(thera=='&')

{

if(x=='0'||y=='0')

return '0'

else

return '1'

}

else {

if(x=='1'握芦||y=='1')

return '1'

else

return '0'

}

}

void replace(char x,char c[],char y)

{

for(int i=0c[i]!='\0'i++)

if(c[i]==x)

c[i]=y

}

void panduan(char c[])

{

char temp[80]={'\0'}

char alpha[27]={'\0'}

int record[26]={0},n=0,k,r,m,j

for(int i=0c[i]!='\0'i++)

{

if(isalpha(c[i])&&record[c[i]-'A']==0)

{

alpha[n++]=c[i]

record[c[i]-'A']=1

}

}

char *rec=new char[n+1]

char flag='0'

int record_change=0,bi=0

int limit=(int)pow(2,n)

for( i=0i<limiti++)

{

for(k=0c[k]!='\0'k++)

temp[k]=c[k]

temp[k]='\0'

for(k=0k<nk++)

rec[k]='0'

j=i

m=n

while(j!=0)

{

r=j%2

j=j/2

rec[--m]=char(r+'0')

}

for(m=0m<nm++)

{

replace(alpha[m],temp,rec[m])

}

if(calculator(temp)!=flag)

{

if(i==0)

bi=1

record_change++

flag=(flag>'0'?'0':'1')

}

}

if(record_change==0)

{

cout<<"False forever\n"<<endl

}

else

if(record_change==1&&bi==1)

{

cout<<"True forever\n"<<endl

}

else

{

cout<<"Satisfactible "<<c<<endl

for(k=0c[k]!='\0'k++)

temp[k]=c[k]

temp[k]='\0'

cout<<"Please input in the value of the variable one by one\n"

for(m=0m<nm++)

{

cin>>rec[m]

replace(alpha[m],temp,rec[m])

}

cout<<"the result is\n"<<calculator(temp)<<endl

}

delete [] rec

}

bool is_hefa(char c[])

{

char *p=c,temp[80]={'\0'}

int i=0,n=0,m=0,k=0

while(p[i])

{

if (!(isalpha(p[i])||p[i]=='('||p[i]==')'||p[i]=='|'||p[i]=='&'||p[i]=='~'||p[i]==' '))

return false

if(p[i]!=' ')

temp[n++]=p[i]

i++

}

for (i=0i<ni++)

c[i]=temp[i]

c[i]='\0'

for (i=0i<ni++)

{

if(c[i]=='(')

k++

if(c[i]==')')

k--

}

if (k!=0)

return false

return true

}

要看这个程序做到什么程度。

如果要简单地让计算机来判定一个命题是否是重言式,C++自身就提供了且,或,非的运算符。对任一个n元命题,借助于替代规则,只需考虑那些只出现命题变元的式子即可。

先森知梁将命题翻译成C++形式,然后定义n个bool型变量,n重循环来判定就可以。

但那样的程序,何苦去写?偶也正好在学数理逻辑,我认为应该此运要实现一个任意输入一个命题形式,程序便可以自动打印出真值表,并且能做出是否是重言式,矛猛坦盾式的判断。也就是说对命题的翻译工作也交由程序来做,让它来分析命题的结构。这个我也在想如何实现,可能要费上一点功夫。想到了再来。

用归谬赋值法做。(只有蕴涵式,就是充分条件、必要条件、充要条件这样的式子才能用这个方法)。第一步:假设这个运算为假,就在最后一步运算下,就是那个箭头下面写F(代表真值为假)。第二步:这个运算为假,根据充分条件假言直言推理的真值表山告可知,只有当前面为真、后面为假时,此运算逗氏明的真值才为假,因此,在表示“或”的符号下写T(代表真值为真),在式子后面的p下面写F(代表真值为假)。第三步:q可能真、可能假,如果Q真,式子成立,没有出现赋值矛盾,因此该式不是核宽重言式。(如果出现赋值矛盾就是重言式,反之则不是)亲,你的这个式子不是很典型.......


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12463319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存