第47课 谁是窃贼
谁是窃贼(for循环、if语句、逻辑)

某银行被窃,甲、乙、丙、丁四人被涉嫌拘审。侦破结果表明,罪犯就是其中的某一个人。
警察逐一询问
甲说:“是丙偷的。”
乙说:“我没偷。”
丙说:“我也没偷。”
丁说:“如果乙没有偷,那么就是我偷的。”
现已査明,其中只有一个说了假话,你能找出谁是窃贼,又是谁说了假话吗?
逻辑思考
将甲、乙、丙、丁说的话,转成数字与程序,借助计算机的算力帮我们找出窃贼,揪出说谎者。
假设窃贼是x(一个变量),将甲、乙、丙、丁分别对应数字1、2、3、4。
●如果x等于1,那么窃贼就是甲。
●如果x等于2,那么窃贼就是乙。
●如果x等于3,那么窃贼就是丙。
●如果x等于4,那么窃贼就是丁。
现在我们在将他们说的话用程序语言表达一番:
(1)甲说:“是丙偷的。”如果甲是真话那么丙是窃贼,用程序表达为x==3。

(2)乙说:“我没偷。”如果乙说的是真话,那么乙不是窃贼,可以表达为x!=2。
(3)丙说:“我也没偷。”如果丙说的是真话,那么可以表达为x!=3。
(4)丁说:“如果乙没偷,那么就是我偷的。”这是什么意思呢?直接用程序表达有点难了。这句话其实表示窃贼不是乙就是丁,程序表达为x==2||x==4,窃贼是乙或者是丁。
到这里程序完成了一半,继续分析。
其中只有一个说了假话。

这些表达式中只有一个为false,其他为true,而true用数字1表示,false用数字是0表示。
只有一个false,那么这几个表达式相加的结果应该等于3:(x==3)+(x!=2)+(x!=3)+(x==2||x==4)==3。
而窃贼只有一个,将x从1到4逐一测试,只要满足只有一人说假话的条件,就能找到窃贼。
谁是窃贼
(1)for(int x=1;x<=4;x++){}:将甲、乙、丙、丁的数字代号逐一测试。
(2)(x==3)+(x!=2)+(x!=3)+(x==2||x==4)==3:将满足3句真话1句假话的情况下的x找出来。
(3)通过switch case输出窃贼。
(4)再将4句话进行逐一判断,找出不为真的那个人,就是说假话的那个人。

运行程序:
丁是窃贼。
甲说的是假话。


巩固练习
(1)以下程序运行后的结果是?()

A.100
B.011
C.211
D.001
(2)阅读下面的程序,填写输出结果。

输入:6
输出:_____________________________
输入:4
输出:____________________________
(3)烧脑继续:家里有4个孩子,分别是甲、乙、丙和丁。一天放学回来,餐桌上的糖果少了几颗,妈妈问是谁偷吃了糖果。
四个孩子各有说辞:
甲说:“我们中有人偷吃了糖果。”
乙说:“我们四个都没有偷吃糖果。”
丙说:“乙和丁至少有一人没有偷吃糖果。”
丁说:“我没有偷吃糖果。”
如果4个孩子中有两个说的是真话,有两个说的是假话,则说真话的是()。
A.说真话的是甲和丙
B.说真话的是甲和丁
C.说真话的是乙和丙
D.说真话的是乙和丁
再想想到底是谁偷吃了糖果,有多种可能吗?