读书人

[]一个困扰很久的有关问题!

发布时间: 2012-03-14 12:01:12 作者: rapoo

[求助]一个困扰很久的问题!!~~~~~~~~
RT。。。我们老师最近要求我们写个程序。。要求如下:输入离散数学中的一个命题公式,例如:(P∨Q)→R。。。然后输出他的真值表。。。例如:
P Q R PVQ (P∨Q)→R
0 0 0 0 0
0 0 1 0 0
[color=#FF0000][/color]我想了很久都没有思路!!!!希望哪位达人可以给我讲下写这个程序的详细思路!!!!非常感谢!!!!!!(嗨!!!求了这么多次。。还是没有找到解决的办法!!!还是再求一次把!!!)[color=#FF0000][/color]

[解决办法]
能不能用语言描述一下这个公式什么意思
不过一般设计到真值表的操作都和逻辑运算有关
比如A+B=C
这个逻辑式的真值表为
0 0 0
0 1 1
1 0 1
1 1 1
注意
前两列是递增的关系
所以用程序我会这么实现

C/C++ code
for(int i=0; i<4; i++){    int a, b, c;    a=i&0x1;//取最低位    b=i&0x2;//取倒数第二位     c=a||b;    cout<<a<<'\t'<<b<<'\t'<<c<<endl;}
[解决办法]
这个难吗???P,V,P∨V,还有R,只有P∨V为T,R为F的时候,这个式子为F,其他的都为真,循环一下就行了呀!!!!
[解决办法]
首先得定义各种逻辑运算,如∨等符号代表的运算集合,即1∨1=1,1∨0=1,0∨0=0。函数中用switch很易实现;
接着输入的公式用字符数组存储;
对数组元素进行扫描,遇到已定义符号,如c[i]是∨,将c[i-1],c[i],c[i+1]带入作为参数;若是单目运算符,就少一个参数了;
要是有括号,就比较麻烦,想的不太成熟。遇到右括号,就向前遍历,找到第一个左括号,将这一小段公式运算结果暂存,作为一个参数参与其他运算。
没太仔细想,看看吧,能对有什么启示没?
[解决办法]
主要是判断输入是∧还是∨操作,两层的for循环应该可以,p,q取值只有0和1,这个就是| & !的运算就可以了。
比如
for(p=0;p<=1;p++)
for(q=0;q<=1;q++)
printf("%d %d %d\n",p,q,p|q)

对于复杂的比较长的布尔表达式,需要用数组表示所有的变量,还要考虑带括号,优先级的问题了。

读书人网 >C语言

热点推荐