首页计算机计算机软件计算机语言与程序设计 02 逻辑判断.ppt

02 逻辑判断.ppt

页数:31页文件大小:518.5 KB来源: 计算机语言与程序设计ppt课件

本课件以经典的「谁做的好事」逻辑题为主线,先把四个人的话改写成关系表达式,再演示用字符变量与ASCII码比较真假,进而引入枚举试探的解题思路。围绕枚举实现讲清for循环的三表达式与执行过程、累加累乘示例,再用if与if-else分支完成条件判断,最后给出完整程序及利用关系表达式取值0或1的简化写法。

第二讲逻辑判断章节封面页,标示本讲以谁做的好事这一逻辑推理题引入判断
逻辑判断引例页,给出四位同学中三人说真话一人说假话的推理题与四句陈述
关系运算符清单页,列出大于、小于、大于等于、等于与不等于五个运算符
查看本课件的文字版(共 31 页,供检索与复制)

第1页:第二讲逻辑判断封面

本页为第二讲 逻辑判断章节封面,本讲以“谁做的好事”这一逻辑推理题为主线,讲解关系运算、枚举与分支结构。

第2页:谁做的好事问题

清华附中四位同学中的一位做了好事不留名,校长问这四位是谁做的好事:

  • A说:不是我
  • B说:是C
  • C说:是D
  • D说:他胡说

已知三人说真话、一人说假话,要求据此找出做好事的人。

第3页:关系运算符和关系表达式

为解这类题需要关系运算符与关系表达式:

  • > 大于
  • < 小于
  • >= 大于等于
  • == 等于
  • != 不等于

第4页:关系运算示例程序

//程序 s2_1.c #include <math.h> void main( ) { int b,c; b=3; c=2; printf("3> 2是%d\n",(b>c)); printf("3>=2是%d\n",(b>=c)); printf("3==2是%d\n",(b==c)); printf("3< 2是%d\n",(b<c)); printf("3!=2是%d\n",(b!=c)); }

第5页:关系运算输出结果

关系表达式及其取值
关系表达式取值含义
3 > 21真
3 >= 21真
3 == 20假
3 < 20假
3 != 21真

第6页:关系表达式的定义

关系表达式
<变量1> 关系运算符 <变量2>,如 b>c,用于测试这一关系是否成立。
  • 成立——关系表达式的值为 1
  • 不成立——关系表达式的值为 0

第7页:thisman变量与字符存储

系统在内存中为字符变量分配一个字节,令 == 的含义为“是”、!= 的含义为“不是”,声明 char thisman; 表示要找的人。

第8页:四句话与ASCII码对照

  • A说:不是我 → (thisman!='A')
  • B说:是C → (thisman=='C')
  • C说:是D → (thisman=='D')
  • D说:他胡说 → (thisman!='D')
字符与ASCII码值对照
字符ASCII码值
A65
B66
C67
D68

第9页:字符与ASCII码的等价性

字符在内存中以 ASCII 码形式存放,因此 thisman = 'A'; 与 thisman = 65; 两者等效,内存中存放的都是 65。

第10页:ASCII码验证程序

//例 s2_2.c #include <math.h> void main( ) { char thisman; thisman='A'; printf("thisman=%c\n",thisman); printf(" 65=='A'----取值为%d\n",65=='A'); }

编译链接后运行输出:thisman=A;65=='A' 取值为 1。

第11页:枚举试探:假定是A

先假定是 A 同学,让 thisman='A'; 代入四句话:

  • A说:'A'!='A' 假,值为 0
  • B说:'A'=='C' 假,值为 0
  • C说:'A'=='D' 假,值为 0
  • D说:'A'!='D' 真,值为 1

四个关系表达式值的和为 1,显然不是 A 做的好事。

第12页:枚举试探:假定是B

再试 B 同学,让 thisman='B'; 代入四句话:

  • A说:'B'!='A' 真,值为 1
  • B说:'B'=='C' 假,值为 0
  • C说:'B'=='D' 假,值为 0
  • D说:'B'!='D' 真,值为 1

四个关系表达式值的和为 2,显然不是 B 所为。

第13页:枚举试探:确定是C

再试 C 同学,让 thisman='C'; 代入四句话:

  • A说:'C'!='A' 真,值为 1
  • B说:'C'=='C' 真,值为 1
  • C说:'C'=='D' 假,值为 0
  • D说:'C'!='D' 真,值为 1

四个关系表达式值之和为 3,显然就是 C 做了好事。

第14页:枚举法的循环实现

for(k=1; k<=4; k=k+1) { thisman = 64+k; sum = (thisman!='A') + (thisman=='C') + (thisman=='D') + (thisman!='D');}

用循环结构实现枚举最为自然。

第15页:for循环结构抽象图

for (表达式1;表达式2;表达式3) { 循环体语句 }

表达式1初始化循环变量,表达式2为继续条件,表达式3修改循环变量。

第16页:for循环执行流程

本页以图示方式说明 for 循环的执行流程:先求表达式1,再判断表达式2,为真则执行循环体并执行表达式3,为假则退出循环。源文件未给出更多文字说明。

第17页:求自然数1至100之和

#include <stdio.h> void main( ) { int i,sum; sum=0; for(i=1;i<=100;i=i+1) { sum=sum+i; } printf("sum=%d\n",sum); }

举例:求自然数 1-100 之和。

第18页:for循环的表达式变化

改变 for 的表达式可得到不同运行结果,例如 for (i=1; i<=1000; i=i+2)。为了看清每一步的执行情况,将程序改造为 s2_4.c。

第19页:逐步输出累加过程

// s2_4.c(1~10的和) for(i=1; i<=10; i=i+1) { printf("i=%d",i); sum=sum+i; printf("\tsum=%d\n",sum); for(j=1;j<=5500;j=j+1) for(k=1;k<=10000;k=k+1);}

循环体内用 \t 跳到下一个 Tab 位置输出。

第20页:递减循环求累乘

#include <stdio.h> void main( ) { int i,j,k; long sum; sum=1; for(i=10;i>=1;i=i-1) { printf("i=%d",i); sum=sum*i; printf("...",sum); } }

控制变量 i 初值为 10、终值为 1,步长 i=i-1,实现递减计数循环。

第21页:for循环小结与NS图

从以上两个例子可以看出,for 循环是一种计数型循环,可以递增也可以递减,使用起来很方便,一般在已知循环次数的情况下使用。

for (i=1; i<=100; i=i+2) 循环体

本页同时给出 for 循环的 NS 图。

第22页:分支语句if的用法

if (sum == 3) { printf("This man is %c\n",thisman); g=1; }

读作:如果 sum 真的为 3,则输出做好事的人并将有解标志置 1。其中 (sum==3) 是条件判断语句中的条件,根据其真假使程序分支。

第23页:分支结构NS图

本页以 NS 图形式表示分支语句的执行:条件成立时执行语句块1,不成立时跳过或执行语句块2。源文件未给出更多文字说明。

第24页:if语句的一般格式(一)

  • 格式1:if (表达式) 语句1;——表达式为真执行语句1,否则什么都不做
  • 格式2:if (表达式) { 语句块1; }——表达式为真做语句块1的内容,否则什么都不做

第25页:if语句的一般格式(二)

  • 格式3:if (表达式) 语句1; else 语句2;——为真执行语句1,否则执行语句2
  • 格式4:if (表达式) { 语句块1; } else { 语句块2; }——为真做语句块1,否则做语句块2

第26页:分段函数的实现

本页以图形方式给出待实现的分段函数:x>0 时 y=1,x=0 时 y=0,并提示用 if-else 实现。源文件未给出更多文字说明。

第27页:分段函数实现程序

// s2_6.c #include <stdio.h> void main( ) { int x,y; printf("x="); scanf("%d",&x); if(x>0) y=1; else if(x==0) y=0; ... }

用 scanf 从键盘输入一个整数放入 x,再按 x 的取值给 y 赋值。

第28页:分段函数NS图

本页以 NS 图形式描述分段函数程序的流程:输入 x 后按 x>0、x==0 等条件分支给 y 赋值。源文件未给出更多文字说明。

第29页:谁做的好事程序框图

有了上述了解之后,本页给出解“谁做的好事”的程序框图:依次假设 A、B、C、D,统计真话条数,若为 3 则输出该人。根据上述框图写出的程序见 s2_7.c。

第30页:谁做的好事完整程序

#include <stdio.h> void main() { int k,sum,g; for(k=1;k<=4;k=k+1) { sum=0; if (k!=1) sum=sum+1; if (k==3) sum=sum+1; if (k==4) sum=sum+1; ... } }

第31页:程序简化写法

#include <stdio.h> void main( ) { int k, g; for (k=1; k<=4; k=k+1) { if (((k!=1)+(k==3)+(k==4)+(k!=4))==3) { printf("Thisman is %c\n",64+k); g=1; } } if (g!=1) printf("Can't found!\n"); }

利用关系表达式取值为 0 或 1 的特点,把四条判断合并为一个求和条件。

顶部目录