240 likes | 333 Views
计算机程序设计基础. 第三讲 逻辑判断(续). 二、逻辑判断. 逻辑表达式 某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析: A 、 B 至少有一人作案; A 、 E 、 F 三人中至少有两人参与作案; A 、 D 不可能是同案犯; B 、 C 或同时作案,或与本案无关; C 、 D 中有且仅有一人作案; 如果 D 没有参与作案,则 E 也不可能参与作案。 试编一程序,将作案人找出来。. 二、逻辑判断. 为了解这道题,我们要研究逻辑运算符与逻辑表达式。 1 、逻辑与,运算符为 && 如图电路 A —— 表示开关 A 合上; B —— 表示开关 B 合上;
E N D
计算机程序设计基础 第三讲 逻辑判断(续)
二、逻辑判断 逻辑表达式 某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析: • A、B至少有一人作案; • A、E、F三人中至少有两人参与作案; • A、D不可能是同案犯; • B、C或同时作案,或与本案无关; • C、D中有且仅有一人作案; • 如果D没有参与作案,则E也不可能参与作案。 试编一程序,将作案人找出来。
二、逻辑判断 为了解这道题,我们要研究逻辑运算符与逻辑表达式。 1、逻辑与,运算符为&& 如图电路 A——表示开关A合上; B——表示开关B合上; A&&B——表示灯亮; A B A&&B1 1 11 0 00 1 00 0 0 1表示真,0表示假,这是逻辑变量的取值,非真即假
二、逻辑判断 2、逻辑或,运算符为|| 如图电路 A——表示开关A合上; B——表示开关B合上; A||B——表示灯亮; A B A||B1 1 11 0 10 1 10 0 0 1表示真,0表示假
二、逻辑判断 3、逻辑非,运算符为! 两队比赛篮球,变量A表示A队到场,!A表示A队不到场,变量B表示B队到场,!B表示B队不到场。这场球赛能够赛成,得两队都到场。假定“能赛成”用逻辑变量C表示,则 C = A&&B 赛不成当然用!C表示,让D = !C,D表示赛不成则 D=!A||!B。 理解为A不到场或B不到场,球赛无法进行。
二、逻辑判断 思路: 1 案情分析:将案情的每一条写成逻辑表达式,第一条用CC1表示,第二条用CC2表示,…… CC1:A和B至少有一人作案 令A变量表示A作案 B变量表示B作案 A B CC1 0 0 0 1 0 1 0 1 1 1 1 1 显然这是或的关系,因此有CC1=(A||B)
二、逻辑判断 CC2:A和D不可能是同案犯 可以分析为: • A如果是案犯,D一定不是案犯,写成A&&(!D) • D如果是案犯,A一定不是案犯,写成D&&(!A) 这两者之间是或的关系,因此有 CC2=!(A&&D) A D A&&D CC2 1 0 0 1 1 1 1 0 0 0 0 1 0 1 0 1
二、逻辑判断 (A&(!B))||((!A)&&B) 这叫“异或”运算 在数字逻辑课中表示为 在计算机中是半加器(二进制)
二、逻辑判断 CC3:A、E、F中有两人涉嫌作案,分析有三种可能 • 第一种,A和E作案,(A&&E) • 第二种,A和F作案,(A&&F) • 第三种,E和F作案,(E&&F) 这三种可能性是或的关系,因此有 CC3= (A&&E)||(A&&F)||(E&&F) 我们写出CC3的真值表。
二、逻辑判断 A E F CC3 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0
二、逻辑判断 CC4:B和C或同时作案,或都与本案无关 第一种情况:同时作案(B && C) 第二种情况:都与本案无关(!B && !C) 两者为或的关系,因此有 CC4=(B && C)||(!B && !C) B C !B !C B&&C !B&&!C CC3 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 CC5:C、D中有且仅有一人作案 CC5=(C && !D)||(D && !C)
二、逻辑判断 CC6:如果D没有参与作案,则E也不可能参与作案。 分析这一条比较麻烦一些,可以列出真值表再归纳 D E !E CC6 含义1 1 0 1 D作案,E也作案 可能1 0 1 1 D作案,E不作案 可能0 0 1 1 D不作案,E也不可能作案 可能0 1 0 0 D不作案,E却作案 不可能 CC6=D||!E 以上是案情分析,已经化成了计算机可解的逻辑表达式
二、逻辑判断 2 采取枚举方法,枚举什么呢?枚举组合。 6个人每个人都有作案或不作案两种可能,因此有 种组合,从这些组合中挑出符合6条分析的作案者。 定义6个整数变量,分别表示6个人A,B,C,D,E,F。 枚举每个人的可能性 • 让0表示不是罪犯; • 让1表示就是罪犯。
二、逻辑判断 为了给出每个人是否为罪犯的信息,程序中定义了一个二维数组。 Char info[2][9]={“不是罪犯”,“是罪犯”}; 有两个字串 每串最多有9-1个英文字符 info为数组名
二、逻辑判断 • char是说,info数组的元素为字符,[2]为下标,表示有两个字符串,每个字符串最多有9-1个字符。 • 因为英文字符占一个字节,而汉字占两个字节,故四个汉字要占8个英文字符的地方。 • 每一字串后面自动跟一个空字符‘\0’ • 因此可以看出:第0号字符串info[0]的内容为“不是罪犯”。第1号字符串info[1]的内容为“是罪犯”。
二、逻辑判断 在输出时用 printf(“A:%s\n”,info[A]); 如果A为0,则输出 A:不是罪犯如果A为1,则输出 A:是罪犯 参考程序AQFX.c(案情分析)
二、逻辑判断 大家参与讨论的题 五位跳水高手将参加十米高台跳水决赛,有好事者让五个人据实力预测比赛结果。 A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一; 决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请编程解出比赛的实际名次。
二、逻辑判断 思路: 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;
二、逻辑判断 2 考虑到每个人说的话是一对一错,即一真一假,比如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,五个条件值都加在一起
二、逻辑判断 3 只有等于5时才都符合每个人所说的话,这仅只是符合题意的一个必要条件,同时还得考虑A、B、C、D、E的取值不得有相同者 可以考虑 是一个条件 4 仍然可以用枚举的方法,让变量A、B、C、D、E在1~5中取值,形成满足上述条件的A~E的组合,即是所求。这时可用循环结构,如下所示
二、逻辑判断 作业: 1 请你自己完成这个程序; 2 思考如何提高效率? 3 思考还有什么其它解法?