null第五章 选择结构 第五章 选择结构 5.1 选择结构
5.2 程序举例 5.1 选择结构5. 1.1 if 语句 (分支控制语句)
1. if 语句的 三种形式
单路分支:条件成立执行操作,不成立什么也不做;
双路分支:条件成立执行A操作,不成立执行B操作;
嵌套分支:条件成立执行A操作,不成立时还需要进
一步进行分支判断。5.1 选择结构null 第一种形式——单路分支
if (表达式) 语句
内嵌语句;可是一条语句、复
合语句、空语句。描述了条件
成立时要执行的操作。
可是任何形式的表达式;通常是关系或
逻辑表达式。描述了分支控制条件。 null执行流程:
首先求解表达式,并对其值进行逻辑判断;非
零视为真,执行内嵌语句,之后执行后续语句。
若分支条件不成立,则直接执行后续语句。
对应算法:PT F
内嵌
语句null例:输入一个整数,为正则输出
main( )
{ int x;
scanf(”%d”, &x);
if (x>0) printf(”%d\n” , x);
}
例:输入两个数并按由小到大顺序输出
main( )
{ float a, b, t;
scanf(”%f,%f”, &a, &b);
if (a>b) { t=a; a=b; b=t; }
printf(”%f,%f\n”, a, b); }null第二种形式——双路分支
if (表达式) 语句1 else 语句2
其中:内嵌语句1是条件成立时所执行的操作;
内嵌语句2是条件不成立时所执行的操作;
执行流程:
首先求解表达式,并对其值进行逻辑判断;为
真,执行内嵌语句1,之后执行后续语句。
若分支条件不成立,则执行内嵌语句2,之后
执行后续语句。null对应算法:PT F
内嵌 内嵌
语句1 语句2可分行书写:
if (表达式) 语句1
else 语句2
null例:根据x求y值 y=
main( )
{ float x, y;
scanf(”%f”, &x);
if (x>=0)
{ y=x;
printf(”y=%f\n” , y); }
else
{ y=x*x+1.0;
printf(”y=%f\n”, y); }
}x x≥0
x2 + 1 x<0null 条件成立与不成立的输出
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
、输出项完全一样,因而上例可化简如下:
main( )
{ float x, y;
scanf(”%f”, &x);
if (x>=0) y=x;
else y=x*x+1.0;
printf(”y=%f\n”, y);
}null例:求任意三角形面积,若三边值不能构成三角形时输出表示错误的信息。
#include ’’math.h”
main( )
{ float a, b, c, s, area;
printf(”Enter a, b, c:”);
scanf(”%f,%f,%f”, &a, &b, &c);
if(a+b>c && a+c>b && b+c>a)
{ s=(a+b+c)/2.0;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(”area=%-8.3f\n”, area); }
else printf(”DATA ERROR!”);
} null第三种形式——阶梯if (不成立时嵌套分支)
if ( e1 ) s1
else if ( e2 ) s2
else if ( e3 ) s3
┇
else if ( em ) sm
else sn
其中:ei各层的分支条件;si各层的内嵌语句;
执行流程:首先计算并判断e1的值,为真执行s1,
之后退出分支。e1为假则计算并判断e2的值,为真
执行s2, 之后退出分支。依次类推。e1e2T F
T F
T F
s1 s2 s3 s4
e3null例:对学生成绩分档;
main( )
{ int g;
printf(”Enter score:”);
scanf(”%d”, &g);
if (g<0||g>100) printf (”INPUT ERROR !”);
else if (g>=80) printf(”A”);
else if (g>=70) printf(”B”);
else if (g>=60) printf(”C”);
else printf(”D”);
}
80~100分 A档 70~79分 B档 60~69分 C档 0~59分 D档null注意:分支条件的正确性
main( )
{ int g;
printf(”Enter score:”);
scanf(”%d”, &g);
if (g<0||g>100) printf (”INPUT ERROR !”);
else if (g<60) printf(”D”);
else if (g>=60) printf(”C”);
else if (g>=70) printf(”B”);
else if (g>=80) printf(”A”);
}
57↙ 65↙ 89 ↙
D C C null上例:用单路分支实现
main( )
{ int g;
printf(”Enter score:”);
scanf(”%d”, &g);
if (g<0||g>100) printf (”INPUT ERROR !”);
if (g>=80&&g<=100) printf(”A”);
if (g>=70&&g<=79) printf(”B”);
if (g>=60&&g<=69) printf(”C”);
if (g>=0&&g<=59) printf(”D”);
}
多个并列if语句,执行效率不如阶梯 if。80~100分 A档 70~79分 B档 60~69分 C档 0~59分 D档null2. if 的嵌套
在一个分支结构中,又完整地包含一个或多个分支结构,则构成了分支结构的嵌套。
例:分支条件不成立时需要进一步分支
算法表示: 算法实现:
if (e1) s1
else if (e2) s2
else s3 e1e2T F
T F
s1 s2 s3 null例:分支条件成立与不成立,均要进一步分支
算法表示: 算法实现:e1
e2 e3T F
T F T F
s1 s2 s3 s4if (e1)
if (e2) s1
else s2
else
if (e3) s3
else s4
null例:分支条件不成立时需要若干层进一步的分支
算法表示: 算法实现:e1e2e3T F
T F
T F
s1 s2 s3 s4if (e1) s1
else if (e2) s2
else if (e3) s3
else s4 可见:阶梯if是条件不成立时的嵌套结构null例:编程,判定某年是否闰年
闰年条件:整百的年份能被400整除;
或非整百的年份能被4整除。
算法表示:输入year
year%100= =0year%400= =0year%4= =0T F T F
leap=1 leap=0 leap=1 leap=0 leap= =1 T F T F 输出“is” 输出“not” null程序清单:
main( )
{ int year, leap;
scanf(”%d”, &year);
if (year%100==0)
if (year%400==0) leap=1;
else leap=0;
else
if (year%4==0) leap=1;
else leap=0;
if (leap==1) printf(”%d is a leap yeas.\n”,year);
else printf(”%d is not a leap year.\n”, year);
}null例:根据 x求y值。 3x - 11 (0 ≤ x < 10)
y= 2x + 5 (10 ≤x < 20)
x (20 ≤ x < 30) x≥0&&x<30
T F x<10
T F x<20
T F y=x y=
3x-11 y=
2x+5 输
出
x
无
效 输出 y 输入x输出X无效3x-11→yx≥0&&x<30x<10x<202x+5→yx→y输出yFFFTTTnull程序清单:
main( )
{ float x, y;
printf(”Enter x:”);
scanf(”%f”, &x);
if (x>=0&&x<30)
{ if (x<10) y=3*x-11;
else if (x<20) y=2*x+5;
else y=x;
printf(”x=%7.2f,y=%7.2f\n”, x, y); }
else printf(”%7.2f is invalid.\n”, x);
}
null方法2: 3x - 11 ( 0 ≤ x < 10)
y= 2x + 5 (10 ≤x < 20)
x (20 ≤ x < 30) x<0 ||x>=30
T F 输
出
x
无
效 x<10
T F y=
3x-11 y=
2x+5 y=x x<20
T F 输出 y 输入 xscanf("%f", &x);
if(x<0||x>=30)printf("┅");
else
{ if(x<10) y=3*x-11;
else if(x<20) y=2*x+5;
else y=x;
printf("y=%7.2f\n", y);
}nullif语句嵌套的注意事项:
1) 采用缩进格式,可清晰地表示出嵌套层次关系;
2) C编译系统确定if和else的配对原则是:
从最内层else开始识别,将内层else与上面最近
的未曾配对的if配对;
例: 算法实现:
if (e1) if (e1)
if (e2) s1 { if (e2) s1 }
else s2 else s2
e1
e2
T F
T F
s1 s2
if语句 示例
if语句 示例【例一】以下程序的作用是什么?
main( )
{
char c;
printf(“Input :”);
scanf(“%c”,&c);
if (c>=’a’ && c<=’z’)
c=c-32;
else c=c;
printf(“%c”,c);
}/*将小写字母转换为大写字母*/
if语句 示例
if语句 示例【例二】以下程序的执行结果是什么?
main( )
{
int x=2,y=-1,z=2;
if (x
0) ; if (x=2) if (1<=x<=10)
y=3x+2; printf(“y>0”); y=x-1;null4.3.2 switch多分支选择 语句 (多路开关语句)
1. switch的一般形式
switch (表达式)
{ case 常量1: s1
case 常量2: s2
┇
case 常量n: sn
default : sn+1
}
其中:表达式可是任何形式,但其值应为整型;
内嵌语句si可是一条语句、复合或空语句;
常量i可是整、字符、符号常量、常量表达式。null2. switch的执行流程
首先求解表达式,然后测试其值与哪个case后
的常量相等,相等则从该case后的语句开始执行,
直到其后的所有内嵌语句执行完毕,退出多分支结
构。
若表达式的值不与任何常量相等,则执行default
后的语句,执行完毕退出分支。
nullswitch执行流程图:
switch (表达式)
{ case c1: s1
case c2: s2
┇
case cn: sn
default : sn+1
}
求解表达式c1?c2?cn?sn+1s1sns2┇┇YYYNNNnull求解表达式c1?c2?cn?sn+1s1sns23. 使用说明
1) 在switch中可以使用break语句跳出switch结构;breakbreakbreak┇┇┇null例:对成绩分档
main( )
{ char c1; int g;
scanf(”%d”, &g);
switch( g/10 )
{ case 10: c1=’A’ ;
case 9: c1=’A’ ;
case 8: c1=’A’ ;
case 7: c1=’B’ ;
case 6: c1=’C’ ;
default: c1=’D’ ;
}
printf(“%c\n”, c1); }80~100分 A档
70~79分 B档
60~69分 C档
0~59分 D档break;
break;
break;
break;
break;null2) case后的各常量不能相同,否则编译无法通过;
3) default为可选项,它提供了表达式的值与任何量
都不相同时的执行
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
;若表达式的值与任何常量都不相同时什么也不需要做,则省略关键字
default;
4) 多个case可共用一组执行语句;
例: switch( g/10 )
{ case 10:
case 9:
case 8: c1=’A’ ; break;
case 7: c1=’B’ ; break;
┇null例:设计一个简单的菜单选择程序,根据选择可实
现a与b的四则运算。
#include “stdio.h”
main( )
{ int a, b; char c1; clrscr( );
printf(”1. Add\n”);
printf(”2. Subtract\n”);
printf(”3. Multiply\n”);
printf(”4. Divide\n”);
printf(”Enter your choice:”);
c1=getchar( );
┇null c1=getchar( );
if (c1>=’1’ && c1<=’4’ )
{ printf(”Enter a, b:”);
scanf(“%d,%d”, &a, &b);
switch(c1)
{ case ’1’ : printf(“%d\n”, a+b); break;
case ’2’ : printf(“%d\n”, a-b); break;
case ’3’ : printf(“%d\n”, a*b); break;
case ’4’ : printf(“%f\n”, (float)a/b);
}
}
else printf(“Invalid selsction.”);
} /*main*/YS
switch语句 示例
switch语句 示例main()
{
char s;
scanf(“%c”,&s);
switch(s)
{
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(“错误输入\n”);
}
}输入“c”,求输出结果。 结果:
60~69
<60
错误输入 ?!
switch语句 示例
switch语句 示例解决方法——break语句:
main()
{
char s;
scanf(“%c”,&s);
switch(s)
{
case ‘A’ : printf(“85~100\n”);break;
case ‘B’ : printf(“70~84\n”);break;
case ‘C’ : printf(“60~69\n”);break;
case ‘D’ : printf(“<60\n”);break;
default : printf(“错误输入\n”);
}
}这才差不多!
break! 运行结果:
60~69
switch语句 示例
switch语句 示例解决方法——break语句:
main()
{
char s;
scanf(“%c”,&s);
switch(s)
{
case ‘A’ : printf(“85~100\n”);break;
case ‘B’ : printf(“70~84\n”);break;
case ‘C’ : printf(“60~69\n”);break;
case ‘D’ : printf(“<60\n”);break;
default : printf(“错误输入\n”);
}
}讨论
switch(s)语句中的s实际上并非真正的条件选择,而只是一种跳转指示(与if语句不同),表示下面应该跳转到什么位置继续执行。而各case实际上只是一个跳转处的标记。当程序跳转到某个case处时,并非只执行此case行的程序组,而是从此处开始一直向下执行各条语句,直到整个switch开关体结束(“}”)。
如果要使每个case处相当于一种if(s)else的效果,必须在其语句组最后加上break语句。
switch语句 示例
switch语句 示例main()
{
int x=1,y=0,a=0,b=0;
switch(x)
{ case 1 :
switch(y)
{ case 0 : a++;break;
case 1 : b++;break;
}
case 2 : a++;b++;break;
case 3 : a++;b++;
}
printf(“a=%d,b=%d\n”,a,b);
}说明
1、每个case常量表达式的值必须互不相同,否则会出现互相矛盾的结果。
2、允许多个case共用一个执行语句。 求程序运行结果。结果:a=2,b=1。如果x=2? 结果:a=1,b=1 如果x=3?结果:a=1,b=1 null5.2.1 程序举例
例:从键盘输入四个整数,输出其中的最大数。
main( )
{ int a, b, c, d, max;
printf(”Enter a, b, c, d:”);
scanf(”%d,%d,%d,%d”, &a, &b, &c, &d);
max=a; /*取四者之一假定最大*/
if (b>max) max=b;
if (c>max) max=c;
if (d>max) max=d;
printf(”MAX=%d\n”, max);
}null例:找出三个整数中的最大、最小数。
main( )
{ int a, b, c, max, min;
printf(”Enter a, b, c:”);
scanf(”%d,%d,%d”, &a, &b, &c);
max=a>b? a: b;
max=c>max? c: max;
min=a=10000) w=5; /*求解位数*/
else if(a>=1000) w=4;
else if(a>=100) w=3;
else if(a>=10) w=2;
else w=1;
p5=a/10000; /*分离各位*/
p4=(a-p5*10000L)/1000; /*L:防止溢出*/
p3=(a-p5*10000L-p4*1000)/100;
┇null p2=(a-p5*10000L-p4*1000-p3*100)/10;
p1=a-p5*10000L-p4*1000-p3*100-p2*10;
printf(“\t%ld,%d\n\t\t”, a, w);
switch( w )
{ case 5: printf(”%d\b\b\b”, p5); /*无须break*/
case 4: printf(”%d\b\b\b”, p4);
case 3: printf(”%d\b\b\b”, p3);
case 2: printf(”%d\b\b\b”, p2);
case 1: printf(”%d\b\b\b”, p1);
}
printf(“\n”);
}
null另一种输出方法:
switch( w )
{ case 5: printf(”%d %d %d %d %d”,
p1, p2, p3, p4, p5); break;
case 4: printf(”%d %d %d %d”,
p1, p2, p3, p4); break;
case 3: printf(”%d %d %d”,
p1, p2, p3); break;
case 2: printf(”%d %d”,
p1, p2); break;
case 1: printf(”%d”, p1);
}null例:输入四个整数,升序排序并输出。输入a、b、c、d
T a>b F
ab ø
T c>d F
cd ø
T a>c F
ac øT b>c F
bc ø
T b>d F
bd ø
T c>d F
cd ø
输出a、b、c、db>ad>cc>bd>b
B次小d>c小结(1)小结(1)根据某种条件的成立与否而采用不同的程序段进行处理的程序结构称为选择结构。选择结构又可分为简单分支(两个分支)和多分支两种情况。一般,采用if语句实现简单分支结构程序,用switch和break语句实现多分支结构程序。虽然用嵌套if语句也能实现多分支结构程序,但用switch和break语句实现的多分支结构程序更简洁明了。 小结(2)小结(2)if语句的控制条件通常用关系表达式或逻辑表达式构造,也可以用一般表达式表示。因为表达式的值非零为"真",零为"假"。所以具有值的表达式均可作if语句的控制条件。 小结(3)小结(3) if语句有简单if和if_else两种形式,它们可以实现简单分支结构程序。采用嵌套if语句还可以实现较为复杂的多分支结构程序。在嵌套if语句中,一定要搞清楚else与哪个if结合的问题。C语言规定,else与其前最近的同一复合语句的不带else的if结合。书写嵌套if语句往往采用缩进的阶梯式写法,目的是便于看清else与if结合的逻辑关系,但这种写法并不能改变if语句的逻辑关系。 小结(4)小结(4) switch语句只有与break语句相结合,才能设计出正确的多分支结构程序。break语句通常出现在switch语句或循环语句中,它能轻而易举地终止执行它所在的switch语句或循环语句。虽然用switch语句和break语句实现的多分支结构程序可读性好,逻辑关系一目了然。然而,使用switch(k)的困难在于其中的k表达式的构造。