求C语言高手帮我翻译下这段程序!~

本人新手,题目是:张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。现在问:这三人中到底谁说的是真话,谁说的是假话?程序无误,只求程序的全部解释(注释)程序如... 本人新手,题目是:张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。现在问:这三人中到底谁说的是真话,谁说的是假话?程序无误,只求程序的全部解释(注释)程序如下
#include<stdio.h>
void main()
{
int a,b,c;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
if((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0))
{
printf("Zhangsan told a %s.\n",a?"truth":"lie");
printf("Lisi told a %s.\n",b?"truth":"lie");
printf("Wangwu told a %s.\n",c?"truth":"lie");
}
}
展开
 我来答
拉风的用户名
2010-07-27 · TA获得超过511个赞
知道小有建树答主
回答量:239
采纳率:0%
帮助的人:223万
展开全部
<<第一轮分析>>

我来重点分析下这句话:if((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0))

首先,!的优先级高于&&,而&&的优先级高于||

1.
故,(a&&!b||!a&&b) 等价于 (a&&(!b))||((!a)&&b),表示a(张三)说真话且b(李四)说假话,或者,a说假话且b说真话。
概括起来就是,a和b 一真一假。

2.
(b&&!c||!b&&c) 同理,表示b和c 一真一假。

3.
(c&&a+b==0||!c&&a+b!=0)表示c说真话且a、b都说假话,或者,c说假话且a、b中至少有一个说真话。
概括起来就是,说真话的人要么是c,要么在a、b当中。(但是肯定有人说真话)

4.
((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0)) 是以上三点讨论取交集(&&)(交集表示同时成立),
即 {a和b一真一假} 交 {b和c一真一假} 交 {说真话的人要么是c,要么在a、b当中},
其结果是,只有b说真话。(这个你自己分析可以,但这里是交给计算机去分析出来的)。反正,通过这一系列分析,可以得出判断,说明程序在逻辑上是没有问题的。

<<第二轮分析>>
分析全部程序:
#include<stdio.h> //调用头文件<stdio.h>,凡要用到输入输出都要调用这个。
void main() //主函数
{
int a,b,c; //声明变量a,b,c,分别对应张三,李四,王五,
//其值为1时表示说真话,为0时表示说假话
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++) //没什么难度,总之是通过这些循环,
//取遍a=0,1与b=0,1与c=0,1的各种组合
if((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0))
//把题目条件全部代入,进行判断的过程,上面已经分析过了
{
printf("Zhangsan told a %s.\n",a?"truth":"lie");
//%s表示此处输入或输出为字符串;
//条件运算符“?:”表示,若满足?前的条件,则输出:前的式子,否则输出:后的式子。
//这里是表示若a为1,输出truth;若a为0,输出lie;
printf("Lisi told a %s.\n",b?"truth":"lie"); //b=1:truth;b=0:lie
printf("Wangwu told a %s.\n",c?"truth":"lie"); //c=1:truth;c=0:lie
}
}

<<第三轮分析>>

分析题目逻辑:

{张三说李四在说谎}在程序中用{a和b一真一假}来表示,是正确的。这是因为:若张三说真话,根据张三说的话,李四必然说谎;若张三说假话,根据张三说的话,李四是被冤枉的,李四说真话。

{李四说王五在说谎}在程序中用{b和c一真一假}来表示,也是正确的。道理同上。

{王五说张三和李四都在说谎}在程序中用 {说真话的人要么是c,要么在a、b当中} 来表示,同样是正确的。这是因为:若张三、李四都说谎,那么根据王五这句话,说明王五说的是真话;反之,若张三、李四中,至少有一个人说真话,那王五说的这句话就是假话,王五就是说谎的。

所以,题目的逻辑转化成具体的程序,是正确的,也很成功

分析到这里好累。楼主把最佳给我吧?
百度网友f9d49d2
2010-07-27 · TA获得超过599个赞
知道小有建树答主
回答量:185
采纳率:0%
帮助的人:165万
展开全部
a代表张三说的话的真假,1为真,0为假
b代表李四说的话的真假,1为真,0为假
c代表王五说的话的真假,1为真,0为假

在循环中,就是遍历每个可能取值,以找到符合条件的情况

于是继续看看循环体中判断语句的意思

(1)a&&!b||!a&&b
解释:张三说李四在说谎。如果张3说的是真话,则a=1,b=0,a与!b为真,反之a=0,b=1,!a与b为真。于是“张三说李四在说谎”可得到a&&!b与!a&&b至少一个是真的。也就是a&&!b||!a&&b为真

(2)b&&!c||!b&&c
解释:这是针对“李四说王五在说谎”翻译而来的代码。含义和上面是类似的

(3)c&&a+b==0||!c&&a+b!=0
解释:王五说张三和李四都在说谎。若王五说真话,则c=1,a=0,b=0,a+b=0。c&&a+b==0为真。反之,c=0,!c=1,张三和李四不会同时说假话,也就是说a和b不同时为0,因此a+b!=0。整句话翻译下来就是c&&a+b==0||!c&&a+b!=0了

可见这段代码就是将题目中的三句话翻译成了三个条件。

谢谢.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhenfeipeng
2010-07-27 · TA获得超过221个赞
知道小有建树答主
回答量:84
采纳率:0%
帮助的人:132万
展开全部
a代表张三说的话的真假,1为真,0为假
b代表李四说的话的真假,1为真,0为假
c代表王五说的话的真假,1为真,0为假

在循环中,就是遍历每个可能取值,以找到符合条件的情况

于是继续看看循环体中判断语句的意思

(1)a&&!b||!a&&b
解释:张三说李四在说谎。如果张3说的是真话,则a=1,b=0,a与!b为真,反之a=0,b=1,!a与b为真。于是“张三说李四在说谎”可得到a&&!b与!a&&b至少一个是真的。也就是a&&!b||!a&&b为真

(2)b&&!c||!b&&c
解释:这是针对“李四说王五在说谎”翻译而来的代码。含义和上面是类似的

(3)c&&a+b==0||!c&&a+b!=0
解释:王五说张三和李四都在说谎。若王五说真话,则c=1,a=0,b=0,a+b=0。c&&a+b==0为真。反之,c=0,!c=1,张三和李四不会同时说假话,也就是说a和b不同时为0,因此a+b!=0。整句话翻译下来就是c&&a+b==0||!c&&a+b!=0了

可见这段代码就是将题目中的三句话翻译成了三个条件。

再看输出语句。
printf("Zhangsan told a %s.\n",a?"truth":"lie");
解释 x? y:z 是一个三目运算符。其含义是如果x为真,则是y,否则是z。
看程序中的语句。若a为真,则张三是说了truth,反之为lie
李四和王五类似
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qx179
2010-07-27 · TA获得超过671个赞
知道小有建树答主
回答量:499
采纳率:0%
帮助的人:445万
展开全部
0是假话
1是真话
主要分析下
((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0))
就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
warmwormn
2010-07-27 · TA获得超过739个赞
知道小有建树答主
回答量:1694
采纳率:0%
帮助的人:1413万
展开全部
学下离散数字中的逻辑
不学说了也不会弄
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式