本文由xjsir2010贡献
ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
第4章 选择结构程序设计 章
第4章 选择结构程序设计 章
4.1 关系运算符及其表达式 4.2 逻辑运算符及其表达式 4.3 条件运算符 4.4 单条件选择if语句 单条件选择 语句 4.5 开关分支 开关分支switch语句 语句 习题4
第4章 选择结构程序设计 章
4.1 关系运算符及其表达式
关系表达式是由关系运算符连接表达式构成的。 1. 关系运算符 1) 关系运算符 关系运算符都是双目运算符,共有如下6种: >,<,>=,<=,==,!= 分别是大于、小于、大于或等于、小于或等于、 等于和不等于。
第4章 选择结构程序设计 章 2) 运算符的优先级和结合性 前4种关系运算符的优先级别相同,
后2种也相同,前4 种高于后2种。关系运算符具有自左至右的结合性。 关系运算符、算术运算符和赋值运算符之间的优先级次序 为:算术运算符优先级最高,关系运算符次之,赋值运算 符最低。 2. 关系表达式 1) 关系表达式 由关系运算符组成的表达式称为关系表达式。 关系运算符两边的运算对象可以是C语言中任意合法 的表达式。例如,x>y,(x=5)<=y,x==y等。
第4章 选择结构程序设计 章 2) 关系表达式的值 关系表达式的值是整数0(代表结果为逻辑假)或 1(代表结果为逻辑真),在C语言中不存在专门的“逻 辑值”,此处请读者务必清楚。例如,关系表达式 (x=3)>(y=4)的值为0。 关系表达式常用在条件语句和循环语句中。 3) 举例 一般情况下,关系表达式用在选择结构或循环结 构的关系判断中,并不需要输出关系表达式的值,这 里我们为了了解关系表达式的内部运行机制,在例4-1 中可以看到关系表达式的值只能是0或1。
第4章 选择结构程序设计 章 【例4-1】关系表达式示例。 #include "stdio.h" main( ) { char x='m' , y='n' ; int n ; n=x<y ; printf("%d\n" , n) ; n=x==y-1 ; printf("%d\n" , n) ; n=('y'!='Y')+(5<3)+(y-x==1) ; printf("%d\n" , n) ; }
第4章 选择结构程序设计 章 运行结果: 1 1 2 通过上面的程序可以看出:关系运算的结果为 “真”时,值等于1;结果为“假”时,值等于0。
第4章 选择结构程序设计 章
4.2 逻辑运算符及其表达式
逻辑表达式是由逻辑运算符连接表达式构成的。 1. 逻辑运算符 1) 逻辑运算符 C语言中提供了3种逻辑运算符。 (1) 单目逻辑运算符:! (逻辑非)。 (2) 双目逻辑运算符:&& (逻辑与)。 (3) 双目逻辑运算符:|| (逻辑或)。
第4章 选择结构程序设计 章 2) 优先级和结合性 逻辑与“&&”的优先级大于逻辑或“||”,它们的 优先级都小于逻辑非“!”。逻辑运算符具有自左至右 的结合性。 逻辑运算符、赋值运算符、算术运算符、关系运 算符之间优先级的次序由高到低为! (逻辑非)、算术运 算符、关系运算符、&& (逻辑与)、|| (逻辑或)、赋值 运算符。
第4章 选择结构程序设计 章 2. 逻辑表达式 1) 逻辑表达式 由逻辑运算符组成的表达式称为逻辑表达式。逻辑运 算符两边的运算对象可以是C语言中任意合法的表达式。 2) 逻辑表达式的值 逻辑表达式的值为1(结果为“真”时)和0(结果为“假” 时)。 3) 逻辑运算规则 表
达式a和表达式b进行逻辑运算时,其运算规则见表 4-1。 第4章 选择结构程序设计 章 表4-1 逻辑运算的真值表
a 非 0 非 0 0 0 b 非 0 0 非 0 0 !a 0 0 1 1 !b 0 1 0 1 a && b 1 0 0 0 a || b 1 1 1 0
第4章 选择结构程序设计 章 例如: ch>='A' && ch<='Z' /* ch是大写字母时,表达式值为1,否则为0 */ (year%4==0 && year%100!=0) || year%400==0 /* year为闰年时,表达式值为1,否则为0 */ 3. 短路表达式 在由 && 和 || 运算符组成的
逻辑表达式中,C语言规定: 只对能够确定整个表达式值所需要的最少数目的子表达式进 行计算。也就是说,当计算出一个子表达式的值之后便可确 定整个逻辑表达式的值时,后面的子表达式就不需要再计算 了,整个表达式的值就是该子表达式的值。这种表达式也称 为短路表达式。
第4章 选择结构程序设计 章 【例4-2】执行语句: int a=3 , b=0 ; 问下面表达式运算后,a和b的值是多少? (1) !a && a+b && a++ (2) !a || a++ || b++ 分析: (1) 第一个表达式是一个由&&组成的逻辑表达式,从 左至右计算3个子表达式,只要有一个为0,就不再计算其 他子表达式。当计算!a的值为0时,
便可确定整个表达式的 值为0,因此后面的子表达式就不再计算了。所以,结果a 的值为3,b的值为0。 第4章 选择结构程序设计 章 (2) 第二个表达式是一个由 || 组成的逻辑表达式,从 左至右计算3个子表达式,只要有一个结果为真,则不再 计算后面的子表达式。第一个子表达式为!a,结果为0, 再计算a++结果为4,因此就不再计算后面的子表达式了。 所以,结果a的值为4,b的值为0。 一般情况下,逻辑表达式用在选择结构或循环结构的 关系判断中,并不需要输出逻辑表达式的值,这里我们为 了了解逻辑表达式的内部运行机制,在下例中将要输出逻 辑表达式的值,可以看到逻辑表达式的值只能是0或1。
第4章 选择结构程序设计 章 【例4-3】逻辑表达式示例。 #include "stdio.h" main( ) { int a=3 , b=4 , c=5 , x , y ; printf("%d\n" , a+b>c && b==c) ; /* a+b>c的值为1,b==c的值为0 */ printf("%d\n" , a || b+c && b-c); /* a || b+c的值为1,b-c的值为-1(非0) */
第4章 选择结构程序设计 章 printf("%d\n" , !(a>b) && !c || 1) ; /* !(a>b)的值为1,!c的值为0 */ rintf("%d\n" , !(a+b)+c-1 && b+c/2) ; /* !(a+b)+c-1的值为4,b+c/2的值为6 */ } 运行结果: 0 1 1 1
第4章 选择结构程序设计 章
4.3 条件运算符
1. 条件运算符 条件运算符“? :”是C语言中惟一的三目运算符。 条件运算符的优先级高于赋值运算符,但是低于 关系运算符和算术运算符。条件运算符的结合性为自 右至左。例如:
第4章 选择结构程序设计 章 ad?c:d 相当于 ad?c:d) 2. 条件表达式 1) 条件表达式 条件表达式的一般形式为 表达式1 ? 表达式2 : 表达式3
第4章 选择结构程序设计 章 2) 条件表达式的值 条 件 运算符的执 行顺序是 : 先求解表 达式1,若 为非 0(真),则求解表达式2,此时表达式2的值就作为整个条件表 达式的值。否则求解表达式3,此时表达式3的值就作为整个 条件表达式的值。 【例4-4】将大写字母转换为小写字母。 分析:如果要将大写字母转换为小写字母,首先应该判 断字符是否为大写字母,如果是大写字母,将大写字母转换 为小写字母。如果不是大写字母,则不应该作任何转换。该 转换可以使用if语句,也可以使用条件运算符。本例中,采 用条件运算符。
第4章 选择结构程序设计 章 #include "stdio.h" main( ) { char ch ; scanf("%c" , &ch) ; /* 输入一个字符,赋给变量c
h */ ch=(ch>=‘A’ && ch<=‘Z’) ? (ch+‘a’-‘A’) : ch ; /* 当字符为大写字母时,将其变为小写字母 */ printf("%c" , ch) ; }
第4章 选择结构程序设计 章
4.4 单条件选择 语句 单条件选择if语句
单条件选择结构是最常用的典型双分支选择结构, 其根本特点是:所给定的选择条件(它可以是逻辑表达 式,也可以是关系表达式)的值如果为真,则执行为真 时的分支;如果为假,则执行为假时的分支。其一般 形式如图4.1所示。
第4章 选择结构程序设计 章 如果 条件 {该(选择)条件成立吗?} 真 a1块 {条件成立时所执行的操作块,它一般为非空块} 假 a2块 {条件不成立时所执行的操作块,它可为空块}
第4章 选择结构程序设计 章
如果
条件 真 假 a1 块 a2 块
{该(选择)条件成立吗?} {条件成立时所执行的操作块,它一般为非空块} {条件不成立时所执行的操作块,它可为空块}
图4.1 单条件选择结构的流程图
第4章 选择结构程序设计 章 说明: (1) 这里的a1块和a2块可以是空操作块(简称空块, 也就是不作任何处理的操作块)。然而,如果a1、a2操 作块同时为空块的话,就失去了选择的意义。 (2) 为了养成良好的程序设计风格和习惯,如果必 须设立空分支时,就应该把它设在选择条件为假的相 应分支(即a2块)中。
第4章 选择结构程序设计 章 4.4.1 if语句 if语句是根据所给定的条件决定执行的操作,是 “二选一”的分支结构。if语句的一般格式为 if(表达式) { 语句序列1; } else { 语句序列2; }
第4章 选择结构程序设计 章 说明如下。 (1) if语句的执行过程是:首先进行表达式的运算, 如果表达式的值非0,则执行语句序列1;否则执行语句 序列2。 (2) 格式中表达式为C语言中任意合法的表达式,一 般为逻辑表达式或关系表达式。 (3) else及后面的语句序列可以省略。当语句序列1 和语句序列2为单语句时,可以省略花括号。当有多个 语句并列出现在控制语句中时,必须加花括号。
第4章 选择结构程序设计 章 【例4-5】输入两个整数,输出其中最大的数。 分析:有两个整数x和y,如果x大于y,那么x就是两个数 中较大的数,否则y就是两个数中较大的数。可以使用if语句 完成两个数大小的判定。 #include "stdio.h" main( ) { int x , y ; printf("input two number:") ; scanf("%d%d" , &x , &y) ; if(x>y) printf("max=%d" , x) ; else printf("max=%d" , y) ; }
第4章 选择结构程序设计 章 【例4-6】输入3个数a、b、c,要求按由小到大的 顺序输出。 分析:首先a和b进行比较,如果a大于b,将a和b互 换,b中存放的是较大的数,a中存放的是较小的数。 然后a和c进行比较,如果a大于c,则将a和c交换,a中 存放a和c中较小的数,此时a中存放的数是a、b、c中最 小的数(ab) {temp=a ; a=b ; b=temp ;} /* 如果a>b,则交换a和b */ if(a>c) {temp=a ; a=c ; c=temp ;} /* 如果a>c,则交换a和c */ if(b>c) {temp=b ; b=c ; c=temp ;} /* 如果b>c,则交换b和c */ printf("sort:%5.3f , %5.3f , %5.3f" , a , b , c) ; }
while语句的嵌套流程图 第4章 选择结构程序设计 章 4.4.2 if语句的嵌套 在进行程序设计时,经常要用到条
件分支嵌套。所谓 条件分支嵌套,就是在一个分支中可以嵌套另一个分支。 C语言中,单条件选择if语句内还可以使用if语句,这 样就构成了if语句的嵌套。内嵌的if语句既可以嵌套在if子 句中,也可以嵌套在else子句中,完整的嵌套格式为 第4章 选择结构程序设计 章 if(表达式1) if(表达式2) 语句序列1; else 语句序列2; else if(表达式3) 语句序列3; else 语句序列4; 可以根据实际情况使用上面格式中的一部分,并且 可以进行if语句的多重嵌套。
第4章 选择结构程序设计 章 【例4-7】输入3个整数,输出最大数。 分析:输入3个整数分别赋给a、b、c,如果a小于b, b小于c,则c为最大数;如果a小于b,b大于c,则b为最 大数;如果a大于b,a小于c,则c为最大数;如果a大于b, a大于c,则a为最大数。可以使用一个完整的if…else嵌套 实现上述的算法。
第4章 选择结构程序设计 章 #include "stdio.h" main( ) { long a,b,c; printf("input three number : "); scanf("%ld%ld%ld",&a,&b,&c); if (a=85) printf("yours: A\n"); else if(score>=70) printf("yours: B\n"); else if(score>=60) printf("yours: C\n"); else printf("yours: D\n"); }
第4章 选择结构程序设计 章 【例4-9】输入一个字符,根据输入的字符在屏幕上 显示不同的信息。 分析:如果输入的字符是“b”,则响铃(PC喇叭响发 出嘟的响声);如果输入的字符为“a”,则屏幕上显示字 符串“YES!”;如果输入其他字符,则屏幕上显示“bye!”, 然后结束程序。可以使用if…else的嵌套实现上面的算法。 第4章 选择结构程序设计 章 #include "stdio.h" main( ) { char ch; printf("please input a char : "); ch=getchar( ); if (ch=='b') printf("\a"); /* 如果输入小写字母b,则响铃 */ else if (ch=='a') printf("YES!"); else printf("bye! \n"); }
第4章 选择结构程序设计 章 使用if语句嵌套时,要注意else与if的配对规则。
C语 言规定:else与最近的、第一个没有配对的且为可用的if配 对。 【例4-10】有分段函数: 编写程序,输入一个x值,计算输出相应的y值。 分析:本例中出现了一个分段函数,一般情况下分段 函数的处理要使用if…else的嵌套,下面提供的程序1中,如 果x小于0,则y=x;如果x等于0,则y=0;如果x大于0,则 y=x*x+1。程序2、3、4对程序1进行了修改,但是程序3和 4是错误的,请读者一定注意if和else的配对关系。
第4章 选择结构程序设计 章 程序1: #include "stdio.h" main( ) { int x,y; printf("请输入一个整数:"); scanf("%d",&x); if(x<0) y=x;
第4章 选择结构程序设计 章 /* 当x<0时,将x赋给变量y */ else if(x==0) y=0; /* 当x==0时,将0赋给变量y */ else y=x*x+1; /* 当x>0时,将x*x+1赋给变量y */ printf("y=%d",y); }
第4章 选择结构程序设计 章 程序2:将上面程序的if语句(程序第7~9行)改为 if(x>=0) if(x>0 ) y=x*x+1; else y=0; else y=x; 程序3:将上述if语句改为 y=x; if(x!=0) if(x>0) y=x*x+1; else y=0; /* 此时else和最近的if配对,即x<0时y=0 */
第4章 选择结构程序设计 章 程序4:将上述if语句改为 y=0; if(x>=0) if(x>0) y=x*x+1; else y=x; /* 此时else 和最近的if配对,即x==0时y=x */ 程序1和程序2是正确的,程序3和程序4的错误在 于else和最近的if配对,不会和最上面的if配对。
第4章 选择结构程序设计 章
4.5 开关分支 开关分支switch语句 语句
if语句只提供两路选择,但在解决多路选择时非常 不便(例如根据学生成绩统计各分数段的学生人数),这 时,就可以采用多条件多分支选择结构进行程序设计。
第4章 选择结构程序设计 章 C语言提供了switch多路开关分支语句,其格式为 switch(表达式) { case 常量表达式1 : 语句组1 ; case 常量表达式2 : 语句组2 ; case 常量表达式n : 语句组n ; default : 语句组n+1 ; } 说明如下。 (1) switch后面的表达式,可以为任何类型,但必 须与常量表达式类型匹配。 (2) 当表达式的值与某一个case后面的常量表达式 相等时,就执行此case后面的语句,若没有匹配的常量 表达式,就执行default后面的语句。
第4章 选择结构程序设计 章 (3) 每一个常量表达式的值都是惟一的,即常量表达式 不能重复出现。但是各个case和default(default之后有break语 句时)的次序是任意的。 (4) case后面的语句结束时,会执行下一个case后面的语 句,即多个case可以共用一组执行语句。因此,若要跳到 switch语句外面,则必须借助break语句。例如: switch(表达式C) { case 'a' : x++; case 'b' : x++; default : total + + ; }
第4章 选择结构程序设计 章 在此开关分支语句中,如果表达式C的取值为 'a',则3个 分支都执行;如果表达式C的取值为 'b',则只执行后面的两 个分支(即x + +和total + +);如果表达式C的取值既不为 'a'也 不为 'b',则只执行最后的一个分支total + +。 (5) 尽管最后一个分支之后的break语句可以省略,但是, 在最后一个分支之后有break语句是程序设计的一个良好习惯, 建议保留它。因为编写的程序还需要本人或他人在以后进行 维护,例如要在最后一个分支之后增加几个case分支,如果 没有注意到最后一个分支后没有break语句,则原来的最后一 个分支就会受新增分支的干扰而失效。
第4章 选择结构程序设计 章 (6) default是可选项,即当未到匹配的case常量表达式 时,会跳到switch外。也就是说,如果没有default部分,则当 表达式的值与各case的判断值都不一致时,则程序不执行该结 构中的任何部分。例如: switch(表达式C) { case 0 : x + =2 ; break ; case 1 : y + =2 ; break ; case 2 : z + =2 ; break ; }
第4章 选择结构程序设计 章 当表达式C的值既不是0,也不是1或2时,则程序 不执行该开关分支中的任何语句。 为了使程序能进行错误检查或逻辑检查,应该使 用default分支。例如: switch(ch) { case 'x' : printf("OK!\n") ; break ; case 'y' : printf("NO!\n") ; break ;
}
第4章 选择结构程序设计 章 当ch的值是其他字符时,则什么都不输出。如果加上 default分支,且在default分支中输出一定的提示信息,那 么,当遇到default分支时,就可输出提示信息。 增加default分支会给逻辑检查带来很多方便。例如,用 switch语句来处理数目固定的条件,而且认为这些条件之 外的值都属于逻辑错误,则可以增加一个default分支来识 别逻辑错误。 (7) case后面的语句块可以不要花括号。另外,如果
switch中只有一个case常量表达式,则可以省略花括号。
第4章 选择结构程序设计 章 (8) 在swtich分支结构中,如果对表达式的多个取 值都执行相同的语句组,则对应的多个case语句可以共 同使用同一个语句组。例如,下面的程序段中,“case 'a'”、“case 'b'”、 “case 'c'”均共用“case 'c'”的语句: switch(grade) { case 'a' : case 'b' : case 'c' : printf(" pass !\n") ; break ; /* 前3个case共用一个printf语句 */ case 'd' : printf(" no pass !\n") ; break ; default : printf(" error !\n") ; break ; }
第4章 选择结构程序设计 章 【例4-11】根据学生成绩,输出不同的等级A、B、C、 D或E。 分析:可以使用if…else语句输出学生成绩的等级, 本例中使用switch语句实现输出学生成绩的等级,首先将 学生的成绩存入变量score中,然后将score/10的值赋给变 量grade,如果grade的值是10或9,学生成绩等级为“A”; 如果grade的值为8,学生成绩等级为“B”;依次类推,可 以得到其他成绩的等级。
第4章 选择结构程序设计 章 #include "stdio.h" main ( ) { int score, grade; printf("input a score : "); scanf("%d",&score); grade=score/10; switch (grade)
第4章 选择结构程序设计 章 { case 10: case 9: printf("A"); break; /* 成绩在90~100分之间为优 */ case 8: printf("B"); break; /* 成绩在80~89分之间为良 */ case 7: printf("C"); break; /* 成绩在70~79分之间为中 */
第4章 选择结构程序设计 章 case 6: printf("D"); break; /* 成绩在60~69分之间为及格 */ case 5: case 4: case 3: c
ase 2: case 1: case 0: printf("E"); break; /* 成绩在0~59分之间为不及格 */ default :printf("you are wrong! \n"); break; /* break可省略 */ } }
第4章 选择结构程序设计 章 【例4-12】为某运输公司编制计算运费的程序。运 行程序时,由用户输入运输距离s和运量w,程序输出 单价p和总金额t。运费标准为: 当s<500 km时,没有优惠,单价为5元/(吨・公里); 当500 km≤s<1000 km时,优惠2%; 当1000 km≤s<2000 km时,优惠5%; 当2000 km≤s<3000 km时,优惠8%; 当s≥3000 km时,优惠10%。
第4章 选择结构程序设计 章 使用开关语句swtich编写程序如下: #include main( ) { int s , w , g ; float p , t ; printf(" input the distance and weight : ") ; scanf(" %d %d " , &s , &w ) ; g = s / 500 ; switch(g)
第4章 选择结构程序设计 章 { case 0 : case 1 : case 2 : case 3 : case 4 : case 5 : default : p = 5 ;
break ; p = 5* 0.98 ; break ; p = 5* 0.95 ; break ; p = 5* 0.92 ; break ; p = 5* 0.9 ; break ;
} t=p*w*s; printf("the unit price is %.3f \n the total price is %.3f \n" , p , t) ; }
第4章 选择结构程序设计 章 如果用单条件if语句编写,则程序如下: #include main( ) { int s , w ; float p , t ; printf(" input the distance and weight : ") ; scanf(" %d %d " , &s , &w ) ;
第4章 选择结构程序设计 章 if(s < 500) p=5; else if(s>=500 & s<1000 ) p = 5 * 0.98 ; else if(s>=1000 & s<2000 ) p = 5 * 0.95 ; else if(s>=2000 & s<3000 ) p = 5 * 0.92 ; else p = 5 * 0.9 ; t=p*w*s; printf("the unit price is %.3f \n the total price is %.3f \n" , p , t) ; }
第4章 选择结构程序设计 章
习题4 习题
4.1 执行下面的程序段后,b的值为( )。 int x=35 ; char z='A' ; int b ; b=((x&&15) && (z<'a')) ; A) 0 B) 1 C) 2 D) 3 4.2 设 a=5, b=6,c=7,d=8 ,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论