C语言分支结构ppt课件.ppt
《C语言分支结构ppt课件.ppt》由会员分享,可在线阅读,更多相关《C语言分支结构ppt课件.ppt(91页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章第三章 分支结构分支结构“计算机之父”巴贝奇在计算机控制中引入分支结构,使得计算机与计算器从此分道扬镳。 央视对话栏目在一期节目总邀请了功夫熊猫的导演,当主持人称呼他为“功夫熊猫之父”时,他谦逊的说,我更像是功夫熊猫的叔叔,很多很多的人一起完成了这项杰作。本章主要内容4123 if控制语句控制语句逻辑运算逻辑运算判断字母大小写判断字母大小写多分支多分支if语句语句 switch语句语句5 switch语句语句3.1 if控制语句if (表达式) 语句1else 语句2语句语句1表达式表达式语句语句2真真假假语句1和语句2可以是单个语句,也可以是用括起来的复合语句else 和语句2并不是必
2、须的,一般把缺省else 和语句2的if语句称为单分支if语句。3.1.1 if-else语句例3.1:从读入两个整数,要求输出这两个 整数中较大的一个。解题思路: 如果a b,则输出a 的值,否则输出b 的值。 用如下伪代码来表达该问题的求解过程。 (1)读入整数a、b; (2)如果a b,则输出a 的值; 否则,输出b的值。#includeint main(void) (1)读入整数a、b; (2)如果a b 则输出a 的值; 否则 输出b的值; return 0;将伪代码转换为C代码 int a, b; scanf(%d%d, &a, &b); if( a b) printf(“%dn,
3、 a);else printf(“%dn, b);#includeint main(void) int a, b; /声明变量a, b scanf(%d%d, &a, &b);/读入两个整数 if( a b)/如果a b,输出a 的值; printf(%dn, a); else/否则,输出b的值; printf(%dn, b); return 0;例3.1的源程序注意:if的()后没有分号if( a b); printf(%dn, a);else printf(%dn, b);如果不小心在if后多写了一个分号,会出现编译错误错误原因:只有一个分号,也可以构成一个语句空语句。所以if子句的控制范
4、围是一个空语句,而语句 printf(%dn, a); 不在if控制范围内。等价于:if( a b) ;printf(%dn, a);else printf(%dn, b);3.1.2 伪代码 在编写程序3-1之前,先使用了伪代码分析。 伪代码是一种人工的、非正式的辅助人们来进行算法设计的语言。伪代码跟我们日常使用的语言极为类似,但它能方便地转换为C语言程序,并且书写方便易学易用。 使用伪代码有助于程序员在编写程序前专心地“思考”程序该如何设计,至于将伪代码转换成C语言源程序的工作就是相对简单的劳动了。 例3-2考试是否通过解题思路:解题思路:因为问题比较简单,可直接用如下伪代码来表达该问题的
5、求解过程。(1)读入成绩score;(2)如果score = 60,则输出“Passed”; 否则,输出“Failed”。解决问题:解决问题:考试是否通过。从键盘读入一个整数,代表一个学生的考试成绩,若大于或等于60 分,则输出“Passed”,否则输出“Failed”。/* 将伪代码转换为C代码 */#includeint main(void)(1)读入成绩score;(2)如果score = 60, 则输出“Passed”; 否则, 输出“Failed”。 return 0; int score; scanf(%d, &score); if( score = 60) printf(Pass
6、edn);else printf(Failedn);3.1.3 缺省else子句的if子句if控制语句中的else 子句不是必须的,一般把缺省else 子句的if语句称为单分支if语句。if (表达式) 语句if( score max,用b更新max;(4)输出max。/* 将伪代码转换为C代码 */#includeint main(void)(1)读入整数a、b;(2)将a存入max(暂时认为a最大);(3)如果b max,用b更新max;(4)输出max。 return 0;int a, b, max; scanf(%d%d, &a, &b); max = a; if( b max) ma
7、x = b; printf(%dn, max); /*程序3-3:使用单分支if语句求两个整数的最大值*/#includeint main(void) int a, b, max; scanf(%d%d, &a, &b); max = a; /*暂且认为a大*/ if(b max) /*如果b更大*/ max = b; /*用b的值更新max*/ printf(%dn, max); /*输出max值*/ return 0;例3.4 输出三个整数的最大值例3.4:读入三个整数,要求输出这三个整数中的最大值。 解题思路1: 如果用程序3-1 中直接输出结果的方法,需要列举出所有可能的关系:如果a
8、= b,继续判断a与c的大小: 如果a = c,则输出a,否则输出b 否则,继续判断b与c的大小: 如果b = c,则输出b,否则输出b。if( a = b) if( a = c) printf(%dn, a); else printf(%dn, c);else if( b = c) printf(%dn, b); else printf(%dn, c); 例3.4 输出三个整数的最大值解题思路2:在程序3-3的基础上进行扩充。在程序3-3中,已将a 和b的最大值存入max,在此基础上,将c 与max 比较:如果c max,则用c更新max。实现过程如下:(1)读入整数a、b和c;(2)将a
9、存入max(暂时认为a 最大);(3)如果b max,用b更新max;(4)如果c max,用c更新max;(5)输出max。/* 将伪代码转换为C代码:三个整数求最大值 */#includeint main(void)(1)读入整数a、b、c;(2)将a存入max(暂时认为a最大);(3)如果b max,用b更新max;(4)如果c max,用c更新max;(5)输出maxprintf(%dn, max); if( b max) max = b; max = a; int a, b, c, max; scanf(%d%d%d, &a, &b, &c); if( c max) max = c;
10、 3.1.4关系运算关系运算的结果是整型:若关系成立,结果为1;若关系不成立,结果为0;int a = 3, b = 5;a b 结果为0;a * 2 b 结果为1关系运算符用于比较表达式,提出“b是否大于max”等问题。 种类: = = !=结合方向:自左向右优先级别:= !=低于其余4个运算符运算符 =和!=的优先级低于、 、= ,例如 2 3 = 5 7结果为1n数学符号“”和“”在C中分别用“=”和“=”表示n数学符号“”在C语言中用“!=”表示;n数学符号“=”在C语言中用“=”表示;C语言中的“=”为赋值运算,将=左侧的变量的值作为赋值表达式的值。n受长期数学习惯的影响,将关系运算
11、符“=”写成赋值运算符“=”,是C语言编程中最易出现的逻辑错误。int a = 0;if(a = 5) /赋值表达式”a=5”的值为5,故为“真” 语句1关系运算易错点1n受长期数学习惯的影响,误以为 0 n 100可以判断n是否大于0并且小于100。 而实际上,关系运算具有左结合性,同级别的关系符自左向右结合, 0 n 100 即 (0 n) 100, 而子表达式(0 n) 的结果非0即1,所以无论n中存什么值,表达式0 n 100 的值永远为1n形如9 5 8 6的表达式符合C的语法,但C编译器对此式的理解不同于我们的数学习惯。C编译器按照关系运算的左结合规则来理解: 9 5 8 8 7值
12、为0;若int a=0, b=5, x=100; 则 a = x b,则a与b交换内容,总之要求a中存较小数,b中存较大数,最后输出a和b的值。解题思路:(1)从键盘读入两个整数存入a, b(2)如果a b,则互换a和b的内容(3)输出a和b的值。难点:如何交换两个变量的内容?想想:你有一瓶雪碧和一瓶可乐,现在,你想让装雪碧的瓶子装可乐,装可乐的瓶子装雪碧, 如何实现?找一个空瓶子来周转!abt(1)把a中的雪碧倒入空瓶t中雪碧 (2)把b中的可乐倒入a中可乐 (3)把暂存在t中的可乐倒入b中雪碧用C语言表达把a的值存入t中: t = a;把b的值存入a中: a = b;把t的值存入b中: b
13、 = t;一瓶雪碧和一瓶可乐的内容互换将伪代码转换为C代码/两个数的排序#includeint main(void)(1)从键盘读入两个整数存入a, b(2)如果a b,则互换a和b的内容(3)输出a和b的值。int a, b, temp ; scanf(%d%d, &a, &b); if(a b) temp = a; /把a的值暂存入temp; a = b; /把b的值存入a; b = temp; /把temp的值存入b; printf(%dn, max); /两个数的排序#includeint main(void) int a, b, temp; scanf(%d%d, &a, &b);
14、if(a b) temp = a; /把a暂存入temp;a = b; /把b存入a;b = temp; /把temp存入b; printf(%d %d, a, b); return 0;输入:3 5输出:3 5输入:5 3输出:3 5例3.5的源程序注意:注意:if条件下要执行的内容多于一个语句,条件下要执行的内容多于一个语句,一定要用花括弧括成一个复合语句一定要用花括弧括成一个复合语句#includeint main(void) int a, b, temp; scanf(%d%d, &a, &b); if(a b)temp = a; /把a存入temp;a = b; /把b存入a;b =
15、 temp; /把temp存入b; printf(%d %d, a, b); return 0;输入:3 5输出:5 -858993460为什么出现这样的结果?单步执行一下看看!通过单步执行,你会发现:a=b; b=temp; 这两句不受if限制,当if不成立时也执行了等价于以下语句段:注意if语句的控制范围if(ab) temp = a; a = b;b = temp; 课堂练习:n编程:输入编程:输入3个整数个整数a, b, c,要求把最,要求把最小数存入小数存入a中,把最大数存入中,把最大数存入c中,然中,然后顺序输出这三个数。后顺序输出这三个数。解题思路:(1)如果a b,则互换a和b
16、的内容(2)如果a c,则互换a和c的内容(3)如果b c,则互换b和c的内容课堂练习:水仙花数判断。如果一个三位数n的各位数字的立方和等于n自身,则称n为水仙花数。编写程序,输入一个三位正整数n,判断n是否为水仙花数。如果是,输出”yes”,否则输出”no”解题思路如何分离出各位数字如何分离出各位数字?个位个位d0:n%10十位十位d1:(n%100)/10 或或(n/10)%10百位百位d2:n/100if( n = d0*d0*d0 + d1*d1*d1 + d2*d2*d2 ) printf(yesn);else printf(non);n表达式表达式1?表达式?表达式2:表达式:表达
17、式3以上的组合表达式称为条件表达式。求解过程(1)先求解表达式1的值(2)若表达式1的值为真(非0), 则求解表达式2的值,将其作为条件表达式的值。表达式3不计算。(3)若表达式1的值为假(0), 则求解表达式3的值,将其作为条件表达式的值。表达式2不计算。C语言还提供了一种特殊的运算符:条件运算符,用来依据条件选择两个值中的一个。 格式如下:3.1.6 条件运算符n有时在有时在if语句中,在语句中,在“表达式表达式”为为“真真”和和“假假”时,都只执行一个赋值语句给同时,都只执行一个赋值语句给同一变量赋值一变量赋值,例例: if (a b) max = a; else max = b;可以用
18、如下可以用如下条件运算符来处理条件运算符来处理: max = (ab) ? a : b其中,其中,“(ab) ? a : b”是一个条件表达式,若条件是一个条件表达式,若条件(ab)成立,则条件表达式取值)成立,则条件表达式取值a;否则,取值;否则,取值b。例3.6 用条件表达式求两个整数最大值解题思路:(1)读入整数a、b;(2)比较a和b,将其中较大者存入max(3)输出max。 /*程序3-6:使用条件表达式求两个整数的最大值*/#includeint main(void) int a, b, max; scanf(%d%d, &a, &b); max = (a b) ? a : b;
19、printf(%dn, max); return 0;例3.7 用条件表达式求三个整数最大值解题思路:(1)读入整数a、b、c;(2)比较a和b,将其中较大者存入max(3)比较max和c,将其中较大者存入max(4)输出max。 / /* *程序程序3-73-7:使用条件表达式求三个整数的最大值:使用条件表达式求三个整数的最大值* */ / int a, b, c, max; scanf(%d%d%d, &a, &b, &c); max = (a b) ? a : b; max = max c) ? max : c; printf(%dn, max); 3.2 逻辑运算有时做出决策需要测试多
20、个条件,C 语言提供了用于将简单条件组合成复杂条件的逻辑运算符逻辑运算符:n并且: &n或: |n非:!例如:”成绩x属于区间0, 100”,对应逻辑表达式: x = 0 & x = 100;“年龄age在12岁(含12)以下或60岁(含60)以上”,对应逻辑表示式: age = 603.2.1 逻辑运算规则逻辑运算的结果只有0和1;逻辑运算的对象可以是任意数值型,但编译器将所有非0值都视为真(1)。4 & 5 结果为 1;!4 结果为 0;-1 | 0 结果为 1;A的值B的值!AA & BA | B非0非0011非000010非0101001003.2.2 逻辑运算符的优先级与结合性! &
21、|高低优先级:优先级高的运算符优先结合操作数。! 0 & 1 的含义是:(! 0) & 1,而不是 ! (0 & 1)因为!比&优先结合操作数。表达式 1 | 0 & 0 值为1其含义是:1 | ( 0 & 0) ,而不(1 | 0) & 0 因为&比|优先结合操作数。若有 a=4; b=5; 则 !a !a | b 53 & 2 | 84-!0 等价于(!4) | 5 值为1,值为0等价于(5 3) & 2) | (8 (4 - (!0) ) ) 值为0混合运算时的优先级(1)逻辑运算(非运算除外)低于关系运算,关系运算低于算数运算(2)非运算(!)优先级高于算数运算优先级:逻辑运算易错点1
22、、易受数学书写习惯的影响例:判断一个整型变量a是否位于0,100。常见错误写法: 0 = a = 100 /*此表达式永真*/正确写法:0 = a & a = 0 & a 0但在C程序中出现可能带来bug,例如,若a和b为int类型,a*b的运算结果可能超出int范围。a 0 & b 0 | a 0 & b 0)例:闰年判断。输入一个整数表示年份,若该年是闰年,输出“yes”,否则输出”no”3.2.3 闰年判断闰年判定遵循的规律:四年一闰,百年不闰,四百年再闰闰年判定遵循的规律:四年一闰,百年不闰,四百年再闰闰年就是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。地球
23、绕太阳运行周期为365.24219天,即一回归年。公历的平年只有365日,比回归年短约0.2422日,每四年累积约一天,把这一天加于2月末(2月29日),这一年就为闰年。但按照每四年一个闰年计算,经过四百年就会多出大约3天来,因此,每四百年中要减少三个闰年。所以规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年。 如果year是400的倍数,或year是4的倍数并且不是100的倍数,则是闰年;否则,不是闰年。因为因为&与运算优先级高于与运算优先级高于|或运算,故或运算,故if (year%400 = 0 | year%4 = 0 & year%100 != 0)等价
24、于:等价于:if (year%400 = 0 | ( year%4 = 0 & year%100 != 0) )用逻辑表达式判断闰年if(year%400 = 0 | year%4 = 0 & year%100 != 0) printf(yesn);else printf(non);嵌套的 if else 语句判断闰年if(表达式1)if(表达式2) 语句1else 语句2 elseif(表达式3) 语句3 else 语句4 表达式表达式1表达式表达式3语句语句4真真 假假表达式表达式2语句语句3语句语句1语句语句2真真 真真 假假假假 可以将一个单分支或多分支if语句作为另一个if语句中语句
25、,形成嵌套的if语句,可用于测试更多的条件。 如右图所示的一种嵌套方式 对应流程图如下:year是400的倍数:year%400 = 0year是4的倍数: year%4 = 0year不是100的倍数: year%00 != 0用嵌套if-else判断闰年如果year是4的倍数 如果year不是100的倍数,则是闰年; 否则 如果year是400的倍数,则是闰年 否则,不是闰年。 否则,不是闰年if(year%4 = 0) if(year%100 != 0) printf(yesn); else if(year%400 = 0) printf(yesn); else printf(non);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 分支 结构 ppt 课件
限制150内