资源预览内容
第1页 / 共56页
第2页 / 共56页
第3页 / 共56页
第4页 / 共56页
第5页 / 共56页
第6页 / 共56页
第7页 / 共56页
第8页 / 共56页
第9页 / 共56页
第10页 / 共56页
亲,该文档总共56页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第 三三 章章 逻辑思维与计算机解题逻辑思维与计算机解题(续)(续)例例 3-3 求求10!/*/*/* /* 程序名:程序名:程序名:程序名:3_3.cpp3_3.cpp(循环语句示例)(循环语句示例)(循环语句示例)(循环语句示例) * */* /* 作作作作 者:者:者:者:wuwh *wuwh */* /* 编制时间:编制时间:编制时间:编制时间:20022002年年年年9 9月月月月2020日日日日 * */* /* 主要功能:计算主要功能:计算主要功能:计算主要功能:计算10 10 的阶乘的阶乘的阶乘的阶乘 * */*/*#include / #include / 预编译命令预编译命令预编译命令预编译命令void main() / void main() / 主函数主函数主函数主函数 / / 主函数开始主函数开始主函数开始主函数开始int i = 0, j = 0, k = 0; / int i = 0, j = 0, k = 0; / 声明声明声明声明 i,j,k i,j,k 为整型变量,并初始化为为整型变量,并初始化为为整型变量,并初始化为为整型变量,并初始化为0 0long sum = 1; / long sum = 1; / 声明声明声明声明 sum sum 为长整型变量,并初始化为为长整型变量,并初始化为为长整型变量,并初始化为为长整型变量,并初始化为1 1for (i = 10; i = 1; i = i-1) / for (i = 10; i = 1; i = i-1) / 用用用用 for for 循环作累乘运算循环作累乘运算循环作累乘运算循环作累乘运算 cout i= i ;cout i= i ; / / 显示显示显示显示i isum = sum * i; sum = sum * i; / / 每一步乘积每一步乘积每一步乘积每一步乘积cout tsum= sum endl; / cout tsum= sum endl; / 显示每一步乘积显示每一步乘积显示每一步乘积显示每一步乘积for (j = 1; j = 5500; j = j+1) / for (j = 1; j = 5500; j = j+1) / 用用用用 for for 循环延迟时间循环延迟时间循环延迟时间循环延迟时间for (k = 1; k = 10000; k = k+1);/for (k = 1; k = 10000; k = k+1);/用用用用 for for 循环延迟时间循环延迟时间循环延迟时间循环延迟时间 cout 10!= sum endl; cout 10!= sum =1;i=1;表达式表达式表达式表达式3 3 为为为为 i=i-1;i=i-1;6for循环的循环的NS图图为了以后讲解的方便,有必要使用更为简为了以后讲解的方便,有必要使用更为简便的便的N-S结构流程图,如图结构流程图,如图3.3for (i=1; i=100; i=i+1)循环体循环体图图图图3.33.37if (sum = 3)if (sum = 3) cout This man is char(64+k) endl;cout This man is char(64+k) endl;g=1;g=1; 这一段程序可以读作:如果这一段程序可以读作:如果这一段程序可以读作:如果这一段程序可以读作:如果sumsum真的为真的为真的为真的为 3 3 时,做下面时,做下面时,做下面时,做下面两件事两件事两件事两件事(1 1)输出做好事的人;)输出做好事的人;)输出做好事的人;)输出做好事的人;(2 2)将本题的有解标志置为)将本题的有解标志置为)将本题的有解标志置为)将本题的有解标志置为 1 1。其中其中其中其中(sum=3)(sum=3)为条件判断语句中的条件,根据其真为条件判断语句中的条件,根据其真为条件判断语句中的条件,根据其真为条件判断语句中的条件,根据其真假使程序分支。假使程序分支。假使程序分支。假使程序分支。例例 3-1 的解要用到的解要用到分支语句分支语句,即需要判断当四句,即需要判断当四句话中有话中有 3 句为真时,我们要将该人判定为做好事者。句为真时,我们要将该人判定为做好事者。请看如下程序段请看如下程序段8下面我们画出分支程序的下面我们画出分支程序的NSNS流程图,流程图,这种图直观清晰,一目了然。这种图直观清晰,一目了然。图图图图3.43.49一般格式一般格式1.if (if (表达式表达式表达式表达式) ) 语句语句语句语句1 1;/ / 语句语句语句语句1 1,只一句,只一句,只一句,只一句如果表达式为真,执行语句如果表达式为真,执行语句如果表达式为真,执行语句如果表达式为真,执行语句1 1;否则什么都不做;否则什么都不做;否则什么都不做;否则什么都不做2.if (if (表达式表达式表达式表达式) ) 语句块语句块语句块语句块1 1; 如果表达式为真,做语句块如果表达式为真,做语句块如果表达式为真,做语句块如果表达式为真,做语句块1 1的内容;否则什么都不做;的内容;否则什么都不做;的内容;否则什么都不做;的内容;否则什么都不做;103.if (表达式表达式) 语句语句1;else 语句语句2;如果表达式为真,执行语句如果表达式为真,执行语句1;否则执行语句;否则执行语句24.if (表达式表达式)语句块语句块1;else语句块语句块2;11举例:实现如图函数举例:实现如图函数图图图图3.53.512/*/*/* /* 程程程程 序序序序 名:名:名:名:3_4.cpp3_4.cpp(分支程序示例)(分支程序示例)(分支程序示例)(分支程序示例) * */* /* 作作作作 者:者:者:者:wuwh *wuwh */* /* 编制时间:编制时间:编制时间:编制时间:20012001年年年年8 8月月月月 * */* /* 主要功能:实现符号函数主要功能:实现符号函数主要功能:实现符号函数主要功能:实现符号函数 * */*/*#include #include / / 预编译命令预编译命令预编译命令预编译命令void main()void main()/ / 主函数主函数主函数主函数 / / 主函数开始主函数开始主函数开始主函数开始int x=0,y=0;int x=0,y=0;/ / 声明声明声明声明x x,y y为整型变量,并初始化为为整型变量,并初始化为为整型变量,并初始化为为整型变量,并初始化为0 0cout cout 请输入请输入请输入请输入x endl; / x x;cin x;/ / 从键盘输入整数送至从键盘输入整数送至从键盘输入整数送至从键盘输入整数送至x x中中中中if (x0)if (x0)/ / 如果如果如果如果x0x0,将,将,将,将1 1赋给赋给赋给赋给y yy=1;y=1;elseelseif (x=0)if (x=0)/ / 如果如果如果如果x=0x=0,将,将,将,将0 0赋给赋给赋给赋给y yy=0;y=0;elseelsey=-1;y=-1;/ / 否则(否则(否则(否则(x0x0),将),将),将),将-1-1赋给赋给赋给赋给y ycout cout 当当当当x= x x= x 时时时时, y=, y= y endl; y endl; / / 输出输出输出输出x x,y y的值的值的值的值 / /主函数结束主函数结束主函数结束主函数结束13NSNS图图图图图图3.63.614NSNS图图有了上述了解之后,我们来看解有了上述了解之后,我们来看解“谁做的好事谁做的好事”的程序框图的程序框图图图图图3.73.715现在我们来分析现在我们来分析“谁做的好事谁做的好事”的的NS流程图。流程图。它是由两大块组成的,如图它是由两大块组成的,如图3.8循环体循环体for(k=1; k=4; k+)语句语句1;1;图图图图3.83.8第一块第一块循环结构循环结构第二块第二块分支结构分支结构16 第一块是第一块是循环结构循环结构,功能是产生被试对,功能是产生被试对象,依次为象,依次为A、B、C、D。并测试四句话有多。并测试四句话有多少句为真,如有少句为真,如有3句为真,则可确定做好事者,句为真,则可确定做好事者,同时置有解标志为同时置有解标志为1。 第二块为第二块为分支结构分支结构,功能是判断是否无,功能是判断是否无解,如为真,则输出无解信息。解,如为真,则输出无解信息。 这是粗看。再往细看,第一块的循环体这是粗看。再往细看,第一块的循环体又由两块组成,如图又由两块组成,如图3.9,中含两条赋值语句中含两条赋值语句中含一条分支语句中含一条分支语句17我们讲这一段是希望你掌握我们讲这一段是希望你掌握NS图,这对今后图,这对今后的学习会有好处。按照程序框图很容易写出程序的学习会有好处。按照程序框图很容易写出程序(如下页所示)(如下页所示)thisman = 64+k;sum=( thisman!=A )+ ( thisman=C )+ ( thisman=D )+ ( thisman!=D );图图图图3.93.9sum = 3真真假假输出该被测试者;输出该被测试者;有解标志置有解标志置1 1;18/ */ */ * / * 程程程程 序序序序 名:名:名:名:3_5.cpp *3_5.cpp */ * / * 作作作作 者:者:者:者:wuwh *wuwh */ * / * 编制时间:编制时间:编制时间:编制时间:20012001年年年年8 8月月月月 * */ * / * 主要功能:谁做的好事主要功能:谁做的好事主要功能:谁做的好事主要功能:谁做的好事 * */ */ *#include / #include / 预编译命令预编译命令预编译命令预编译命令void main()void 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) for(k=1;k=4;k=k+1) / k / k既是循环控制变量,也表示第既是循环控制变量,也表示第既是循环控制变量,也表示第既是循环控制变量,也表示第k k个人个人个人个人 / for / for 循环体开始循环体开始循环体开始循环体开始thisman = 64+k;thisman = 64+k;sum=( thisman!=A )sum=( thisman!=A ) + ( thisman=C ) + ( thisman=C ) + ( thisman=D ) + ( thisman=D ) + ( thisman!=D ); + ( thisman!=D );if (sum=3)if (sum=3) / / 如果如果如果如果4 4句话有句话有句话有句话有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 Cant found! endl; cout Cant found! endl; / / 主函数结束主函数结束主函数结束主函数结束19/ */ */ * / * 程程程程 序序序序 名:名:名:名:3_6.cpp *3_6.cpp */ * / * 作作作作 者:者:者:者:wuwh *wuwh */ * / * 编制时间:编制时间:编制时间:编制时间:20012001年年年年8 8月月月月 * */ * / * 主要功能:谁做的好事主要功能:谁做的好事主要功能:谁做的好事主要功能:谁做的好事 * */ */ *#include #include / / 预编译命令预编译命令预编译命令预编译命令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;/ / 循环体内的初始化循环体内的初始化循环体内的初始化循环体内的初始化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; / / 主函数结束主函数结束主函数结束主函数结束20/ */ */ * / * 程程程程 序序序序 名:名:名:名:3_7.cpp *3_7.cpp */ * / * 作作作作 者:者:者:者:wuwh *wuwh */ * / * 编制时间:编制时间:编制时间:编制时间:20012001年年年年8 8月月月月 * */ * / * 主要功能:谁做的好事主要功能:谁做的好事主要功能:谁做的好事主要功能:谁做的好事 * */ */ *#include / #include / 预编译命令预编译命令预编译命令预编译命令void main()void 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个人个人个人个人 / for / for 循环体开始循环体开始循环体开始循环体开始if (k!=1)+(k=3)+(k=4)+(k!=4)=3)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 / for / for 循环体结束循环体结束循环体结束循环体结束if (g!=1)if (g!=1) / / 则输出无解信息则输出无解信息则输出无解信息则输出无解信息 cout Cant found! endl; cout Cant found! endl; / / 主函数结束主函数结束主函数结束主函数结束上述程序可以简化为:上述程序可以简化为:上述程序可以简化为:上述程序可以简化为:21第第 四四 章章 逻辑判断与解题思路逻辑判断与解题思路某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析: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也不可能参与作案。也不可能参与作案。也不可能参与作案。也不可能参与作案。试编一程序,将作案人找出来。试编一程序,将作案人找出来。试编一程序,将作案人找出来。试编一程序,将作案人找出来。逻辑表达式逻辑表达式231 1、逻辑与,运算符为、逻辑与,运算符为、逻辑与,运算符为、逻辑与,运算符为 &图图图图4.14.1为了解这道题,我们要研究为了解这道题,我们要研究为了解这道题,我们要研究为了解这道题,我们要研究逻辑运算符逻辑运算符逻辑运算符逻辑运算符与与与与逻辑表达式逻辑表达式逻辑表达式逻辑表达式。如图电路如图电路如图电路如图电路A A 表示开关表示开关表示开关表示开关A A合上;合上;合上;合上;B B 表示开关表示开关表示开关表示开关B B合上;合上;合上;合上;A&B A&B 表示灯亮;表示灯亮;表示灯亮;表示灯亮;241 1 表示真,表示真,0 0 表示假,表示假,这是逻辑变量的取值,非真即假这是逻辑变量的取值,非真即假ABA&B111100010000252 2 2 2、逻辑或,运算符为、逻辑或,运算符为、逻辑或,运算符为、逻辑或,运算符为|图图图图 4.24.2如图电路如图电路如图电路如图电路A A 表示开关表示开关表示开关表示开关A A合上;合上;合上;合上;B B 表示开关表示开关表示开关表示开关B B合上;合上;合上;合上;A|B A|B 表示灯亮;表示灯亮;表示灯亮;表示灯亮;261 1 表示真,表示真,0 0 表示假表示假ABA | B111101011000273、逻辑非,运算符为、逻辑非,运算符为 !两队比赛篮球,变量两队比赛篮球,变量两队比赛篮球,变量两队比赛篮球,变量 A A 表示表示表示表示 A A 队到场,队到场,队到场,队到场,!A !A 表表表表示示示示 A A 队不到场,变量队不到场,变量队不到场,变量队不到场,变量 B B 表示表示表示表示 B B 队到场,队到场,队到场,队到场,!B !B 表示表示表示表示 B B 队不到场。这场球赛能够赛成,得两队都到场。假队不到场。这场球赛能够赛成,得两队都到场。假队不到场。这场球赛能够赛成,得两队都到场。假队不到场。这场球赛能够赛成,得两队都到场。假定定定定 “ “能赛成能赛成能赛成能赛成” ” 用逻辑变量用逻辑变量用逻辑变量用逻辑变量 C C 表示,则表示,则表示,则表示,则C = A & BC = A & B赛不成当然用赛不成当然用赛不成当然用赛不成当然用 !C !C 表示,让表示,让表示,让表示,让 D = !CD = !C,D D 表示赛不成表示赛不成表示赛不成表示赛不成则则则则D=!A | !BD=!A | !B理解为理解为理解为理解为 A A 不到场不到场不到场不到场或或或或 B B 不到场不到场不到场不到场,球赛无法进行。,球赛无法进行。,球赛无法进行。,球赛无法进行。28思路:思路:1、案情分析:、案情分析:将案情的每一条写成逻辑表达式,将案情的每一条写成逻辑表达式,将案情的每一条写成逻辑表达式,将案情的每一条写成逻辑表达式,第一条用第一条用第一条用第一条用 CC1CC1 表示,表示,表示,表示,第二条用第二条用第二条用第二条用 CC2CC2 表示,表示,表示,表示,29CC1CC1:A A和和和和B B至少有一人作案至少有一人作案至少有一人作案至少有一人作案令令令令 A A 变量表示变量表示变量表示变量表示 A A 作案,作案,作案,作案,B B 变量表示变量表示变量表示变量表示 B B 作案作案作案作案A AB BCC1CC10 00 00 01 10 01 10 01 11 11 11 11 1显然这是或的关系,因此有显然这是或的关系,因此有显然这是或的关系,因此有显然这是或的关系,因此有CC1=(A|B)CC1=(A|B)30CC2:A和和D不可能是同案犯不可能是同案犯可以分析为:可以分析为:A如果是案犯,如果是案犯,D一定不是案犯,写成一定不是案犯,写成A & (!D)D如果是案犯,如果是案犯,A一定不是案犯,写成一定不是案犯,写成 D &(!A)A和和D都不是案犯,写成都不是案犯,写成 (!A) & (!D)这三者之间是或的关系,因此有这三者之间是或的关系,因此有CC2 = !(A & D)31CC2 = !(A & D)A AD DA&DA&DCC2CC21 10 00 01 11 11 11 10 00 00 00 01 10 01 10 01 132( A & (!B) ) | ( (!A) & B )( A & (!B) ) | ( (!A) & B )这叫这叫这叫这叫 “ “异或异或异或异或” ” 运算运算运算运算在数字逻辑课中表示为在数字逻辑课中表示为在数字逻辑课中表示为在数字逻辑课中表示为 A A B B B B在计算机中是半加器(二进制)在计算机中是半加器(二进制)在计算机中是半加器(二进制)在计算机中是半加器(二进制)33CC3CC3: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)我们写出我们写出我们写出我们写出 CC3CC3 的真值表。的真值表。的真值表。的真值表。34A AE EF FCC3CC31 11 11 11 11 11 10 01 11 10 01 11 10 01 11 11 10 00 01 10 00 01 10 00 01 10 00 00 00 00 00 00 0CC3 = (A&ECC3 = (A&E)| |(A&FA&F)| |(E&F)E&F)35CC4CC4:B B和和和和C C或同时作案,或都与本案无关或同时作案,或都与本案无关或同时作案,或都与本案无关或同时作案,或都与本案无关第一种情况:同时作案(第一种情况:同时作案(第一种情况:同时作案(第一种情况:同时作案(B & CB & C)第二种情况:都与本案无关(第二种情况:都与本案无关(第二种情况:都与本案无关(第二种情况:都与本案无关(!B & !C!B & !C)两者为两者为两者为两者为或或或或的关系,因此有的关系,因此有的关系,因此有的关系,因此有 CC4=(B & C)|(!B & !C)CC4=(B & C)|(!B & !C)CC5CC5:C C、D D中有且仅有一人作案中有且仅有一人作案中有且仅有一人作案中有且仅有一人作案CC5=(C & !D) | (D & !C)CC5=(C & !D) | (D & !C)B BC C!B!B!C!CB&CB&C!B&!C!B&!CCC5CC51 11 10 00 01 10 01 11 10 00 01 10 00 00 00 01 11 10 00 00 00 00 00 01 11 10 01 11 136CC6CC6:如果如果如果如果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却作案却作案却作案却作案不可能不可能不可能不可能37CC6=D | !E1 10 01 11 1以上是案情分析,已经化成了计算机可解的逻辑表达式以上是案情分析,已经化成了计算机可解的逻辑表达式38 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、采取枚举方法,枚举什么呢?枚举组合、采取枚举方法,枚举什么呢?枚举组合39ABCDEF0000000000010000101111114041为了给出每个人是否为罪犯的信息,程序中定义为了给出每个人是否为罪犯的信息,程序中定义了一个了一个二维数组二维数组。char info29=“不是罪犯不是罪犯”,“是罪犯是罪犯”;有两个字串每串最多有91个英文字符是是罪罪犯犯00不不是是罪罪犯犯000 01 12 23 34 45 56 67 78 8info为数组名1 10 042char 是说,是说,info 数组的元素为字符,数组的元素为字符,2为下标,表为下标,表示有两个字符串,每个字符串最多有示有两个字符串,每个字符串最多有91个字符。个字符。因为英文字符占一个字节,而汉字占两个字节,故四因为英文字符占一个字节,而汉字占两个字节,故四个汉字要占个汉字要占 8 个英文字符的地方。个英文字符的地方。每一字串后面自动跟一个空字符每一字串后面自动跟一个空字符0因此可以看出:因此可以看出:第第 0 号字符串号字符串 info0 的内容为的内容为“不是罪犯不是罪犯”。第第 1 号字符串号字符串 info1 的内容为的内容为“是罪犯是罪犯”。43在输出时用在输出时用cout infoA endl;如果如果A为为0,则输出,则输出 A:不是罪犯不是罪犯如果如果A为为1,则输出,则输出 A:是罪犯是罪犯参考程序参考程序 4_1.cpp(案情分析)(案情分析)44/*/*/* /* 程程程程 序序序序 名:名:名:名:3_4.cpp *3_4.cpp */* /* 作作作作 者:者:者:者:wuwh *wuwh */* /* 编制时间:编制时间:编制时间:编制时间:20012001年年年年8 8月月月月 * */* /* 主要功能:案情分析主要功能:案情分析主要功能:案情分析主要功能:案情分析 * */*/*#include #include void main(void) /void main(void) /案情分析案情分析案情分析案情分析 /A /A和和和和B B至少有一人作案;至少有一人作案;至少有一人作案;至少有一人作案; cc1=(A | B)cc1=(A | B) /A /A和和和和D D不可能是同案犯;不可能是同案犯;不可能是同案犯;不可能是同案犯; cc2=(A & (!D)|(D & (!A)cc2=(A & (!D)|(D & (!A) /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 = 不是罪犯不是罪犯不是罪犯不是罪犯, , 是罪犯是罪犯是罪犯是罪犯; /; /定义二维数组定义二维数组定义二维数组定义二维数组, ,给出是否罪犯信息给出是否罪犯信息给出是否罪犯信息给出是否罪犯信息 45 for (A=0;A=1;A=A+1) for (A=0;A=1;A=A+1) / / 枚举枚举枚举枚举A A的两种可能的两种可能的两种可能的两种可能 for (B=0;B=1;B=B+1) / for (B=0;B=1;B=B+1) / 枚举枚举枚举枚举B B的两种可能的两种可能的两种可能的两种可能 for (C=0;C=1;C=C+1) / for (C=0;C=1;C=C+1) / 枚举枚举枚举枚举C C的两种可能的两种可能的两种可能的两种可能 for (D=0;D=1;D=D+1) / for (D=0;D=1;D=D+1) / 枚举枚举枚举枚举D D的两种可能的两种可能的两种可能的两种可能 for (E=0;E=1;E=E+1) / for (E=0;E=1;E=E+1) / 枚举枚举枚举枚举E E的两种可能的两种可能的两种可能的两种可能 for (F=0;F=1;F=F+1) / for (F=0;F=1;F=F+1) / 枚举枚举枚举枚举F F的两种可能的两种可能的两种可能的两种可能 / / 循环开始循环开始循环开始循环开始 cc1=A | B; cc1=A | B; / / 第第第第1 1句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式 cc2=(A & (!D)|(D & (!A); / cc2=(A & (!D)|(D & (!A); / 第第第第2 2句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式 cc3=(A & E )|cc3=(A & E )| (A & F)| / (A & F)| / 第第第第3 3句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式 (E & F);(E & F); cc4=(B & C)|(!B & !C); / cc4=(B & C)|(!B & !C); / 第第第第4 4句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式 cc5=(C & !D)|(D & !C); / cc5=(C & !D)|(D & !C); / 第第第第5 5句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式 cc6=D|(!E); cc6=D|(!E); / / 第第第第6 6句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式句话的逻辑表达式46/ /测试测试测试测试6 6句话都为真时句话都为真时句话都为真时句话都为真时, , 才输出谁是罪犯才输出谁是罪犯才输出谁是罪犯才输出谁是罪犯 if (cc1+cc2+cc3+cc4+cc5+cc6=6) if (cc1+cc2+cc3+cc4+cc5+cc6=6) / /输出判断结果输出判断结果输出判断结果输出判断结果 cout A: infoA endl;cout A: infoA endl; cout B: infoB endl; cout B: infoB endl; cout C: infoCendl; cout C: infoCendl; cout D: infoDendl; cout D: infoDendl; cout E: infoEendl; cout E: infoEendl; cout F: infoFendl; cout F: infoFendl; / /输出结束输出结束输出结束输出结束 / /循环结束循环结束循环结束循环结束 47讨讨 论论48大家参与讨论的题大家参与讨论的题大家参与讨论的题大家参与讨论的题五位跳水高手将参加十米高台跳水决赛,有好事五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力预测比赛结果。者让五个人据实力预测比赛结果。A选手说:选手说:B第二,我第三;第二,我第三;B选手说:我第二,选手说:我第二,E第四;第四;C选手说:我第一,选手说:我第一,D第二;第二;D选手说:选手说:C最后,我第三;最后,我第三;E选手说:我第四,选手说:我第四,A第一;第一;决赛成绩公布之后,每位选手的预测都只说对了决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请编程解出比赛的实际名次。一半,即一对一错,请编程解出比赛的实际名次。49思路:思路:思路:思路: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;502、考虑到每个人说的话是一对一错,即一真一假,比如、考虑到每个人说的话是一对一错,即一真一假,比如A说的,如说的,如B=2为真,则为真,则A=3为假,为真取值为为假,为真取值为1,为,为假取值为假取值为0,则两个关系表达式之和必为,则两个关系表达式之和必为1。即。即 (B=2)+(A=3) 应该是应该是 1我们可以归纳出要同时满足五个人所说的话都符合一半对我们可以归纳出要同时满足五个人所说的话都符合一半对一半错的条件是一半错的条件是ta=(B=2)+(A=3)=1; 符合符合A选手的话,则选手的话,则ta为为1tb=(B=2)+(E=4)=1; 符合符合B选手的话,则选手的话,则tb为为1tc=(C=1)+(D=2)=1; 符合符合C选手的话,则选手的话,则tc为为1td=(C=5)+(D=3)=1; 符合符合D选手的话,则选手的话,则td为为1te=(E=4)+(A=1)=1; 符合符合E选手的话,则选手的话,则te为为1因为因为ta,tb,te非非1即即0,五个条件值都加在一起,五个条件值都加在一起513、只有等于、只有等于5时才都符合每个人所说的话,这仅只时才都符合每个人所说的话,这仅只是符合题意的一个必要条件,同时还得考虑是符合题意的一个必要条件,同时还得考虑A、B、C、D、E的取值不得有相同者的取值不得有相同者可以考虑可以考虑是一个条件是一个条件524、仍然可以用枚举的方法,让变量、仍然可以用枚举的方法,让变量A、B、C、D、E在在 15 中取值,形成满足上述条件的中取值,形成满足上述条件的 AE 的组合,即是所求。这时可用循环结构,的组合,即是所求。这时可用循环结构,如下所示如下所示5354作业:作业:1 1 请你自己完成这个程序;请你自己完成这个程序;2 2 思考如何提高效率?思考如何提高效率?3 3 思考还有什么其它解法?思考还有什么其它解法?55结结 束束56
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号