第三章逻辑思维与计算机解题续.ppt

上传人:sccc 文档编号:5020711 上传时间:2023-05-29 格式:PPT 页数:69 大小:331.02KB
返回 下载 相关 举报
第三章逻辑思维与计算机解题续.ppt_第1页
第1页 / 共69页
第三章逻辑思维与计算机解题续.ppt_第2页
第2页 / 共69页
第三章逻辑思维与计算机解题续.ppt_第3页
第3页 / 共69页
第三章逻辑思维与计算机解题续.ppt_第4页
第4页 / 共69页
第三章逻辑思维与计算机解题续.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《第三章逻辑思维与计算机解题续.ppt》由会员分享,可在线阅读,更多相关《第三章逻辑思维与计算机解题续.ppt(69页珍藏版)》请在三一办公上搜索。

1、第 三 章 逻辑思维与计算机解题(续),2,例 3-3 求10!,/*/*程序名:3_3.cpp(循环语句示例)*/*作 者:wuwh*/*编制时间:2002年9月20日*/*主要功能:计算10 的阶乘*/*#include/预编译命令void main()/主函数/主函数开始int i=0,j=0,k=0;/声明 i,j,k 为整型变量,并初始化为0long sum=1;/声明 sum 为长整型变量,并初始化为1for(i=10;i=1;i=i-1)/用 for 循环作累乘运算cout i=i;/显示isum=sum*i;/每一步乘积cout tsum=sum endl;/显示每一步乘积fo

2、r(j=1;j=5500;j=j+1)/用 for 循环延迟时间for(k=1;k=10000;k=k+1);/用 for 循环延迟时间 cout 10!=sum endl;/显示运算结果/主函数结束,3,#include void main()int i=0,j=0,k=0;long sum=1;for(i=10;i=1;i=i-1)cout i=i;sum=sum*i;cout tsum=sum endl;for(j=1;j=5500;j=j+1)for(k=1;k=10000;k=k+1);cout 10!=sum endl;,4,i=10sum=10i=9sum=90i=8sum=72

3、0i=7sum=5040i=6sum=30240i=5sum=151200i=4sum=604800i=3sum=1814400i=2sum=3628800i=1sum=362880010!=3628800,该程序的运行结果如下:,5,将10!展开为10987654321让整型变量 i 去表示10,9,1让长整型变量sum来表示乘积,初始时让其为1将求10的阶乘考虑成累乘问题,让 i=10 去乘sum 再将积存至 sum 中,即sum=sum*i之后让 i=i-1,再用上式累乘,不断地反复做这两个运算,从 i=10,9,1。就完成了求10!的任务。见图3.2,求 10!的思路是,,6,图3.2

4、,7,恰好计算机擅长做这种重复操作,使用 for循环是最佳选择。让循环控制变量 i 就是数字 10,9,1。i 的初值为 10,终值为 1。for 循环的三个表达式为:表达式1 为 i=10;表达式2 为 i=1;表达式3 为 i=i-1;,8,for循环的NS图为了以后讲解的方便,有必要使用更为简便的N-S结构流程图,如图3.3,图3.3,9,if(sum=3)cout This man is char(64+k)endl;g=1;这一段程序可以读作:如果sum真的为 3 时,做下面两件事(1)输出做好事的人;(2)将本题的有解标志置为 1。其中(sum=3)为条件判断语句中的条件,根据其真

5、假使程序分支。,例 3-1 的解要用到分支语句,即需要判断当四句话中有 3 句为真时,我们要将该人判定为做好事者。请看如下程序段,10,下面我们画出分支程序的NS流程图,这种图直观清晰,一目了然。,图3.4,11,if(表达式)语句 1;else 语句 2;如果表达式为真,执行语句1;否则执行语句2if(表达式)语句块 1;else语句块 2;,12,一般格式if(表达式)语句 1;如果表达式为真,执行语句 1;否则什么都不做.if(表达式)语句块 1;如果表达式为真,做语句块 1 的内容;否则什么都不做;,13,举例:实现如图函数,图3.5,14,/*/*程 序 名:3_4.cpp(分支程序

6、示例)*/*作 者:wuwh*/*编制时间:2001年8月*/*主要功能:实现符号函数*/*#include/预编译命令void main()/主函数/主函数开始int x=0,y=0;/声明x,y为整型变量,并初始化为0cout x;/从键盘输入整数送至x中if(x0)/如果x0,将1赋给yy=1;elseif(x=0)/如果x=0,将0赋给yy=0;elsey=-1;/否则(x0),将-1赋给ycout 当x=x 时,y=y endl;/输出x,y的值/主函数结束,15,NS图,图3.6,16,NS图,有了上述了解之后,我们来看解“谁做的好事”的程序框图,图3.7,17,现在我们来分析“谁

7、做的好事”的NS流程图。它是由两大块组成的,如图3.8,图3.8,第一块循环结构,第二块分支结构,18,第一块是循环结构,功能是产生被试对象,依次为A、B、C、D。并测试四句话有多少句为真,如有3句为真,则可确定做好事者,同时置有解标志为1。第二块为分支结构,功能是判断是否无解,如为真,则输出无解信息。这是粗看。再往细看,第一块的循环体又由两块组成,如图3.9,中含两条赋值语句中含一条分支语句,19,我们讲这一段是希望你掌握NS图,这对今后的学习会有好处。按照程序框图很容易写出程序(如下页所示),thisman=64+k;sum=(thisman!=A)+(thisman=C)+(thisma

8、n=D)+(thisman!=D);,图3.9,sum=3,真,假,输出该被测试者;有解标志置1;,20,/*/*程 序 名:3_5.cpp*/*作 者:wuwh*/*编制时间:2001年8月*/*主要功能:谁做的好事*/*#include/预编译命令void main()/主函数/主函数开始int k=0,sum=0,g=0;/声明变量为整数类型,且均初始化为0char thisman=;for(k=1;k=4;k=k+1)/k既是循环控制变量,也表示第k个人/for 循环体开始thisman=64+k;sum=(thisman!=A)+(thisman=C)+(thisman=D)+(th

9、isman!=D);if(sum=3)/如果4句话有3句话为真,则输出该人/输出做好事者cout 做好事者为 char(64+k)endl;g=1;/有解标志置1/for 循环体结束if(g!=1)/则输出无解信息 cout Cant found!endl;/主函数结束,21,#include void main()int k=0,sum=0,g=0;char thisman=;for(k=1;k=4;k=k+1)thisman=64+k;sum=(thisman!=A)+(thisman=D)+(thisman=C)+(thisman!=D);if(sum=3)cout 做好事者为 char

10、(64+k)endl;g=1;if(g!=1)cout Cant found!endl;,22,/*/*程 序 名:3_6.cpp*/*作 者:wuwh*/*编制时间:2001年8月*/*主要功能:谁做的好事*/*#include/预编译命令void main()/主函数/主函数开始int k=0,sum=0,g=0;/声明变量为整数类型,且均初始化为0for(k=1;k=4;k=k+1)/循环从k为1到4,sum=0;/循环体内的初始化if(k!=1)sum=sum+1;/如A的话为真,则让sum加1;if(k=3)sum=sum+1;/如B的话为真,则让sum加1;if(k=4)sum=s

11、um+1;/如C的话为真,则让sum加1;if(k!=4)sum=sum+1;/如D的话为真,则让sum加1;if(sum=3)/若有三句话为真,则做下列两件事cout This man is char(64+k)endl;/输出做好事者g=1;/让有解标志置1if(g!=1)/则输出无解信息 cout Cant found!endl;/主函数结束,23,for(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

12、加1;if(k!=4)sum=sum+1;/如D的话为真,则让sum加1;.,24,/*/*程 序 名:3_7.cpp*/*作 者:wuwh*/*编制时间:2001年8月*/*主要功能:谁做的好事*/*#include/预编译命令void main()/主函数/主函数开始int k=0,g=0;/声明变量为整数类型,且均初始化为0for(k=1;k=4;k=k+1)/k既是循环控制变量,也表示第k个人/for 循环体开始if(k!=1)+(k=3)+(k=4)+(k!=4)=3)/如果4句话有3句话为真,则输出该人/输出做好事者cout 做好事者为 char(64+k)endl;g=1;/有解

13、标志置1/for 循环体结束if(g!=1)/则输出无解信息 cout Cant found!endl;/主函数结束,上述程序可以简化为:,25,for(k=1;k=4;k=k+1)if(k!=1)+(k=3)+(k=4)+(k!=4)=3)cout 做好事者为 char(64+k)endl;g=1;,26,for(k=1;k=4;k=k+1)if(k!=1)+(k=3)+(k=4)+(k!=4)=3)cout“做好事者为”char(64+k)endl;g=1;,第 四 章 逻辑判断与解题思路,28,某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:A、B 至少有一人作案;A、E、F 三人中至少

14、有两人参与作案;A、D 不可能是同案犯;B、C 或同时作案,或与本案无关;C、D 中有且仅有一人作案;如果 D 没有参与作案,则 E 也不可能参与作案。试编一程序,将作案人找出来。,逻辑表达式,29,1、逻辑与,运算符为&,图4.1,为了解这道题,我们要研究逻辑运算符与逻辑表达式。,如图电路A 表示开关A合上;B 表示开关B合上;A&B 表示灯亮;,30,1 表示真,0 表示假,这是逻辑变量的取值,非真即假,31,2、逻辑或,运算符为|,图 4.2,如图电路A 表示开关A合上;B 表示开关B合上;A|B 表示灯亮;,32,1 表示真,0 表示假,33,3、逻辑非,运算符为!两队比赛篮球,变量

15、A 表示 A 队到场,!A 表示 A 队不到场,变量 B 表示 B 队到场,!B 表示 B 队不到场。这场球赛能够赛成,得两队都到场。假定“能赛成”用逻辑变量 C 表示,则C=A&B,34,赛不成当然用!C 表示,D=!C,D 表示赛不成则D=!A|!B理解为 A 不到场或 B 不到场,球赛无法进行。,35,思路:,1、案情分析:将案情的每一条写成逻辑表达式,第一条用 CC1 表示,第二条用 CC2 表示,,36,CC1:A和B至少有一人作案令 A 变量表示 A 作案,B 变量表示 B 作案,显然这是或的关系,有CC1=(A|B),37,CC2:A和D不可能是同案犯可以分析为:A 如果是案犯,

16、D一定不是案犯,写成A&(!D)D 如果是案犯,A一定不是案犯,写成 D&(!A)A 和 D 都不是案犯,写成(!A)&(!D)这三者之间是或的关系,因此有CC2=!(A&D),38,CC2=!(A&D),39,CC3:A、E、F 中至少有两人涉嫌作案分析有三种可能第一种,A 和 E 作案,(A&E)第二种,A 和 F 作案,(A&F)第三种,E 和 F 作案,(E&F)这三种可能性是 或 的关系,因此有CC3=(A&E)|(A&F)|(E&F)我们写出 CC3 的真值表。,40,CC3=(A&E)|(A&F)|(E&F),41,CC4:B和C或同时作案,或都与本案无关第一种情况:同时作案(B

17、&C)第二种情况:都与本案无关(!B&!C)两者为或的关系,因此有 CC4=(B&C)|(!B&!C),42,CC5:C、D中有且仅有一人作案CC5=(C&!D)|(D&!C),43,CC6:如果D没有参与作案,则E也不可能参与作案。分析这一条比较麻烦一些,可以列出真值表再归纳,44,CC6=D|!E,以上是案情分析,已经化成了计算机可解的逻辑表达式,45,6个人每个人都有作案或不作案两种可能,因此有 种组合,从这些组合中挑出符合6条分析的作案者。定义 6 个整数变量,分别表示 6 个人A,B,C,D,E,F。枚举每个人的可能性让 0 表示不是罪犯;让 1 表示就是罪犯。,2、采取枚举方法,枚

18、举什么呢?枚举组合,46,47,写一个从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;,48,for(F=0;F=1;F=F+1)coutABCDEF endl;循环体,49,for(E=0;E=1;E=E+1)for(F=0;F=1;F=F+1)coutABCDEF endl;循环体,50,for(D=0;D=1;D=D+1)for(E=0;E=1;E=E+1)

19、for(F=0;F=1;F=F+1)coutABCDEF endl;循环体,51,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;,52,53,为了给出每个人是否为罪犯的信息,程序中定义了一个二维数组。char info29=“不是罪犯”,“是罪犯”;,有两个字串,每串最多有91个英文字符,info为数组名,54,char 是说,info 数组的元素为字符,2为下标,表示有两个字符串,

20、每个字符串最多有91个字符。因为英文字符占一个字节,而汉字占两个字节,故四个汉字要占 8 个英文字符的地方。每一字串后面自动跟一个空字符0因此可以看出:第 0 号字符串 info0 的内容为“不是罪犯”。第 1 号字符串 info1 的内容为“是罪犯”。,55,在输出时用cout“A:”infoA endl;如果A为0,则输出 A:不是罪犯如果A为1,则输出 A:是罪犯参考程序 4_1.cpp(案情分析),56,/*/*程 序 名:3_4.cpp*/*作 者:wuwh*/*编制时间:2001年8月*/*主要功能:案情分析*/*#include void main(void)/案情分析/A和B至

21、少有一人作案;cc1=(A|B)/A和D不可能是同案犯;cc2=(A/定义二维数组,给出是否罪犯信息,57,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,58,/测试6句话都为真时,才输出谁是罪犯 if(cc1+cc2+cc3+cc4+cc5+cc6=6)/输出判断结果 cout A:infoA endl;cout B:infoB en

22、dl;cout C:infoC endl;cout D:infoD endl;cout E:infoE endl;cout F:infoF endl;/输出结束/循环结束,59,讨 论,60,大家参与讨论的题,五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力预测比赛结果。A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请编程解出比赛的实际名次。,61,思路:,1、首先是将五个人的预测写成逻辑表达式:让关系运算符“=”的含义是“是”。让数字 1、

23、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;,62,2、考虑到每个人说的话是一对一错,即一真一假,比如A说的(B=2)+(A=3)应该是 1 1+0=1 0+1=1,63,我们可以归纳出要同时满足五个人所说的话都符合一半对一半错的条件是 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)

24、=1;符合D选手的话te=(E=4)+(A=1)=1;符合E选手的话因为ta,tb,te非1即0,五个条件值都加在一起,64,ta 的取值是 0 或 1 ta 的取值取决于下列关系(B=2)+(A=3)=1 B=2-可能是 0 或 1 A=3-可能是 0 或 1(B=2)+(A=3)-可能是 0 或 1 或 2 只有上式为 1 才能使 ta 为 1,65,3、只有等于5 时才都符合每个人所说的话,这仅只是符合题意的一个必要条件,同时还得考虑 A、B、C、D、E 的取值不得有相同者,可以考虑,是一个条件,66,4、仍然可以用枚举的方法,让变量A、B、C、D、E 在 15 中取值,形成满足上述条件的 AE 的组合,即是所求。这时可用循环结构,如下所示,67,68,作业:1 请你自己完成这个程序;2 思考如何提高效率?3 思考还有什么其它解法?,69,结 束,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号