C语言程序设计 第五章 选择结构程序设计
5.1 if - else 分支语句 5.2 if - else if 分支语句 5.3 switch 开关分支语句 5.4 习题
5.1 if - else 分支语句 分支结构是程序的基本结构。所谓分支结构,就是根据不同的条件,选择不同的程序块(分程序)进行处理。 在 C 语言程序中,条件分支结构是通过 if 语句和 switch 语句实现的。if 语句有 if、if-else 和 if-else if 三种形式。
5.1 if - else 分支语句 格式: if(表达式e) { 语句S1; 真 假 } else 语句S2; S1、S2是一个语句或分程序(程序块),也可以是空语句。 功能:e 的结果为真(非0), 则执行 S1。 e 的结果为假 (0) , 则执行 S2。
5.1 if - else 分支语句 例:输入任意两个数,求其最小值。 Please input a and b: 100,99〈CR〉 #include “stdio.h” main( ) { int a,b; printf(“\n Please input a and b:”); scanf(“%d,%d”,&a,&b); if ( a < b ) printf(“min=%d”,a); else printf(“min=%d”,b); } Please input a and b: 100,99〈CR〉 min=99 运行程序:
5.1 if - else 分支语句 格式: 功能: e 的结果为真(非0), 则执行 S。 if ( 表达式e ) { S; } 假 真
5.1 if - else 分支语句 Please input a:99 〈CR〉 OK! #include “stdio.h” main( ) { int a; printf(“\n Please input a:”); scanf(“%d”,&a); if ( a %3 = = 0 ) printf(“OK!”); } 运行程序 Please input a:99 〈CR〉 OK!
5.1 if - else 分支语句 √ × 找出错误的if语句: (1) if (x>y); (2) if (x>y) a=10 else a=100; (3) if (x>=y) a=10; printf(“%d”,a); else a=100; (4) if (5) a=10; √ ×
5.1 if - else 分支语句 条件分支的嵌套 条件分支嵌套就是在一个分支中包含(嵌套)另一个分支。 分支嵌套应注意: 程序的走向,即程序的入口和出口、执行部分和非执行(跳出)部分。
5.1 if - else 分支语句 Please input x, y, z: 100 5 29〈CR〉 min=5 main( ) { int x,y,z,min; printf(“Please input x, y, z :”); scanf(“%d %d %d”,&x,&y,&z); if ( x <y ) { if ( x<z ) min=x; else min=z; } else { if ( y<z ) min=y; else min=z; printf(“\n min=%d”,min); 运行程序 Please input x, y, z: 100 5 29〈CR〉 min=5
5.1 if - else 分支语句 答案: B 例:假定a=b=c=0, x=35,下列程序段执行后, x的值是: if (!a) if (b); if (c) x=3; else x=4; A) 34 B) 4 C)35 D)3 答案: B
5.2 if-else if 分支语句 if ( e1 ) S1; else if ( e2 ) S2; else if ( e3 ) 其一般形式为: 假 真 …... e1 e2 e3 en S1 Sn+1 S2 S3 Sn if ( e1 ) S1; else if ( e2 ) S2; else if ( e3 ) S3; .... else if ( en ) Sn; else Sn+1;
5.2 if-else if 分支语句 #include “stdio.h” 例5-3:计算并输出y的值 #include “math.h” 3x-1 x<0 6x2+9x-5 0<=x<10 y= 10<=x<25 x x>=25 #include “stdio.h” #include “math.h” void main( ) { float x,y; scanf(“%f”,&x); if (x<0) y=3*x-1; else if (x<10) y=6*x*x+9*x-5; else if(x<25) y=sqrt(9*x+10); else y=x; printf(“%f,%f”,x,y); }
例 5-4 :学生成绩分A、B、C、D、E 五等。任给一个成绩,判断它属于哪一等,用 if-else if 分支语句编程。 main( ) { float score; printf(“\n Enter a score(0-100):”); scanf(“%f”,&score); if (score>=90) printf(“A \n”); else if (score>=80) printf(“B \n”); else if (score>=70) printf(“C \n”); else if (score>=60) printf(“D \n”); else printf(“E \n”); }
5.3 switch 开关分支 在计算机程序设计中,实际问题常常需要用到多分支的选择。 if 语句只能有两个分支可供选择,不能满足多分支的需要。 if-else if 嵌套形式可以满足要求。但也可选用switch语句,switch是多分支选择语句。
5.3 switch 开关分支 开关分支执行时根据条件的取值来选择程序中的一个分支。switch 分支语句形式如下: e S n+1 S 1 S 2 S n e=c1 …... e=c2 e=cn e=其它(default) switch ( e ) { case 判断值c1: S1; break; case 判断值c2: S2; break; …… case 判断值cn: Sn; break; default : Sn+1; break; } 其中, e是表达式。c1、c2...cn是常量表达式。S1、S2…Sn、Sn+1是一个语句或程序块。
5.3 switch 开关分支 例: 输出不同工资水平的税率。 void main( ) { char a; 例: 输出不同工资水平的税率。 void main( ) { char a; printf(“Please input the salary level \n ”); printf(“Between 1 to 5, which is char type. \n”); scanf(“%c”,&a); switch(a) { case ‘1’: printf(“taxis=60% \n”);break; case ‘2’: printf(“taxis=40% \n”);break; case ‘3’: printf(“taxis=20% \n”);break; case ‘4’: printf(“taxis=8% \n”);break; case ‘5’: printf(“taxis=0% \n”);break; default: printf(“Error”); }
5.3 switch 开关分支 使用 switch-case 分支语句时,应注意以下几点: switch 后面的e表达式,可以是整型常量或变量、字符型常量或变量、枚举类型表达式。其结果值必须是整型或字符型。 case后面的ci 为常量表达式,可以是一个整型、字符型或枚举常量。 各case 的次序是任意的 (default往往放在最后),但各case后的值必须不同。 default部分可以不要, 如果没有default部分, 则当e表达式的值与各case后的ci常量表达式的值都不一致时, 则程序不执行该结构中的任何部分。
5.3 switch 开关分支 各分支语句中的 break 语句作用是控制程序退出 switch 结构。若程序没有break语句,则程序将继续执行下面一个case中的程序块。 例:switch ( c ) { case ‘A’: u++; case ‘a’: l++; default: s++; } 没有break; 若c的取值是A,则三个分支即 u++、l++、 s++都被执行 若c的取值是a,则最后两个分支即 l++、s++被执行 若c的取值即不是A也不是a,则只执行 s++
5.3 switch 开关分支 在开关分支语句中,最后的 break语句也可以省略。 可以省略 switch ( e ) { case c1: S1; break; case c2: S2; …… case cn: Sn; default : Sn+1; } 可以省略
5.3 switch 开关分支 在switch开关分支语句结构中, 如果几种情况(多个表达式取值)都执行相同的程序块时, 则对应的多个case可共同使用同一个程序块。 程序中case 1、 case 2 和 case 3共用case 3语句。 switch ( c ) { case 1: case 2: case 3: printf(“taxis=30% \n”); break; case 4: printf(“taxis=8% \n”); break; default : printf(“taxis=0% \n”); break; }
5.3 switch 开关分支 switch语句用来实现多分支结构,条件判断如果有两个以上基于同一个数据类型变量的条件表达式时,选用 switch 语句比选用if-else if 语句的嵌套形式更方便。 例: 根据百分成绩,输出等级成绩 A B C D E。用switch分支语句编程。
5.3 switch 开关分支 input grade (0-100):89 <CR> grade B 运行程序 void main( ) { int c, grade; printf("input grade(0-100): "); scanf("%d",&grade); if (grade>100|| grade< 0) printf("wrong grade\n"); else { c=grade/10; switch ( c ) { case 6: printf("grade D\n"); break; case 7: printf("grade C\n"); break; case 8: printf("grade B\n”); break; case 9: case 10: printf("grade A\n"); break; default: printf(“grade E\n”); break: } input grade (0-100):89 <CR> grade B 运行程序
5.3 switch 开关分支 例5-7: 用if-else if根据百分成绩, 输出等级 A B C D。 >100或者<0: 出错, 90-100: A, 80-89: B, 70-79: C, 60-69: D, <60: 不及格。 void main( ) { int grade; printf("input grade(0-100):"); scanf(“%d”,&grade); if(grade>100 || grade< 0) printf("wrong grade\n"); else if(grade>=90) printf("grade A\n"); else if(grade>=80) printf("grade B\n"); else if(grade>=70) printf("grade C\n"); else if(grade>=60) printf("grade D\n"); else printf("failed\n"); }
5.3 switch 开关分支 缩排:良好的写作习惯 缩排是书写程序的一种方法。即语句相对于上一条语句后退若干个字符位置的书写方法(像写文章,每个段落的开始均缩进两个字的位置)。 缩排的目的是使源程序的层次清晰明了,增加源程序的可读性。
5.3 switch 开关分支 例如:在分支程序中,用缩排的书写方法,可清楚的看出程序的条件为真、条件为假时,程序的分支情况。 main( ) { int x,y,z,max; printf(“\n Please input x,y,z :”); scanf(“%d %d %d”,&x,&y,&z); if ( x >y ) { if ( x>z ) max=x; else max=z; } else { if ( y>z ) max=y; else max=z; printf(“\n max=%d”,max); main( ) { int x,y,z,max; printf(“\n Please input x,y,z :”); scanf(“%d %d %d”,&x,&y,&z); if ( x >y ) { if ( x>z ) max=x; else max=z; } else { if ( y>z ) max=y; else max=z; printf(“\n max=%d”,max);
5.4习题 5.1 什么是算术运算?什么是关系运算?什么是逻辑运算? 5.1 什么是算术运算?什么是关系运算?什么是逻辑运算? 5.2 C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”? 5.3 写出下面各逻辑表达式的值。设a=3,b=4,c=5。 (1) a+b>c && b==c (2) a||b+c && b-c (3) !(a>b) && !c||1 (4) !(x=a) && (y=b) && 0 (5) !(a+b)+c-1 && b+c/2
5.4习题 5.4 有3个整数a、b、c,由键盘输入,输出其中最大的数。 5.5 有一函数: x (x<1) 5.5 有一函数: x (x<1) y = 2x-1 (1≤x<10) 3x-11 (x≥10) 写一程序,输入x,输出y值。 5.6 给一个不多于5位的正整数,要求:①求出它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字,例如原数为321,应输出123。