第4章 选择结构程序设计 选择结构是计算机科学用来描述自然界和社会生活中分支现象的手段。其特点是:根据所给定选择条件为真(即分支条件成立)与否,而决定从各实际可能的不同操作分支中执行某一分支的相应操作,并且任何情况下恒有“无论分支多寡,必择其一;纵然分支众多,仅选其一”的特性。
第4章 选择结构程序设计 4.1 关系运算符及表达式 4.2 逻辑运算符及表达式 4.3 条件运算符 4.4 单条件选择 if 语句 第4章 选择结构程序设计 4.1 关系运算符及表达式 4.2 逻辑运算符及表达式 4.3 条件运算符 4.4 单条件选择 if 语句 4.5 开关分支 switch 语句
4.1 关系运算符及表达式 1. 关系运算符 关系运算符都是双目运算符,共有如下6种: 第4章 选择结构程序设计 4.1 关系运算符及表达式 关系表达式是由关系运算符连接表达式构成的。 1. 关系运算符 关系运算符都是双目运算符,共有如下6种: >,<,>=,<=,==,!= 2. 关系表达式 由关系运算符组成的表达式,称为关系表达式。例如x>y、(x=5)<=y等。 关系表达式的值是整数0或1,其中0代表逻辑假;1代表逻辑真。
逻辑表达式是由逻辑运算符连接表达式构成的。 第4章 选择结构程序设计 4.2 逻辑运算符及表达式 逻辑表达式是由逻辑运算符连接表达式构成的。 1. 逻辑运算符 C语言中提供了3种逻辑运算符: (1) 单目逻辑运算符:!(逻辑“非”)。 (2) 双目逻辑运算符:&&(逻辑“与”)。 (3) 双目逻辑运算符:||(逻辑“或”)。 其中逻辑“与”&&的优先级大于逻辑“或”||,它们的优先级都小于逻辑“非”!。逻辑运算符具有自左至右的结合性。
第4章 选择结构程序设计 2. 逻辑表达式 由逻辑运算符组成的表达式称为逻辑表达式。 逻辑表达式的结果为1(结果为“真”时)或0(结果为“假“时)。 表达式a和表达式b进行逻辑运算时,其运算规则,见表4-1。
第4章 选择结构程序设计 表4-1 逻辑运算的真值表 a b !a !b a && b a || b 真 假
第4章 选择结构程序设计 3. 短路表达式 在由 && 和 || 运算符组成的逻辑表达式中,只对能确定整个表达式值所需要的最少数目的子表达式进行计算。也就是说,当计算出一个子表达式的值之后便可确定整个逻辑表达式的值时,后面的子表达式就不需要再计算了,整个表达式的值就是该子表达式的值。这种表达式也称为短路表达式。
例如:要判别某年是否为闰年,判定条件是符合下面二者之一者就是闰年: 能被4整除,但不能被100整除; 能被4整除又能被400整除。 上述条件可用逻辑表达式来表示: (year%4==0 && year%100!=0)|| year%400==0 表达式的值为真就是闰年,否则就是非闰年。
4.3 条件运算符 第4章 选择结构程序设计 条件运算符是C语言中唯一的三目运算符,条件表达式的一般格式为: 4.3 条件运算符 条件运算符是C语言中唯一的三目运算符,条件表达式的一般格式为: 表达式1 ? 表达式2 : 表达式3 条件运算符的执行过程是:先求解表达式1,当值为非0(真),则求解表达式2,此时表达式2的值就作为整个条件表达式的值;否则求解表达式3,此时表达式3的值就作为整个条件表达式的值。 条件运算符的优先级高于赋值运算符,但是低于关系运算符和算术运算符。条件运算符的结合性为自右至左。
第4章 选择结构程序设计 4.4 if 语句 单条件选择结构的特点是:所给定的选择条件(它可以是逻辑表达式也可以是关系表达式)的值如果为真,则执行为真时的分支;如果为假则执行为假时的分支。
4.4.1 If 语句的三种形式 if 语句是根据所给定的条件决定执行的操作,是“二选一”的分支结构。If 语句的一般格式为: 第4章 选择结构程序设计 4.4.1 If 语句的三种形式 if 语句是根据所给定的条件决定执行的操作,是“二选一”的分支结构。If 语句的一般格式为: if (表达式) { 语句序列1; } else 语句序列2;
1. if <表达式> 语句 当表达式为真时,执行语句, 表达式为假时跳过语句。 2. If 〈表达式〉 语句1 else 语句2 当表达式为真时,执行语句1,表达式为假时执行语句2。 无论如何,语句1与语句2每次只能有一个被执行。 语句 表达式 假(0) 真(非0) p 真 假 语句 A 真 假 p 真 假 语句1 表达式 语句1 语句2 语句2
else if <表达式m> 语句m else 语句n 其流程图见P69图4.6 只有三个表达式的if…else语句 3. if...else if 语句 if <表达式1> 语句1 else if<表达式2> 语句 2 else if <表达式3> 语句3 : : else if <表达式m> 语句m else 语句n 其流程图见P69图4.6 只有三个表达式的if…else语句 的N-S图见右图 if <表达式1> 语句1 else 语句4 表达式1 表达式2 表达式 3 语句1 语句2 语 句 4 真 假 假
使用条件语句注意: 1. if后面的<表达式 >一般为逻辑表达式或关系表达式,也可为整型 \ 实型 \ 字符型 \ 指针型数据, 如表达式的值为0, 系统按“假”处理, 若为非0 , 按“真”处理 2. 注意语句包含了分号; 3. 三种形式中的“语句”也可以有多个操作语句,此时须用花括号“{ }”将几个语句括起来成为一个复合语句. { }外不需另加 ; 4. Else总是与前面的最靠近它的if语句配对 5. 当if语句中的内嵌语句为赋值语句(且两个分支都给同一个变量赋值)时,可以用条件表达式代替if语句. if(8) x=3; else x=9; 例: if(‘a’) printf(“%d”, ‘a’) ;if(5) printf(“OK”); 是合法的 等价于 x=(8>0? 3:9);
条件分支嵌套就是在一个分支中可以嵌套另一个分支。 单条件选择 if 语句完整的嵌套格式为: if(表达式1) 第4章 选择结构程序设计 4.4.2 if 语句的嵌套 条件分支嵌套就是在一个分支中可以嵌套另一个分支。 单条件选择 if 语句完整的嵌套格式为: if(表达式1) if(表达式2) 语句序列1 ; else 语句序列2 ; else if(表达式3) 语句序列3 ; else 语句序列4 ;
4.5 开关分支switch语句 第4章 选择结构程序设计 C语言提供了switch多路选择语句。格式如下: switch(表达式) { case 常量表达式1 : 语句组1 ; [break]; case 常量表达式2 : 语句组2 ; [break]; … case 常量表达式n : 语句组n ; [break]; default : 语句组n+1 ; }
使用说明: 1. 表达式和常量表达式可为任何类型; 2. 执行过程:当表达式的值为某一常量表达式的值时,就执行此case语句,否则,执行default语句; 3. 各常量表达式的值必须各不相同; 4. 各case 语句出现的顺序可以不同; 5. 各常量表达式的值起标号作用,多个case可以共用一组执行语句; 6. 注意有或没有break语句的效果.
例: 编程实现:根据输入的成绩,打印出成绩的等级,90分以上为A,80-89分为B,70-79分为C…., 算法: 输入成绩score; i= score/10; i= 9, 打印A; i= 8, 打印B; i= 7, 打印C; i= 6, 打印D; i= 5,4,3,2,1,0, 打印E;
main( ) li5-switch1 { int i ,score; scanf(“%d”,&score); i=score/10; switch( i ) {case 9: printf(“A”); case 8: printf(“B”); case 7: printf(“C”); case 6: printf(“D”); case 5: case 4: case 3: case 2: case 1: case 0: printf(“E”); }}
main( ) li5-switch2 { int i ,score; scanf(“%d”,&score); i=score/10; switch( i ) {case 9: printf(“A”); break; case 8: printf(“B”); break; case 7: printf(“C”); break; case 6: printf(“D”); break; case 5: case 4: case 3: case 2: case 1: case 0: printf(“E”); break; }}
自己阅读P77例4.5, P80例4.7 P79例4.6 求ax2+bx+c=0方程的根(见图4.14) #include<math.h> main() {float a,b,c,d,disc,x1,x2,realpart,imagpart; scanf(“%f,%f,%f”,&a,&b,&c); printf(“The equation”); if(fabs(a)<=1e-6) printf(“is not a quatdratic”); else {disc=b*b-4*a*c; if (fabs(disc)<=1e-6) printf(“has two equal roots:%8.4\n”,-b/(2*a));
else if(disc>1e-6) {x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("has distinct real roots:%8.4 and %8.4f\n",x1,x2); } else {realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf("has complex roots:\n"); printf("%8.4f+%8.4fi\n",realpart,imagpart); printf("%8.4f-%8.4fi\n",realpart,imagpart);
关系运算符及表达式 逻辑运算符及表达式 条件运算符 单条件选择 if 语句 开关分支 switch 语句 上机中的问题:关系运算符及表达式…