资源描述
1将实际问题抽象为逻辑关系将实际问题抽象为逻辑关系枚举法解题思路枚举法解题思路关系与关系表达式关系与关系表达式程序的循环结构与分支结构程序的循环结构与分支结构学学 习习 目目 标标21.1.关系运算符与关系表达式关系运算符与关系表达式2.2.人的思维到用计算机语言的表示人的思维到用计算机语言的表示3.3.枚举的概念与思路枚举的概念与思路4.4.循环结构循环结构5.5.分支结构分支结构内内 容容 要要 点点3 计算机强大的逻辑分析功能是由人通过计算机强大的逻辑分析功能是由人通过程序赋给它的。一些逻辑问题必须转换成程序赋给它的。一些逻辑问题必须转换成计算机能够看得懂的数学表达式和一定的计算机能够看得懂的数学表达式和一定的程序指令。这一章我们通过例子来介绍如程序指令。这一章我们通过例子来介绍如何将人对问题的思考转换为让计算机能解何将人对问题的思考转换为让计算机能解的数学表达式,同时给出一些通常要用到的数学表达式,同时给出一些通常要用到的程序结构和的程序结构和C/C+语句。语句。4清华附中有四位同学中的一位做了好事,不留清华附中有四位同学中的一位做了好事,不留清华附中有四位同学中的一位做了好事,不留清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的名,表扬信来了之后,校长问这四位是谁做的名,表扬信来了之后,校长问这四位是谁做的名,表扬信来了之后,校长问这四位是谁做的好事。好事。好事。好事。A A A A说:不是我。说:不是我。说:不是我。说:不是我。B B B B说:是说:是说:是说:是C C C C。C C C C说:是说:是说:是说:是D D D D。D D D D说:他胡说说:他胡说说:他胡说说:他胡说。已知三个人说的是真话,一个人说的是假话。已知三个人说的是真话,一个人说的是假话。已知三个人说的是真话,一个人说的是假话。已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。现在要根据这些信息,找出做了好事的人。现在要根据这些信息,找出做了好事的人。现在要根据这些信息,找出做了好事的人。【例例1 1】“谁做的好事谁做的好事”5 为了解这道题,我们需要学习如为了解这道题,我们需要学习如何通过何通过逻辑思维与判断逻辑思维与判断解这类问题的解这类问题的思路。思路。6 将四个人说的四句话写成关系表达式。将四个人说的四句话写成关系表达式。将四个人说的四句话写成关系表达式。将四个人说的四句话写成关系表达式。在声明变量时,我们让在声明变量时,我们让在声明变量时,我们让在声明变量时,我们让thismanthisman表示要寻找的做表示要寻找的做表示要寻找的做表示要寻找的做了好事的人,定义它是字符变量。了好事的人,定义它是字符变量。了好事的人,定义它是字符变量。了好事的人,定义它是字符变量。char thisman=;/char thisman=;/定义字符变量并将其初始化为空定义字符变量并将其初始化为空定义字符变量并将其初始化为空定义字符变量并将其初始化为空 让让让让 “=”=”的含义为的含义为的含义为的含义为“是是是是”,让让让让“!=”!=”的含义为的含义为的含义为的含义为“不是不是不是不是”。7利用关系表达式将四个人所说的话表示成利用关系表达式将四个人所说的话表示成说话人说话人说话人说话人说的话说的话说的话说的话写成关系表达式写成关系表达式写成关系表达式写成关系表达式A A“不是我不是我不是我不是我”thisman!=Athisman!=AB B“是是是是C”C”thisman=Cthisman=CC C“是是是是D”D”thisman=Dthisman=DD D“他胡说他胡说他胡说他胡说”thisman!=Dthisman!=D8 A A、B B、C C、D D四个人,只有一位是做好事者。令四个人,只有一位是做好事者。令四个人,只有一位是做好事者。令四个人,只有一位是做好事者。令做好事者为做好事者为做好事者为做好事者为1 1,未做好事者为,未做好事者为,未做好事者为,未做好事者为0 0,可以有如下,可以有如下,可以有如下,可以有如下4 4中状态中状态中状态中状态(情况)(情况)(情况)(情况)枚举法的思路枚举法的思路状态状态ABCD110002010030010400019这四种状态可简化写成这四种状态可简化写成状态状态状态状态赋值表达式赋值表达式赋值表达式赋值表达式1 1thisman=Athisman=A2 2thisman=Bthisman=B3 3thisman=Cthisman=C4 4thisman=Dthisman=D 显然第一种状态是假定显然第一种状态是假定显然第一种状态是假定显然第一种状态是假定A A是做好事者,第二种状态是做好事者,第二种状态是做好事者,第二种状态是做好事者,第二种状态是假定是假定是假定是假定B B是做好事者,是做好事者,是做好事者,是做好事者,。所谓。所谓。所谓。所谓枚举枚举枚举枚举是按照这四种假定是按照这四种假定是按照这四种假定是按照这四种假定逐一地去测试四个人的话有几句是真话,如果不满足逐一地去测试四个人的话有几句是真话,如果不满足逐一地去测试四个人的话有几句是真话,如果不满足逐一地去测试四个人的话有几句是真话,如果不满足三句为真,就否定掉这一假定,换下一个状态再试。三句为真,就否定掉这一假定,换下一个状态再试。三句为真,就否定掉这一假定,换下一个状态再试。三句为真,就否定掉这一假定,换下一个状态再试。具体做法如下:具体做法如下:具体做法如下:具体做法如下:10(1)假定让)假定让thisman=A代入四句话中代入四句话中状态状态说的话说的话关系表达式关系表达式CAthisman!=A;A!=A0Bthisman=C;A=C0Cthisman=D;A=D0Dthisman!=D;A!=D1四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为1 1,显然不是,显然不是,显然不是,显然不是AA做的好事做的好事做的好事做的好事11(2)假定让)假定让thisman=B代入四句话中代入四句话中状态状态说的话说的话关系表达式关系表达式CAthisman!=A;B!=A1Bthisman=C;B=C0Cthisman=D;B=D0Dthisman!=D;B!=D1四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为2 2,显然不是,显然不是,显然不是,显然不是BB做的好事做的好事做的好事做的好事12(3)假定让)假定让thisman=C代入四句话中代入四句话中状态状态说的话说的话关系表达式关系表达式CAthisman!=A;C!=A1Bthisman=C;C=C1Cthisman=D;C=D0Dthisman!=D;C!=D1四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为3 3,就是,就是,就是,就是CC做的好事做的好事做的好事做的好事13 综上所述一个人一个人去试,就是综上所述一个人一个人去试,就是综上所述一个人一个人去试,就是综上所述一个人一个人去试,就是枚举枚举枚举枚举。从编。从编。从编。从编写程序看,实现枚举最好用写程序看,实现枚举最好用写程序看,实现枚举最好用写程序看,实现枚举最好用循环结构循环结构循环结构循环结构。这部分的程序写出如下:这部分的程序写出如下:这部分的程序写出如下:这部分的程序写出如下:for(k=1;k=4;k=k+1)/计数型循环,循环的控制变量为计数型循环,循环的控制变量为kthisman=64+k;/产生被试者,依次产生被试者,依次为为A,B,C,Dsum=(thisman!=A)/测试测试A的话是否为真的话是否为真 +(thisman=C)/测试测试B的话是否为真的话是否为真 +(thisman=D)/测试测试C的话是否为真的话是否为真 +(thisman!=D);/测试测试D的话是否为真的话是否为真14NSNS图图有了上述了解之后,我们来看解有了上述了解之后,我们来看解“谁做的好事谁做的好事”的程序框图的程序框图图图图图 4.74.715#include /#include /预编译命令预编译命令预编译命令预编译命令 using namespace std;using namespace std;int main()int main()/主函数主函数主函数主函数 /主函数开始主函数开始主函数开始主函数开始int k=0,sum=0,g=0;/int k=0,sum=0,g=0;/定义整型变量,均初始化为定义整型变量,均初始化为定义整型变量,均初始化为定义整型变量,均初始化为0 0char thisman=char thisman=;/;/定义字符变量,初始化为空定义字符变量,初始化为空定义字符变量,初始化为空定义字符变量,初始化为空for(k=1;k=4;k=k+1)/kfor(k=1;k=4;k=k+1)/k是循环控制变量是循环控制变量是循环控制变量是循环控制变量 /for /for 循环体开始循环体开始循环体开始循环体开始thisman=64+k;thisman=64+k;sum=(thisman!=A)+(thisman=C)sum=(thisman!=A)+(thisman=C)+(thisman=D)+(thisman!=D);+(thisman=D)+(thisman!=D);if(sum=3)if(sum=3)/如果如果如果如果3 3句话为真,则输出该人句话为真,则输出该人句话为真,则输出该人句话为真,则输出该人 cout cout 做好事者为做好事者为做好事者为做好事者为 char(64+k)endl;char(64+k)endl;g=1;g=1;/有解标志置有解标志置有解标志置有解标志置1 1 /for /for 循环体结束循环体结束循环体结束循环体结束if(g!=1)if(g!=1)cout cout Cant found!Cant found!endl;/endl;/输出无解信息输出无解信息输出无解信息输出无解信息 return 0;return 0;/主函数结束主函数结束主函数结束主函数结束16#include /#include /预编译命令预编译命令预编译命令预编译命令using namespace std;using namespace std;void main()void main()int k=0,sum=0,g=0;char thisman=;int k=0,sum=0,g=0;char thisman=;for(k=1;k=4;k=k+1)for(k=1;k=4;k=k+1)thisman=64+k;thisman=64+k;sum=(thisman!=A)+(thisman=D)sum=(thisman!=A)+(thisman=D)+(thisman=C)+(thisman!=D);+(thisman=C)+(thisman!=D);if (if (sum=3sum=3)cout cout 做好事者为做好事者为做好事者为做好事者为 char(64+k)endl;char(64+k)endl;g=1;g=1;if(g!=1)if(g!=1)cout Cant found!endl;cout Cant found!endl;17n n换个思路换个思路 数字数字数字数字 1 1 表示表示表示表示 A A 数字数字数字数字 2 2 表示表示表示表示 B B 数字数字数字数字 3 3 表示表示表示表示 C C 数字数字数字数字 4 4 表示表示表示表示 D D 让让让让 K K 表示要找的人,表示要找的人,表示要找的人,表示要找的人,KK从从从从1 1到到到到4 4,表示从,表示从,表示从,表示从A A 找到找到找到找到D D,这时,这时,这时,这时 A A说:不是我说:不是我说:不是我说:不是我;可形式化为可形式化为可形式化为可形式化为 K!=1;K!=1;B B说:是说:是说:是说:是C;C;可形式化为可形式化为可形式化为可形式化为 K=3;K=3;C C说:是说:是说:是说:是D;D;可形式化为可形式化为可形式化为可形式化为 K=4;K=4;D D说:他胡说;说:他胡说;说:他胡说;说:他胡说;可形式化为可形式化为可形式化为可形式化为 K!=4;K!=4;18#include#include /预编译命令预编译命令预编译命令预编译命令using namespace std;using namespace std;void main()void main()/主函数主函数主函数主函数 /主函数开始主函数开始主函数开始主函数开始int k=0,sum=0,g=0;int k=0,sum=0,g=0;/声明变量为整数类型,且均初始化为声明变量为整数类型,且均初始化为声明变量为整数类型,且均初始化为声明变量为整数类型,且均初始化为0 0for(k=1;k=4;k=k+1)for(k=1;k=4;k=k+1)/循环从循环从循环从循环从k k为为为为1 1到到到到4 4,sum=0;sum=0;/循环体内的初始化,用循环体内的初始化,用循环体内的初始化,用循环体内的初始化,用sumsum累计真话数累计真话数累计真话数累计真话数if(k!=1)sum=sum+1;/if(k!=1)sum=sum+1;/如如如如A A的话为真,则让的话为真,则让的话为真,则让的话为真,则让sumsum加加加加1 1;if(k=3)sum=sum+1;/if(k=3)sum=sum+1;/如如如如B B的话为真,则让的话为真,则让的话为真,则让的话为真,则让sumsum加加加加1 1;if(k=4)sum=sum+1;/if(k=4)sum=sum+1;/如如如如C C的话为真,则让的话为真,则让的话为真,则让的话为真,则让sumsum加加加加1 1;if(k!=4)sum=sum+1;/if(k!=4)sum=sum+1;/如如如如D D的话为真,则让的话为真,则让的话为真,则让的话为真,则让sumsum加加加加1 1;if(sum=3)if(sum=3)/若有三句话为真,则做下列两件事若有三句话为真,则做下列两件事若有三句话为真,则做下列两件事若有三句话为真,则做下列两件事 cout This man is char(64+k)cout This man is char(64+k)endl;endl;/输出做好事者输出做好事者输出做好事者输出做好事者g=1;g=1;/让有解标志置让有解标志置让有解标志置让有解标志置1 1 if(g!=1)if(g!=1)/则输出无解信息则输出无解信息则输出无解信息则输出无解信息 cout Cant found!endl;cout Cant found!endl;19for(k=1;k=4;k=k+1)sum=0;if(k!=1)sum=sum+1;/如如A的话为真,的话为真,则让则让sum加加1;if(k=3)sum=sum+1;/如如B的话为真,则让的话为真,则让sum加加1;if(k=4)sum=sum+1;/如如C的话为真,则让的话为真,则让sum加加1;if(k!=4)sum=sum+1;/如如D的话为真,则让的话为真,则让sum加加1;.20#include /#include /预编译命令预编译命令预编译命令预编译命令int main()int main()/主函数主函数主函数主函数 /主函数开始主函数开始主函数开始主函数开始int k=0,g=0;int k=0,g=0;/声明变量为整数类型,且均初始化为声明变量为整数类型,且均初始化为声明变量为整数类型,且均初始化为声明变量为整数类型,且均初始化为0 0for(k=1;k=4;k=k+1)/kfor(k=1;k=4;k=k+1)/k既是循环控制变量,也表示第既是循环控制变量,也表示第既是循环控制变量,也表示第既是循环控制变量,也表示第k k个人个人个人个人 if(k!=1)+(k=3)+(k=4)+(k!=4)=3)/如果如果如果如果4 4句话有句话有句话有句话有3 3句话为真,则输出该人句话为真,则输出该人句话为真,则输出该人句话为真,则输出该人 cout cout 做好事者为做好事者为做好事者为做好事者为 char(64+k)endl;char(64+k)endl;g=1;g=1;/有解标志置有解标志置有解标志置有解标志置1 1 if(g!=1)if(g!=1)/g!=1 /g!=1则输出无解信息则输出无解信息则输出无解信息则输出无解信息 cout Cant found!endl;cout Cant found!endl;return 0;return 0;/主函数结束主函数结束主函数结束主函数结束上述程序可以简化为:上述程序可以简化为:上述程序可以简化为:上述程序可以简化为:21for(k=1;k=4;k=k+1)if(k!=1)+(k=3)+(k=4)+(k!=4)=3)cout 做好事者为做好事者为 char(64+k)endl;g=1;A说说 B说说 C说说 D说说22 for(k=1;k=4;k=k+1)for(k=1;k=4;k=k+1)if(if(k!=1)(k!=1)+(k=3)(k=3)+/+/如果如果如果如果4 4句话有句话有句话有句话有3 3句真话,就句真话,就句真话,就句真话,就 (k=4)(k=4)+/+/输出做好事者输出做好事者输出做好事者输出做好事者 (k!=4)(k!=4)=3)=3)cout“cout“做好事者为做好事者为做好事者为做好事者为”char(64+k)endl;char(64+k)=65;k=k-1)for(int k=68;k=65;k=k-1)if(if(k!=65)(k!=65)+(k=67)(k=67)+/+/如果如果如果如果4 4句话有句话有句话有句话有3 3句真话,句真话,句真话,句真话,(k=68)(k=68)+/+/就输出做好事者就输出做好事者就输出做好事者就输出做好事者 (k!=68)(k!=68)=3)=3)cout“cout“做好事者为做好事者为做好事者为做好事者为”char(k)endl;char(k)endl;g=1;g=1;24某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:A A、B B 至少有一人作案;至少有一人作案;至少有一人作案;至少有一人作案;A A、E E、F F 三人中至少有两人参与作案;三人中至少有两人参与作案;三人中至少有两人参与作案;三人中至少有两人参与作案;A A、D D 不可能是同案犯;不可能是同案犯;不可能是同案犯;不可能是同案犯;B B、C C 或同时作案,或与本案无关;或同时作案,或与本案无关;或同时作案,或与本案无关;或同时作案,或与本案无关;C C、D D 中有且仅有一人作案;中有且仅有一人作案;中有且仅有一人作案;中有且仅有一人作案;如果如果如果如果 D D 没有参与作案,则没有参与作案,则没有参与作案,则没有参与作案,则 E E 也不可能参与作案。也不可能参与作案。也不可能参与作案。也不可能参与作案。试编一程序,将作案人找出来。试编一程序,将作案人找出来。试编一程序,将作案人找出来。试编一程序,将作案人找出来。例例225思路:思路:1、案情分析:、案情分析:将案情的每一条写成逻辑表达式,将案情的每一条写成逻辑表达式,将案情的每一条写成逻辑表达式,将案情的每一条写成逻辑表达式,第一条用第一条用第一条用第一条用 CC1CC1 表示,表示,表示,表示,第二条用第二条用第二条用第二条用 CC2CC2 表示,表示,表示,表示,26CC1:A和和B至少有一人作案至少有一人作案令令 A 变量表示变量表示 A 作案,作案,B 变量表示变量表示 B 作案作案显然这是或的关系,有显然这是或的关系,有显然这是或的关系,有显然这是或的关系,有CC1=(A|B)27CC2:A和和D不可能是同案犯不可能是同案犯可以分析为:可以分析为:A 和和D是同案犯,写成是同案犯,写成 A&DA 和和 D 不是同案犯,写成不是同案犯,写成 !(A&D)因此有因此有 CC2=!(A&D)28CC3CC3:A A、E E、F F 中至少有两人涉嫌作案中至少有两人涉嫌作案中至少有两人涉嫌作案中至少有两人涉嫌作案分析有三种可能分析有三种可能分析有三种可能分析有三种可能第一种,第一种,第一种,第一种,A A 和和和和 E E 作案,(作案,(作案,(作案,(A&EA&E)第二种,第二种,第二种,第二种,A A 和和和和 F F 作案,(作案,(作案,(作案,(A&FA&F)第三种,第三种,第三种,第三种,E E 和和和和 F F 作案,(作案,(作案,(作案,(E&FE&F)这三种可能性是这三种可能性是这三种可能性是这三种可能性是 或或或或 的关系,因此有的关系,因此有的关系,因此有的关系,因此有CC3=(A&ECC3=(A&E)|(A&FA&F)|(E&F)E&F)29CC4CC4:B B和和和和C C或同时作案,或都与本案无关或同时作案,或都与本案无关或同时作案,或都与本案无关或同时作案,或都与本案无关第一种情况:同时作案(第一种情况:同时作案(第一种情况:同时作案(第一种情况:同时作案(B&CB&C)第二种情况:都与本案无关(第二种情况:都与本案无关(第二种情况:都与本案无关(第二种情况:都与本案无关(!B&!C!B&!C)两者为两者为两者为两者为或或或或的关系,因此有的关系,因此有的关系,因此有的关系,因此有 CC4=(B&C)|(!B&!C)CC4=(B&C)|(!B&!C)30CC5CC5:C C、D D中有且仅有一人作案中有且仅有一人作案中有且仅有一人作案中有且仅有一人作案CC5=(C&!D)|(D&!C)31CC6CC6:如果如果如果如果D D没有参与作案,则没有参与作案,则没有参与作案,则没有参与作案,则E E也不可能参与作案。也不可能参与作案。也不可能参与作案。也不可能参与作案。分析这一条比较麻烦一些,可以列出真值表再归纳分析这一条比较麻烦一些,可以列出真值表再归纳分析这一条比较麻烦一些,可以列出真值表再归纳分析这一条比较麻烦一些,可以列出真值表再归纳D DE E!E!ECC6CC6含含含含 义义义义1 11 10 01 1D D作案,作案,作案,作案,E E也作案也作案也作案也作案可能可能可能可能1 10 01 11 1D D作案,作案,作案,作案,E E不作案不作案不作案不作案可能可能可能可能0 00 01 11 1D D不作案,不作案,不作案,不作案,E E也不可能作案也不可能作案也不可能作案也不可能作案可能可能可能可能0 01 10 00 0D D不作案,不作案,不作案,不作案,E E却作案却作案却作案却作案不可能不可能不可能不可能32CC6=D|!E1 10 01 11 1以上是案情分析,已经化成了计算机可解的逻辑表达式以上是案情分析,已经化成了计算机可解的逻辑表达式33 6 6个人每个人都有个人每个人都有个人每个人都有个人每个人都有作案作案作案作案或或或或不作案不作案不作案不作案两种可能,因此两种可能,因此两种可能,因此两种可能,因此有有有有 种组合,从这些组合中挑出符合种组合,从这些组合中挑出符合种组合,从这些组合中挑出符合种组合,从这些组合中挑出符合6 6条分析的作条分析的作条分析的作条分析的作案者。案者。案者。案者。定义定义定义定义 6 6 个整数变量,分别表示个整数变量,分别表示个整数变量,分别表示个整数变量,分别表示 6 6 个人个人个人个人A A,B B,C C,D D,E E,F F。枚举每个人的可能性枚举每个人的可能性枚举每个人的可能性枚举每个人的可能性让让让让 0 0 表示不是罪犯;表示不是罪犯;表示不是罪犯;表示不是罪犯;让让让让 1 1 表示就是罪犯。表示就是罪犯。表示就是罪犯。表示就是罪犯。2、采取枚举方法,枚举什么呢?枚举组合、采取枚举方法,枚举什么呢?枚举组合34n n为了讲多重循环先做些铺垫为了讲多重循环先做些铺垫n n编一个程序输出编一个程序输出n n 000000n n 000001n n 000010n n .n n 111111n n从高位到低位,分别用从高位到低位,分别用ABCDEF来表示来表示35ABCDEF00000000000100001011111136 写一个从写一个从000000到到111111的程序的程序for(A=0;A=1;A=A+1)for(B=0;B=1;B=B+1)for(C=0;C=1;C=C+1)for(D=0;D=1;D=D+1)for(E=0;E=1;E=E+1)for(F=0;F=1;F=F+1)coutABCDEF endl;37n n作业作业 请你完成输出请你完成输出000000到到111111的程序的程序 并上机运行并上机运行 下面是据案情分析采用枚举法寻找罪下面是据案情分析采用枚举法寻找罪犯的程序框图犯的程序框图3839为了给出每个人是否为罪犯的信息,程序中定义为了给出每个人是否为罪犯的信息,程序中定义了一个了一个二维数组二维数组。char info29=“不是罪犯不是罪犯”,“是罪犯是罪犯”;有两个字串每串最多有91个英文字符是是罪罪犯犯00不不是是罪罪犯犯000 01 12 23 34 45 56 67 78 8info为数组名1 10 040char 是说,是说,info 数组的元素为字符,数组的元素为字符,2为下标,表为下标,表示有两个字符串,每个字符串最多有示有两个字符串,每个字符串最多有91个字符。个字符。因为英文字符占一个字节,而汉字占两个字节,故因为英文字符占一个字节,而汉字占两个字节,故 4个汉字要占个汉字要占 8 个英文字符的地方。个英文字符的地方。每一字串后面自动跟一个空字符每一字串后面自动跟一个空字符0因此可以看出:因此可以看出:第第 0 号字符串号字符串 info0 的内容为的内容为“不是罪犯不是罪犯”。第第 1 号字符串号字符串 info1 的内容为的内容为“是罪犯是罪犯”。41在输出时用在输出时用cout“A:”infoA endl;如果如果A为为0,则输出,则输出 A:不是罪犯不是罪犯如果如果A为为1,则输出,则输出 A:是罪犯是罪犯42#include#include using namespace std;using namespace std;int main(void)/int main(void)/案情分析案情分析案情分析案情分析 /A /A和和和和B B至少有一人作案;至少有一人作案;至少有一人作案;至少有一人作案;cc1=A|Bcc1=A|B /A /A和和和和D D不可能是同案犯;不可能是同案犯;不可能是同案犯;不可能是同案犯;cc2=!(A&D)cc2=!(A&D)/A /A,E E,F F中至少有两人涉嫌作案中至少有两人涉嫌作案中至少有两人涉嫌作案中至少有两人涉嫌作案 cc3=(A&E)|cc3=(A&E)|/(A&F)|(A&F)|/(E&F)(E&F)/B /B和和和和C C或同时作案或都与本案无关或同时作案或都与本案无关或同时作案或都与本案无关或同时作案或都与本案无关 cc4=(B&C)|(!B&!C)cc4=(B&C)|(!B&!C)/C /C,D D中有且仅有一人作案;中有且仅有一人作案;中有且仅有一人作案;中有且仅有一人作案;cc5=(C&!D)|(D&!C)cc5=(C&!D)|(D&!C)/如果如果如果如果D D没有参与作案没有参与作案没有参与作案没有参与作案,则则则则E E也不可能参与作案也不可能参与作案也不可能参与作案也不可能参与作案;cc6=D|(!E);cc6=D|(!E)/编程找出犯罪嫌疑人编程找出犯罪嫌疑人编程找出犯罪嫌疑人编程找出犯罪嫌疑人.int cc1,cc2,cc3,cc4,cc5,cc6;/int cc1,cc2,cc3,cc4,cc5,cc6;/定义定义定义定义6 6个变量个变量个变量个变量,分别表示分别表示分别表示分别表示6 6句话句话句话句话 int A,B,C,D,E,F;/int A,B,C,D,E,F;/定义定义定义定义6 6个变量个变量个变量个变量,分别表示分别表示分别表示分别表示6 6个人个人个人个人 char info29=char info29=不是罪犯不是罪犯不是罪犯不是罪犯,是罪犯是罪犯是罪犯是罪犯;/;/定义二维数组定义二维数组定义二维数组定义二维数组,给出是给出是给出是给出是否罪犯信息否罪犯信息否罪犯信息否罪犯信息 43 for(A=0;A=1;A=A+1)/枚举枚举A for(B=0;B=1;B=B+1)/枚举枚举B for(C=0;C=1;C=C+1)/枚举枚举C for(D=0;D=1;D=D+1)/枚举枚举D for(E=0;E=1;E=E+1)/枚举枚举E for(F=0;F=1;F=F+1)/枚举枚举F cc1=A|B;cc2=!(A&D);cc3=(A&E)|(A&F)|(E&F);cc4=(B&C)|(!B&!C);cc5=(C&!D)|(D&!C);cc6=D|(!E);44 /测试测试测试测试6 6句话都为真时句话都为真时句话都为真时句话都为真时,才输出谁是罪犯才输出谁是罪犯才输出谁是罪犯才输出谁是罪犯 if(cc1+cc2+cc3+cc4+cc5+cc6=6)/输出判断结果输出判断结果输出判断结果输出判断结果 cout A:cout A:infoAinfoA endl;endl;cout B:cout B:infoBinfoB endl;endl;cout C:cout C:infoCinfoC endl;endl;cout D:cout D:infoDinfoD endl;endl;cout E:cout E:infoEinfoE endl;endl;cout F:cout F:infoFinfoF endl;endl;/输出结束输出结束输出结束输出结束 /循环结束循环结束循环结束循环结束 return 0;return 0;/主函数体结束主函数体结束主函数体结束主函数体结束45讨讨 论论46大家参与讨论的题大家参与讨论的题大家参与讨论的题大家参与讨论的题五位跳水高手将参加十米高台跳水决赛,有好事五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力预测比赛结果。者让五个人据实力预测比赛结果。A选手说:选手说:B第二,我第三;第二,我第三;B选手说:我第二,选手说:我第二,E第四;第四;C选手说:我第一,选手说:我第一,D第二;第二;D选手说:选手说:C最后,我第三;最后,我第三;E选手说:我第四,选手说:我第四,A第一第一;决赛成绩公布之后,每位选手的预测都只说对了决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请编程解出比赛的实际名次。一半,即一对一错,请编程解出比赛的实际名次。47思路:思路:思路:思路:1、首先是将五个人的预测写成逻辑表达式:、首先是将五个人的预测写成逻辑表达式:让关系运算符让关系运算符“=”的含义是的含义是“是是”。让数字让数字 1、2、3、4、5 分别表示分别表示名次名次第一、第二,第一、第二,第五,第五。让整型变量让整型变量 A、B、C、D、E 分别表示每个选手所得分别表示每个选手所得名次。名次。A选手说:选手说:B=2,A=3;B选手说:选手说:B=2,E=4;C选手说:选手说:C=1,D=2;D选手说:选手说:C=5,D=3;E选手说:选手说:E=4,A=1;482、考虑到每个人说的话是一对一错,、考虑到每个人说的话是一对一错,即一真一假,比如即一真一假,比如A说的说的 (B=2)+(A=3)应该是应该是 1 1 +0 =1 0 +1 =1 49我们可以归纳出要同时满足五个人所说的话都符我们可以归纳出要同时满足五个人所说的话都符合合一半对一半错的条件一半对一半错的条件是是 ta=(B=2)+(A=3)=1;符合符合A选手的话选手的话tb=(B=2)+(E=4)=1;符合符合B选手的话选手的话tc=(C=1)+(D=2)=1;符合符合C选手的话选手的话td=(C=5)+(D=3)=1;符合符合D选手的话选手的话te=(E=4)+(A=1)=1;符合符合E选手的话选手的话因为因为ta,tb,te非非1即即0,五个条件值都加在一起,五个条件值都加在一起50 ta ta 的取值是的取值是的取值是的取值是 0 0 或或或或 1 1 ta ta 的取值取决于下列关系的取值取决于下列关系的取值取决于下列关系的取值取决于下列关系 (B=2)+(A=3)=1 B=2-可能是可能是 0 或或 1 A=3-可能是可能是 0 或或 1(B=2)+(A=3)-可能是可能是 0 或或 1 或或 2 只有上式为只有上式为 1 才能使才能使 ta 为为 1 513、只有等于、只有等于5 时才都符合每个人所说的话,这仅只时才都符合每个人所说的话,这仅只是符合题意的一个必要条件,同时还得考虑是符合题意的一个必要条件,同时还得考虑 A、B、C、D、E 的取值不得有相同者的取值不得有相同者可以考虑可以考虑是一个条件是一个条件524、仍然可以用枚举的方法,让变量、仍然可以用枚举的方法,让变量A、B、C、D、E 在在 15 中取值,形成满足上述条件的中取值,形成满足上述条件的 AE 的组合,即是所求。这时可用循环结构,的组合,即是所求。这时可用循环结构,如下所示如下所示5354作业:作业:1 1 请你自己完成这个程序;请你自己完成这个程序;2 2 思考如何提高效率?思考如何提高效率?3 3 思考还有什么其它解法?思考还有什么其它解法?55结结 束束
展开阅读全文