C05第5章选择结构程序设计.ppt_第1页
C05第5章选择结构程序设计.ppt_第2页
C05第5章选择结构程序设计.ppt_第3页
C05第5章选择结构程序设计.ppt_第4页
C05第5章选择结构程序设计.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019/4/26,1,第5章 选择结构程序设计,要设计选择结构程序,要考虑两个方面的问题:一是在C语言中如何来表示条件,二是在C语言中实现选择结构用什么语句。 在C语言中表示条件,一般用关系表达式或逻辑表达式,实现选择结构用if语句或switch语句。 5.1 关系运算及其表达式 5.2 逻辑运算及其表达式 5.3 if语句 5.4 switch语句 5.5 选择结构程序举例 良好的源程序书写风格注释,2019/4/26,2,5.1 关系运算及其表达式,所谓“关系运算”实际上就是“比较运算”,即将两个数据进行比较,判定两个数据是否符合给定的关系。 例如,“a b”中的“”表示一个大于关系运算。如果a的值是5,b的值是3,则大于关系运算“”的结果为“真”,即条件成立;如果a的值是2,b的值是3,则大于关系运算“”的结果为“假”,即条件不成立。 5.1.1 关系运算符及其优先次序 1关系运算符 C语言提供6种关系运算符: (大于), =(大于或等于), =(等于), !=(不等于) 注意:在语言中,“等于”关系运算符是双等号“= =”,而不是单等号“= ”(赋值运算符)。,2019/4/26,3,2优先级 (1)在关系运算符中,前4个优先级相同,后2个也相同,且前4个高于后2个。 (2)与其它种类运算符的优先级关系 关系运算符的优先级,低于算术运算符,但高于赋值运算符。 5.1.2 关系表达式 1关系表达式的概念 所谓关系表达式是指,用关系运算符将两个表达式连接起来,进行关系运算的式子。 例如,下面的关系表达式都是合法的: ab,a+bc-d,(a=3)=b,(ab)= =(bc) 2关系表达式的值逻辑值(非“真”即“假”)。 由于语言没有逻辑型数据,所以用整数“”表示“逻辑真”,用整数“”表示“逻辑假”。,2019/4/26,4,例如,假设num1=3,num2=4,num3=5,则: (1)num1num2的值=0。 (2)(num1num2)!=num3的值=1。 (3)num1num2num3的值=1。 思考题:任意改变num1或num2的值,会影响整个表达式的值吗?为什么? (4)(num1num2)+num3的值=6,因为num1num2的值=1,1+5=6。 强调:C语言用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。所以,关系表达式的值,还可以参与其它种类的运算,例如算术运算、逻辑运算等。 Return,2019/4/26,5,5.2 逻辑运算及其表达式,关系表达式只能描述单一条件,例如“x=0”。如果需要描述“x=0”、同时“x10”,就要借助于逻辑表达式了。 5.2.1 逻辑运算及其优先次序 逻辑运算符及其运算规则 (1)C语言提供三种逻辑运算符: & 逻辑与(相当于“同时”) | 逻辑或(相当于“或者”) ! 逻辑非(相当于“否定”),2019/4/26,6,例如,下面的表达式都是逻辑表达式: (x=0) & (x5) ,! (x= =0), (2)运算规则 1)&:当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”。 2) | :当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。 3) ! :当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。 例如,假定x=5,则(x=0) & (x5)的值为“假”。,2019/4/26,7,2逻辑运算符的运算优先级 (1)逻辑非的优先级最高,逻辑与次之,逻辑或最低,即: !(非) &(与) |(或) (2)与其它种类运算符的优先关系 ! 算术运算 关系运算 & | 赋值运算 5.2.2 逻辑表达式 1逻辑表达式的概念 所谓逻辑表达式是指,用逻辑运算符将1个或多个表达式连接起来,进行逻辑运算的式子。在C语言中,用逻辑表达式表示多个条件的组合。 例如,(year%4=0)&(year%100!=0)|(year%400=0)就是一个判断一个年份是否是闰年的逻辑表达式。,2019/4/26,8,逻辑表达式的值也是一个逻辑值(非“真”即“假”)。 2逻辑量的真假判定和非 语言用整数“”表示“逻辑真”、用“”表示“逻辑假”。但在判断一个数据的“真”或“假”时,却以和非为根据:如果为,则判定为“逻辑假”;如果为非,则判定为“逻辑真”。 例如,假设num=12,则: !num的值= ,num=1 num31的值=1。 3说明 (1)逻辑运算符两侧的操作数,除可以是和非的整数外,也可以是其它任何类型的数据,如实型、字符型等。,2019/4/26,9,(2)在计算逻辑表达式时,只有在必须执行下一个表达式才能求解时,才求解该表达式(即并不是所有的表达式都被求解)。换句话说: 1)对于逻辑与运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。 2)对于逻辑或运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。 例如,假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、1、1,则求解表达式“(x=n1n2)&(y=n3n4)”后,x的值变为,而y的值不变,仍等于1! Return,2019/4/26,10,5.3.1 if语句的三种形式 1. if(表达式) 语句组1; 例如:if(xy)printf(“%d”,x); 2. if(表达式) 语句组1; else 语句组2; 例如:if(xy)printf(“%d”,x); else printf(“%d”,y); 3. if(表达式1) 语句组1; else if(表达式2)语句组2; else if(表达式3) 语句组3; else if(表达式m) 语句组m; else 语句组n; (实际是else子句中嵌套if语句),5.3 if语句和条件运算符,2019/4/26,11,语句一般格式 if (表达式) 语句,功能: 计算表达式的值,如果是一个非0值(即逻辑真),就执行内嵌语句,否则(即逻辑假)跳过内嵌语句,顺序执行后续语句。,2019/4/26,12,简单分支语句的算法:,例如: if (x0) m+; if ( ab ) c=a; a=b; b=c; ,2019/4/26,13,双重分支语句,语句一般格式 if (表达式) 语句1 else 语句2 功能: 计算表达式的值,如果它的值是一个非0值(逻辑真),就执行内嵌语句1,之后跳过内嵌语句2,执行后续语句;否则跳过内嵌语句1,执行内嵌语句2,之后执行后续语句。,2019/4/26,14,双重分支语句的算法:,例如: if (x0) m+; else m-; if ( ch= a ,2019/4/26,15,多重分支语句,语句一般格式 if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式m) 语句m else 语句 n 功能: 依次计算并判断表达式i,为非0时执行后面的语句,都为0时,执行语句n 无论执行完那个语句分支,都转到后续语句,2019/4/26,16,多重分支语句的算法,流程图,表达式m ?,2019/4/26,17,多重分支语句的算法,N-S结构图,例如: if (a0) x= -1 ; else if (a=0 ) x= 0 ; else x=1 ;,2019/4/26,18,if语句的简单应用,【例5.1】输入一个字符,如果是大写字母,则将其转换为小写字母输出,否则直接输出。,输入:用 getchar 或 scnaf 函数 ch是否为大写字母: ch=A & ch=65 & ch = 90) 大写字母转换为小写字母: ch=ch+32 输出:用 putchar 或 printf 函数,思路:,2019/4/26,19,程序:,#include “stdio.h“ main( ) char ch; ch=getchar( ); if (ch=A ,程序运行情况如下: G g,运行jc4_1,可使用条件表达式代替,putchar(ch=A putchar ( n),2019/4/26,20,5.3.2 if语句的嵌套,如果if的内嵌语句中又使用了一个if语句,则构成if语句的嵌套。,【例5.2】比较两个整数的关系。 #include main( ) int x, y; printf (“Enter integer X and Y:“); scanf (“%d%d“, ,应该正确判断: if的内嵌语句 if和else的配对,运行jc4_a,提倡缩格书写 有利于阅读程序,2019/4/26,21,if语句嵌套的形式,简单if语句的嵌套形式 if (表达式) if 语句 双重(或多重)分支if语句的嵌套形式 if (表达式) if 语句 else if 语句,可以是各种形式的if语句,可以是各种形式的if语句,如果是简单if语句, 必须用“ ”括起,2019/4/26,22,例如:, if (c=50) printf(“50=50) printf(“50150n“); if (c=50) printf(“50=c=100n“); else printf(“c50n“),与哪个if 配对?,2019/4/26,23,再例如:,if(ab) if(ac) if(ad) m=1; else m=2; else m=3;,问题:哪一个 else 和哪一个 if 相匹配?,规则:在嵌套的ifelse语句中,else总是与上面的离它最近的尚未配对的if 配对。,2019/4/26,24,举例,【例5.3】输入一个数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为5的倍数。,2019/4/26,25,程序:,main( ) int x; scanf (“%d“, ,运行jc4_4,2019/4/26,26,学习if语句的难点,if else 语句的配对 正确用表达式描述条件 例如:当x大于5小于10时令x自增 if ( 5x10 ) x+;,正确判断内嵌语句 例如:if(xy) x=x+3; y=y-2; else x=x-3; y=y+2;,if (x5 , , ,2019/4/26,27,熟悉常用的if 表达式形式,例如有定义:int a,b=0; a等于什么值时,执行b=2 ;语句? if (a=0) b=2; if (a=1) b=2; if (a!=0) b=2; if (a=1) b=2; if (a=0) b=2; if (a) b=2; if (!a) b=2;,等价于,等价于,2019/4/26,28,1一般格式: 表达式1 ?表达式2 :表达式3 条件表达式中的“表达式1”、“表达式2”、“表达式3”的类型,可以各不相同。 2运算规则 如果“表达式1”的值为非0(即逻辑真), 则运算结果等于“表达式2”的值;否则,运算结果等于“表达式3”的值。 3运算符的优先级与结合性 条件运算符的优先级,高于赋值运算符,但低于关系运算符和算术运算符。其结合性为“从右到左”(即右结合性)。,5.3.3 条件运算符,2019/4/26,29,例5.1可以的程序可以改为 main() char ch; printf(“Input a character: “); scanf(“%c“, 程序演示,2019/4/26,30,5.4 switch语句,switch语句的一般形式 switch (表达式) case 常量表达式1: 语句序列1 case 常量表达式2: 语句序列2 case 常量表达式n: 语句序列n default : 语句序列n+1 功能: 计算表达式的值,与常量表达式的值比较,等于第i个值时,顺序执行语句序列i、i+1、 、 n+1 若与所有常量表达式值都不相等,执行语句序列n+1。,2019/4/26,31,switch语句的算法描述,N-S结构图,例如: switch (a) case 5: printf(“ ,当a等于5,输出:&#$ 当a等于2,输出:#$ 当a是其他值,输出:$,2019/4/26,32,说明:,“case 常量表达式i:”等价于语句标号,计算出的表达式值等于哪个语句标号,就从哪个位置开始顺序向下执行语句序列。 语句位置影响运行结果,例如: switch (a) case 2: printf(“#“); default: printf(“$“); case 5: printf(“ ,switch与break语句结合才能实现 程序的分支,break; break; break;,2019/4/26,33,switch语句的简单应用,【例5.4】已知x=100,y=15,要求输入一个算术运算符(+、-、* 或 / ),并对x和y进行指定的算术运算。,思路: 设x和y为float型变量并赋初值; 输入的运算符op为char型变量; 根据op的值(为+、-、*、/)进行x和y的相加、相减、相乘、相除运算(选择分支); 还要考虑到输入字符不是+、-、* 或 / 时的情况,2019/4/26,34,程序:,#include “stdio.h“ main( ) float x=100,y=15,z; char op; op=getchar( ); switch (op) case +: z=x+y; break; case -: z=x-y; break; case *: z=x*y; break; case /: z=x/y; break; default: z=0; if(int)z!=0) printf(“%f%c%f=%fn“,x,op,y,z); else printf (“%c is not an operatorn“,op); ,运行jc4_3,实型数通常不使用z=0或z!=0的比较 可用if(int)z) 代替,2019/4/26,35,注意:,switch语句的书写格式:语句体本身必须用花括号括起;case和default后面如果有多条语句,则可以不必使用花括号;case和常量表达式之间必须有空格;default可以写在语句体的任何位置,也可以省略不写 break语句可以改变case的语句标号作用,终止后续case语句序列的执行。 switch语句和break语句结合,可以实现程序的选择控制(break语句还可以在循环语句中使用) 允许switch嵌套使用,但同一个switch语句中,任意两个case的常量表达式值不能相同。,2019/4/26,36,5.3 选择结构程序设计举例,【例5.5】求一元二次方程ax2+bx+c=0的根。,思路:一元二次方程的根取决于系数a,b,c 求根公式:,判别式d = b2- 4ac 当 d = 0时,方程有两个相等的实根: x1=x2=-b/(2*a) 当d 0时,方程有两个不相等的实根: x1=(-b+sqrt(d)/(2*a) x2=(-b-sqrt(d)/(2*a) 当d 0时,方程有两个虚根: x1=jp+ipi x2=jp-ipi,实部 jp=-b/(2*a) 虚部 ip=sqrt(-d)/(2*a),2019/4/26,37,算法:,2019/4/26,38,程序:,#include “math.h“ main( ) float a,b,c,d,x1,x2,lp,ip; scanf(“%f%f%f“, ,2019/4/26,39,程序(续):,else if (d1e-6) /* 不相等的实根 */ x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf(“has two real roots:n“) ; printf(“x1=%8.4f, x2=%8.4fn“,x1,x2); else /* 虚根 */ lp=-b/(2*a);ip=sqrt(-d)/(2*a); printf(“has two complex roots: n“); printf(“x1=%8.4f+%8.4fin“,lp,ip); printf(“x2=%8.4f-%8.4fin“,lp,ip); ,运行jc4_6,2019/4/26,40,举例(续):,【例5.6】输入年份,判别该年是否为闰年。,思路:年份year为闰年的条件为 能够被4整除,但不能被100整除的年份; 能够被400整除的年份。 只要满足任意一个就可以确定它是闰年。 例如: 1996年、2000年是闰年 1998年、1900年不是闰年,设定标志变量leap,只要符合其中一个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论