
求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");
}
} 展开
#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");
}
} 展开
5个回答
展开全部
<<第一轮分析>>
我来重点分析下这句话: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当中} 来表示,同样是正确的。这是因为:若张三、李四都说谎,那么根据王五这句话,说明王五说的是真话;反之,若张三、李四中,至少有一个人说真话,那王五说的这句话就是假话,王五就是说谎的。
所以,题目的逻辑转化成具体的程序,是正确的,也很成功
分析到这里好累。楼主把最佳给我吧?
我来重点分析下这句话: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当中} 来表示,同样是正确的。这是因为:若张三、李四都说谎,那么根据王五这句话,说明王五说的是真话;反之,若张三、李四中,至少有一个人说真话,那王五说的这句话就是假话,王五就是说谎的。
所以,题目的逻辑转化成具体的程序,是正确的,也很成功
分析到这里好累。楼主把最佳给我吧?
展开全部
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了
可见这段代码就是将题目中的三句话翻译成了三个条件。
谢谢.
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了
可见这段代码就是将题目中的三句话翻译成了三个条件。
谢谢.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
李四和王五类似
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
李四和王五类似
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
0是假话
1是真话
主要分析下
((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0))
就可以了
1是真话
主要分析下
((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0))
就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
学下离散数字中的逻辑
不学说了也不会弄
不学说了也不会弄
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询