页数:31页文件大小:518.5 KB来源: 计算机语言与程序设计ppt课件
本课件以经典的「谁做的好事」逻辑题为主线,先把四个人的话改写成关系表达式,再演示用字符变量与ASCII码比较真假,进而引入枚举试探的解题思路。围绕枚举实现讲清for循环的三表达式与执行过程、累加累乘示例,再用if与if-else分支完成条件判断,最后给出完整程序及利用关系表达式取值0或1的简化写法。
本页为第二讲 逻辑判断章节封面,本讲以“谁做的好事”这一逻辑推理题为主线,讲解关系运算、枚举与分支结构。
清华附中四位同学中的一位做了好事不留名,校长问这四位是谁做的好事:
已知三人说真话、一人说假话,要求据此找出做好事的人。
为解这类题需要关系运算符与关系表达式:
> 大于< 小于>= 大于等于== 等于!= 不等于//程序 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)); }| 关系表达式 | 取值 | 含义 |
|---|---|---|
| 3 > 2 | 1 | 真 |
| 3 >= 2 | 1 | 真 |
| 3 == 2 | 0 | 假 |
| 3 < 2 | 0 | 假 |
| 3 != 2 | 1 | 真 |
<变量1> 关系运算符 <变量2>,如 b>c,用于测试这一关系是否成立。系统在内存中为字符变量分配一个字节,令 == 的含义为“是”、!= 的含义为“不是”,声明 char thisman; 表示要找的人。
(thisman!='A')(thisman=='C')(thisman=='D')(thisman!='D')| 字符 | ASCII码值 |
|---|---|
| A | 65 |
| B | 66 |
| C | 67 |
| D | 68 |
字符在内存中以 ASCII 码形式存放,因此 thisman = 'A'; 与 thisman = 65; 两者等效,内存中存放的都是 65。
//例 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。
先假定是 A 同学,让 thisman='A'; 代入四句话:
四个关系表达式值的和为 1,显然不是 A 做的好事。
再试 B 同学,让 thisman='B'; 代入四句话:
四个关系表达式值的和为 2,显然不是 B 所为。
再试 C 同学,让 thisman='C'; 代入四句话:
四个关系表达式值之和为 3,显然就是 C 做了好事。
for(k=1; k<=4; k=k+1) { thisman = 64+k; sum = (thisman!='A') + (thisman=='C') + (thisman=='D') + (thisman!='D');}用循环结构实现枚举最为自然。
for (表达式1;表达式2;表达式3) { 循环体语句 }表达式1初始化循环变量,表达式2为继续条件,表达式3修改循环变量。
本页以图示方式说明 for 循环的执行流程:先求表达式1,再判断表达式2,为真则执行循环体并执行表达式3,为假则退出循环。源文件未给出更多文字说明。
#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 之和。
改变 for 的表达式可得到不同运行结果,例如 for (i=1; i<=1000; i=i+2)。为了看清每一步的执行情况,将程序改造为 s2_4.c。
// 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 位置输出。
#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,实现递减计数循环。
从以上两个例子可以看出,for 循环是一种计数型循环,可以递增也可以递减,使用起来很方便,一般在已知循环次数的情况下使用。
for (i=1; i<=100; i=i+2) 循环体本页同时给出 for 循环的 NS 图。
if (sum == 3) { printf("This man is %c\n",thisman); g=1; }读作:如果 sum 真的为 3,则输出做好事的人并将有解标志置 1。其中 (sum==3) 是条件判断语句中的条件,根据其真假使程序分支。
本页以 NS 图形式表示分支语句的执行:条件成立时执行语句块1,不成立时跳过或执行语句块2。源文件未给出更多文字说明。
if (表达式) 语句1;——表达式为真执行语句1,否则什么都不做if (表达式) { 语句块1; }——表达式为真做语句块1的内容,否则什么都不做if (表达式) 语句1; else 语句2;——为真执行语句1,否则执行语句2if (表达式) { 语句块1; } else { 语句块2; }——为真做语句块1,否则做语句块2本页以图形方式给出待实现的分段函数:x>0 时 y=1,x=0 时 y=0,并提示用 if-else 实现。源文件未给出更多文字说明。
// 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 赋值。
本页以 NS 图形式描述分段函数程序的流程:输入 x 后按 x>0、x==0 等条件分支给 y 赋值。源文件未给出更多文字说明。
有了上述了解之后,本页给出解“谁做的好事”的程序框图:依次假设 A、B、C、D,统计真话条数,若为 3 则输出该人。根据上述框图写出的程序见 s2_7.c。
#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; ... } }#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 的特点,把四条判断合并为一个求和条件。
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}