程序设计基础w05 - chap04 - 逻辑思维2
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A
B
A || B
1
1
1
1
0
1
0
1
1
0
0
0
1 表示真,0 表示假
3、逻辑非,运算符为 ! 示例: 两队比赛篮球,变量 A 表示 A 队到场,!A
表示 A 队不到场;变量 B 表示 B 队到场 ,!B 表示 B 队不到场。 若要这场球赛能赛成,则两队都得到场。 若用C表示“能赛成”(事件),则 C = A && B
<< endl; }
for( F=0;F<=1;F=F+1)
{ cout<<A<<B<<C<<D<<E<<F <<endl; }
循环体
for( E=0;E<=1;E=E+1)
for( F=0;F<=1;F=F+1) { cout<<A<<B<<C<<D<<E<<F
<<endl; }
循环体
for( D=0;D<=1;D=D+1)
如何枚举每个人的可能性? ➢用 0 表示不是罪犯; ➢用 1 表示就是罪犯。
涉及到“多重循环”!
什么是多重循环?来看下面的例子:
编一个程序输出 000000 000001 000010 ...... 111111
从高位到低位,分别用ABCDEF来表示
A
B
C
D
E
F
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
条件判断式 ? 结果1 : 结果2
如果 条件 为真,则表达式返回 结果1; 如果 条件 为假,则表达式返回 结果2。
//************************************
//* 程 序 名:4-9.cpp
*
//* 作 者:wuwh
*
//* 编制时间:2019年8月
*
//* 主要功能:案情分析
试编一程序,将作案人找出来。
为解此题,我们要研究 逻辑运算符 逻辑表达式
1、逻辑与,运算符为 &&
A
B
A&&B
变量A —— 表示开关A是否合上; 变量B —— 表示开关B是否合上;
若取值为0:表示开关未合上; 若取值为1:表示开关合上。
逻辑运算式 A&&B —— 表示灯是否点亮; 结果为0:灯熄灭; 结果为1:灯点亮。
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 ➢ 所以,对于“A 和 D 不是同案犯”,应写成
课后练习:
请你将上述输出000000到111111的程序补充 完整,并上机运行测试。
下面是根据案情分析采用枚举法寻找罪犯的 程序框图
fo r (A = 0 ; A < = 1 ; A = A + 1 ) fo r (B = 0 ; B <= 1 ; B =B +1 ) fo r (C =0 ; C < =1 ; C =C +1 ) fo r (D =0 ; D < =1 ; D =D +1 ) fo r (E = 0 ; E <= 1 ; E =E +1 )
fo r (F = 0 ; F <= 1 ; F =F +1 )
C C 1 = A ||B ; C C 2 = !(A & & D ); C C 3 = ( A & & E ) ||( A & & F ) ||( E & & F ) ; C C 4 = ( B & & C ) ||( !B & & !C ) ; C C 5 = ( C & & !D ) ||( D & & !C ) ; C C 6 = D ||( !E ) ;
若D 表示赛不成,则: (1)赛不成,当然用 !C 表示,
D= !C, (2)也可以:D = !A || !B 其含义是:
A 不到场或 B 不到场, 导致球赛无法进行。
思考为什么:!C = !(A&&B) = !A||!B
思路:
1、案情分析:
将案情的每一条写成逻辑表达 式, 第一条用 CC1 表示, 第二条用 CC2 表示, ……
A
B
A&&B
1
1
1
1
0
0
0
1
0
0
0
0
1 表示真,0 表示假, 这是逻辑变量的取值,非真即假
2、逻辑或,运算符为||
A||B
A
B
变量A —— 表示开关A开合状态; 变量B —— 表示开关B开合上状态;
取值为0:开关断开;1:开关合上。 运算式A||B —— 表示灯是否点亮;
结果为0:灯熄灭;1:灯点亮。
return 0;
} // _MAIN__结束
请 注 意 代 码 编 排 风 格
小结
枚举思想
完备考虑所有可能性(体现在代码中) 逐一处理 (使用循环语句)
自然语言描述-->数学语言描述
以实现其“可计算性”
数学语言表达-->程序语言表达
满足其“可行性”,变成可执行的程序
结束
课前思考题
图片中的事、物,哪些与程序设计无关?
都江堰
逻辑问题及其解法
任务 4.2
某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:
➢ A、B 至少有一人作案; ➢ A、E、F 三人中至少有两人参与作案; ➢ A、D 不可能是同案犯; ➢ B、C 或同时作案,或与本案无关; ➢ C、D 中有且仅有一人作案; ➢ 如果 D 没有参与作案,则 E 也不可能参与作案。
!( A && D )
因此有
CC2 = !( A && D )
CC2 = !( A && D )
A
D
A&&D
CC2
1
0
1
1
1
1
0
0
0
0
1
0
1
0
1
CC3:A、E、F 中至少有两人涉嫌作案
分析有三种可能 ➢ 第一种,A 和 E 作案,(A && E) ➢ 第二种,A 和 F 作案,(A && F) ➢ 第三种,E 和 F 作案,(E && 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);
// 测试6句话都为真时, 才输出谁是罪犯
//
(A && F )||
//
(E && F )
//B和C或同时作案或都与本案无关 cc4=(B && C)||(!B && !C)
//C,D中有且仅有一人作案; cc5=(C && !D)||(D && !C)
//如果D没有参与作案,则E也不可能参与作案; cc6=D || (!E)
int cc1,cc2,cc3,cc4,cc5,cc6; int A,B,C,D,E,F;
//定义6个变量,分别表示6句话 //定义6个变量,分别表示6个人
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
CC6 = (D && (E||(!E))) || ((!D) &&(!E))
我们注意到,E||(!E) 恒为真,即1。 所以,上式可以化简为: CC6 = (D && 1) || ((!D) && (!E))
因为 D && 1 恒等于 D,所以有: CC6 = D || ((!D) && (!E))
cout << "D: " << (D==1?”是罪犯”:”不是罪犯”) << endl;
cout << "E: " << (E==1?”是罪犯”:”不是罪犯”) << endl;
cout << "F: " << (F==1?”是罪犯”:”不是罪犯”) << endl;
} // _IF_结束
} // _FOR_结束
真
CC1+CC2+CC3+CC4+CC5+CC6==6 假
输出
为了给出每个人是否为罪犯的信息,程序中使用了下面的语 句:
cout << “A: ” << (A==1 ? “是罪犯” : “不是罪犯”)
<< endl;
其中,
(A==1 ? ”是罪犯” : ”不是罪犯”) 是一个三元表达式,该表达式由三部分组成,即
if ( cc1+cc2+cc3+cc4+cc5+cc6 == 6 )
{
//输出判断结果
cout << "A: " << (A==1?” 是罪犯”:”不是罪犯”) << endl;
cout << "B: " << (B==1?”是罪犯”:”不是罪犯”) << endl;
cout << "C: " << (C==1?”是罪犯”:”不是罪犯”) << endl;
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
CC3 = (A&&E)||(A&&F)||( E&&F)
CC4:B和C或同时作案,或都与本案无关 ➢ 第一种情况:同时作案(B && C) ➢ 第二种情况:都与本案无关(!B && !C) 两者为或的关系,因此有
0
……
……
……
1
1
1
1
1
1
写一个从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) { cout << A << B << C << D << E << F
*
//*************************************
#include <iostream> using namespace std;
int main() //案情分析
{
//A和B至少有一人作案; cc1=A || B
//A和D不可能是同案犯; cc2=!(A && D)
//A,E,F中至少有两人涉嫌作案 cc3=(A && E )||
上式求或时,“或”右边隐含着!D的意思,所以右 半部分中的 !D 可以去掉,即: CC6 = D || (!E)
2、采取枚举方法,枚举下述64种组合
6个人每个人都有作案或不作案两种可能,因此有 26 种组合,从这些组合中挑出符合条件的作案者。
定义 6 个整数变量,分别表示 6 个人A,B,C,D ,E,F。
CC4 = (B && C) || (!B && !C)
B
C
!B
!C
B&&C
!B&&!C
CC4
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也不可能参与作案。
两种可能性: (1)D作案;(2)D未作案
对于(1)D作案: E可能作案,也可能不作案。因此,可表示为:
D && ( E || (!E) ) 当然,依题意,此种情况下与E无关,故也可以将条件
简化描述为 D,而不必与上(E||!E)
对于(2)D未作案: 依线索陈述,E没有作案。因此,可表示:
(!D) && (!E)
综合起来,CC6 = ( D && ( E || (!E) ) || ( (!D) && (!E) )
for( E=0;E<=1;E=E+1) for( F=0;F<=1;F=F+1) { cout<<A<<B<<C<<D<<E<<F
<<endl; }
循环体
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) { cout<<A<<B<<C<<D<<E<<F <<endl; }