y) printf("%d",x); else printf("%d",y);"> y) printf("%d",x); else printf("%d",y);">

Presentation is loading. Please wait.

Presentation is loading. Please wait.

第4章 选择结构程序设计 二分支选择结构 多分支选择结构 P A B 真 假 k A1 A2 Ai An k=k2 k=k1 k=kn

Similar presentations


Presentation on theme: "第4章 选择结构程序设计 二分支选择结构 多分支选择结构 P A B 真 假 k A1 A2 Ai An k=k2 k=k1 k=kn"— Presentation transcript:

1 第4章 选择结构程序设计 二分支选择结构 多分支选择结构 P A B 真 假 k A1 A2 Ai An k=k2 k=k1 k=kn
第4章 选择结构程序设计 P A B 二分支选择结构 k A1 A2 Ai An k=k2 k=k1 k=kn k=ki ... 多分支选择结构

2 §4.1 if 语句 空 语句 表达式 Y N 语句2 语句1 表达式 Y N 4.1.1 if语句的三种形式 1.if(表达式)语句
例:if (x>y) printf("%d",x); 语句 表达式 Y N 2.if(表达式)语句 1 else 语句2 语句2 语句1 表达式 Y N 例:if (x>y) printf("%d",x); else printf("%d",y);

3 N 表达式1 表达式2 语句2 表达式m 语句m 语句n Y …… 语句1 3.if(表达式1) 语句1
else if(表达式2) 语句 …… else if(表达式m) 语句m else 语句n 例:if (salary>1000) index=0.4; else if (salary>800) index=0.3; else if (salary>600) index=0.2; else if (salary>400) index=0.1; else index=0; N 表达式1 表达式2 语句2 表达式m 语句m 语句n Y …… 语句1

4 各有一个分号 说明: ⑴ if后面的“表达式”一般为逻辑表达式或关系表达式, 系统对表达式的值进行判断,若为0按“假”处理,若
为非0,按“真”处理。 因此,表达式的类型不限于逻辑表达式,可以是任意的 数值类型(包括整型,实型,字符型,指针型数据)。 如: if(3) printf(“O.K.”); 是合法的。 if('A') printf("%d",'a');是合法的。 如: if (x>0) printf("%f",x); else printf("%f",-x); 各有一个分号 ⑵ 后面两种形式的if语句中,每个else前面有一个分 号,不要错认为是两个语句。

5 ⑶ if 和else后面可以使用复合语句,即用“{}”将n个 语句括起来。
例: if (a+b>c && b+c>a && c+a>b) { s=0.5*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("area=%6.2f",area); } else printf("it is not a triangle");

6 if(a>0) printf("%5.2f\n",a); }
例1.输入一个数,若大于零则输出。 a>0 Y N 输出a main( ) { float a; scanf("%f",&a); if(a>0) printf("%5.2f\n",a); }

7 if(a>b) { t=a;a=b;b=t; } printf("%5.2f,%5.2f ",a,b); }
例2.输入两个实数,按由小到大次序输出。 方法1: a>b yes no 交换a,b t a b main() { float a,b,t; scanf("%f,%f ",&a,&b); if(a>b) { t=a;a=b;b=t; } printf("%5.2f,%5.2f ",a,b); }

8 if(a>b) printf("%f,%f\n",b,a); else printf("%f,%f\n",a,b); }
方法2: a>b yes no 输出b,a 输出a,b main() { float a,b; scanf("%f,%f",&a,&b); if(a>b) printf("%f,%f\n",b,a); else printf("%f,%f\n",a,b); }

9 scanf("%f,%f,%f",&a,&b,&c); if(a>b) { t=a;a=b;b=t;}
例3.输入三个数,按由小到大顺序输出。 t 34 34 a b c 34 12 17 12 17 34 34 main( ) { float a,b,c,t; scanf("%f,%f,%f",&a,&b,&c); if(a>b) { t=a;a=b;b=t;} if(a>c) { t=a;a=c;c=t;} if(b>c) { t=b;b=c;c=t;} printf("%5.2f,%5.2f,%5.2f",a,b,c); }

10 4.1.2 if语句的嵌套 在 if 语句中又包含一个或多个 if 语句称为 if语句的嵌套。 if ( ) if ( ) 语句1
else 语句2 else if ( ) 语句3 else 语句4 说明:应注意 if 与 else 的对应关系,else总是与它上面最近的 if 配对,若if与 else 的数目不一致,可以加{ }来确定配对关系。 为明确匹配关系,避免匹配错误,强烈建议:将内嵌的if语句,一律用花括号括起来。 内嵌 if 语句 内嵌 if 语句

11 Y= -1 (X<0) 0 (X=0) 1 (X>0) 例4:有一函数 输入一个X值,输出Y值 main( )
{ int x,y; scanf("%d",&x); if(x<=0) if (x= =0) y=0; else y=-1; else y=1; printf("x=%d,y=%d\n",x,y); } x<=0 Y N x= =0 y=0 y=-1 y=1

12 if (x<0) y= -1; else if (x= =0) y=0; else y=1; y= -1; if (x!=0) if (x>0) y=1; else y=0; y=0; if (x>=0) if (x>0) y=1; else y= -1; { } { }

13 N s>=90 s>=80 s>=60 Y s>=70 D E A B C
例5 编写程序,根据输入的学生成绩,给出相应的等级。假设等级划分如下: 90~100分 等级为A; 80~89分 等级为B; 70~79分 等级为C; 60~69分 等级为D; 0~59分 等级为E。 N s>=90 s>=80 s>=60 D E Y s>=70 A B C

14 main() { int s; printf("Enter a score(0-100): "); scanf("%d",&s); printf("score=%d,",s); if (s>=90) printf("grade is A.\n"); else if (s>=80) printf("grade is B.\n"); else if (s>=70) printf("grade is C.\n"); else if (s>=60) printf("grade is D.\n"); else printf("grade is E.\n"); }

15 由条件运算符构成的选择结构 1. 一般形式:表达式 1 ? 表达式 2 : 表达式 3 2. 执行过程:如果表达式1为真,则条件表达式取表 达式2的值,否则取表达式3的值。 if (a>b) max=a; else max=b; 推广开来,若在if-else语句中,当表达式为“真”和“假”时,都只执行一个赋值语句且给同一个变量赋值时,均可以用简单的条件运算符来处理。 max=(a>b)?a:b;

16 例6:输入一个字符,判断它是否为大写字母,如果是,将它转换成小写字母,如果不是,不转换。然后输出最后得到的字符。
ch大写? Y N ch=ch+32 ch=ch main( ) { char ch; scanf("%c",&ch); ch=(ch>= 'A '&& ch<= 'Z ')?(ch+32):ch; printf("%c",ch); }

17 §4.2 switch语句 一.一般形式: switch (表达式) { case 常量表达式1:语句1 case 常量表达式2:语句2    case 常量表达式n:语句n default :语句n+1 } ……

18 二.说明: (1) switch后面括弧内的“表达式”,可以是任意类型的 表达式。 (2) 当表达式的值与某一个case后面的常量表达式 的 值相等时,就执行此case 后面的语句,若所有的 case 中的常量表达式的值都没有与表达式的值匹 配的,就执行default后面的语句。 (3) 每一个case 的常量表达式的值必须互不相同,否 则就会出现互相矛盾的现象。 (4) 各个case的出现次序不影响执行结果。

19 (5) 多个case可以供用一组执行语句。如:
case 'A ': case 'B ': case 'C ':printf(">60\n"); (6) 执行完一个case 后面的语句后,流程控制转移到 下一个case 继续执行。 “case常量表达式”只是起 语句标号的作用,并不是在该处进行条件判断。

20 switch(grade) { case 'A': printf("85~100\n"); case 'B': printf("70~84\n"); case 'C': printf("60~69\n"); case 'D': printf("<60\n"); default : printf("error\n"); } break; break; break; break; 若grade='A' , 则输出结果为: 85~100 若grade=' A ' ,则将输出: 85~100 70~84 60~69 <60 error break语句可以使流程跳出switch结构,继续执行switch语句下面的语句

21 { case 常量表达式1:语句组1; break; case 常量表达式2:语句组2; break;
三、完整的switch语句形式: switch (表达式) { case 常量表达式1:语句组1; break; case 常量表达式2:语句组2; break;    case 常量表达式n:语句组n; break; [default :语句组; [break;]] } …… 系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。

22 执行过程: switch 表达式 语句组1 语句组2 语句组n 语句组 …... E 1 E 2 En default case

23 根据score确定分数段t=score/10
例7. 给一百分制成绩,要求输出成绩等级'A','B','C','D','E'。90分以上为'A' ,80-89分为'B',70-79分为'C',60-69分为'D',60分以下为'E'。 根据score确定分数段t=score/10 grade =‘A’ =‘B’ =‘C’ grade=‘E’ =‘D’ 8 7 6 5 4 3 2 1 读入学生成绩score score<0 ||score>100 Y N 输出grade 输入数据有误,结束 109

24 if ((score>100) ¦¦(score<0)) printf("\ndata error\n"); else
switch (t) { case 10: case 9 : grade='A';break; case 8 : grade='B';break; case 7: grade='C';break; main( ) {int score,t; char grade; scanf("%d",&score); if ((score>100) ¦¦(score<0)) printf("\ndata error\n"); else { t=score/10; case 6: grade='D' ; break; case 5: case 4: case 3: case 2: case 1: case 0: grade='E' ; } printf("%d,%c\n",score,grade); } }

25 if ((score>100) ¦¦(score<0)) printf("\ndata error\n"); else
main( ) {int score,t; char grade; scanf("%d",&score); if ((score>100) ¦¦(score<0)) printf("\ndata error\n"); else { t=score/10; switch (t) { case 10: case 9 : grade='A';break; case 8 : grade='B';break; case 7: grade='C';break; case 6: grade='D' ; break; default: grade='E' ; } printf("%d,%c\n",score,grade);

26 §4.3 程序举例 例1.任给三角形的三边,判断该三角形是等边、等腰、直角或一般。 分析: 用变量a, b, c表示三角形三条边的长
§ 程序举例 例1.任给三角形的三边,判断该三角形是等边、等腰、直角或一般。 分析: 用变量a, b, c表示三角形三条边的长 a,b,c 构成三角形? a,b,c相等 存在两边相等 等边三角形 存在两边和的平方等于第三边的平方 直角 三角形 一般 不能构成三角形 等腰三角形

27 #include "math.h" main( ) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a+b>c && b+c>a && c+a>b) {if(a= =b&&b= =c) printf(“等边三角形\n"); else if(a= =b ¦¦ b= =c ¦¦ a= =c) printf(“等腰三角形\n"); else if(a*a+b*b= =c*c ¦¦ a*a+c*c= =b*b ¦¦ b*b+c*c= =a*a) printf(“直角三角形\n"); else printf(“一般三角形\n"); } else printf(“输入错误!\n");

28 例2. 写程序,判断某一年是否闰年。 Y N leap=0 leap=1 leap 输出“闰年” 输出“非闰年”
例2. 写程序,判断某一年是否闰年。 闰年的条件是符合下面二者之一: 1.能被4整除,但不能被100整除; 2.能被400整除。 year被4整除 Y N year被100整除 leap=0 leap=1 year被400整除 leap 输出“闰年” 输出“非闰年”

29 方法1:if 语句的嵌套 main( ) { int year,leap; scanf("%d",&year);
输出“闰年” 输出“非闰年” main( ) { int year,leap; scanf("%d",&year); if ( year%4= =0 ) if ( year%100= =0) if ( year%400 = =0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf("%d is a leap year .\n ",year); else printf("%d is not a leap year .\n ",year); }

30 else if ( year%100 !=0) leap=1; else if ( year%400 !=0) leap=0;
N year被100整除 leap=0 leap=1 year被400整除 leap 输出“闰年” 输出“非闰年” 方法2:if 语句的第三种形式 main( ) { int year,leap; scanf("%d",&year); if ( year%4 !=0 ) leap=0; else if ( year%100 !=0) leap=1; else if ( year%400 !=0) leap=0; else leap=1; if (leap) printf("%d is ",year); else printf("%d is not",year); printf("a leap year .\n"); }

31 方法3:逻辑表达式关系表达式的应用 符合闰年的条件是下列两者之一: 1、能被4整除,但不能被100整除 2、能被4整除,又能被100整除
year%4==0 && year%100!=0 || year%400==0 main( ) { int year; scanf("%d",&year); if ( year%4==0 &&year%100!=0 || year%400==0 ) printf("%d is a leap year!\n",year); else printf("%d is not a leap year!\n",year); }

32 例3: 求 方程的解 有以下几种可能: ,不是二次方程。否则 ,有两个相等实根。 ,有两个不等实根。 ,有两个共轭复根。

33 Y N 输出非二次方程 输出两 个相等 的实根: 输出两个实根: x1,x2 输出两个复根: p+qi, p-qi 计算复数的实部和虚部
实部: 虚部: Y N 输出非二次方程 输出两 个相等 的实根: 输出两个实根: x1,x2 输出两个复根: p+qi, p-qi

34 #include "math.h" main( ) {float a,b,c,disc,x1,x2,p,q; scanf("%f,%f,%f",&a,&b,&c); disc=b*b-4*a*c; if (fabs(a)<=1e-6) printf("no\n"); else if (fabs(disc)<=1e-6 ) printf("%8.4f\n",-b/(2*a)); else if (disc>1e-6 ) { x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("%8.4f and %8.4f\n",x1,x2);}

35 else { p=-b/(2*a); q=fabs(sqrt(-disc)/(2*a)); printf("%8.4f+%8.4f i \n", p, q); printf("%8.4f-%8.4f i \n", p, q); }

36 例4 已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下(计量单位:元):
求员工这一个月的工资。

37 算法设计要点: 为使用switch语句,必须将利润profit与提成的关系,转换成某些整数与提成的关系。 分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、……),将利润profit整除1000,引入grade=profit/1000,则当: profit≤ grade 对应0、1 1000<profit≤2000 对应1、2 2000<profit≤5000 对应2、3、4、5 5000<profit≤ 对应5、6、7、8、9、10 10000<profit 对应10、11、12、…… 为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit先减1,然后再整除1000即可 grade= (profit – 1) / 1000;

38 profit≤ grade 对应0 1000<profit≤ 对应1 2000<profit≤ 对应2、3、4 5000<profit≤ 对应5、6、7、8、9 10000<profit 对应10、11、12、…… 程序如下: main() {long profit; int grade; float salary=500; printf("Input profit: "); scanf("%ld", &profit); grade= (profit – 1) / 1000;

39 switch(grade) { case 0: break; case 1: salary += profit*0.1; break; case 2: case 3: case 4: salary += profit*0.15; break; case 5: case 6: case 7: case 8: case 9: salary += profit*0.2; break; default: salary += profit*0.25; } printf("salary=%.2f\n", salary);


Download ppt "第4章 选择结构程序设计 二分支选择结构 多分支选择结构 P A B 真 假 k A1 A2 Ai An k=k2 k=k1 k=kn"

Similar presentations


Ads by Google