第 5章 选择结构程序设计第 5章 选择结构程序设计
5.1 if语句
5.2 switch语句
5.3 goto语句
5.4 程序设计举例第 5章 选择结构程序设计
5.1 if语句
5.1.1 单分支 if语句格式,if ( 条件表达式 )
功能,先计算条件表达式的值,如果条件表达式的值为真 ( 非 0),执行语句 ( 选择体 ),否则执行 if语句的下一条语句 。
NS图,见图 5 - 1 之 (a)。
第 5章 选择结构程序设计图 5 - 1
第 5章 选择结构程序设计例如,
(1) 如果 x>0,输出 x。
if( x>0)
printf( ″x=%f″,x) ;
(2) 如果 a等于 b,输出 ″a=b″。
if( a==b) printf( ″%s″,″a=b″) ;
第 5章 选择结构程序设计说明,
(1) 条件表达式必须用小括号括起,同时注意区分作为条件的表达式与作为数值的表达式 。
(2) if语句中要选择执行的语句称为选择体,选择体从语法上只能是一条语句,如果选择体需多条语句描述,必须采用复合语句 。
第 5章 选择结构程序设计例如,如果 x>0,求 x的平方根。
(1) 将结果放入变量 y 中 ;
(2) 输出 x
if ( x>0
{ y=sqrt( x) ;
printf( ″平方根 =%f″,y) ;
}
(3) 不管选择体多么复杂,包含多少条语句,if语句逻辑上是一条语句,后面的双分支 if语句,多分支 if语句,switch语句,循环语句均是逻辑上的一条语句。
第 5章 选择结构程序设计例 5 – 1 计算 y,。
提示,x等于 1
程序如下,
/*程序 5 - 1,求函数值 */
main( )
{float x;
float y;
printf( ″请输入 x,″) ;
scanf( ″%f″,&x) ;
if ( x!=1
{y=( x+1) /( x -1) ;
printf( ″x=%6.2f,y=%6.2f\n″,x,y) ;
}
}
输入数据,1.2
运行结果,x= 1.20,y= 11.00
1
1

x
xy
第 5章 选择结构程序设计
5.1.2 双分支 if语句格式,if ( 条件表达式 ) 语句 1 else 语句 2
功能,先计算条件表达式的值,如果条件表达式的值为真 ( 非 0),执行语句 1( 选择体 1),否则执行语句
2( 选择体 2),if语句执行完后执行 if 语句的下条语句 。
NS图,见图 5 - 1之 (b)。
第 5章 选择结构程序设计例如,
(1) 如果 x>0,输出 x大于 0,否则输出 x小于等于 0。
if( x>0) printf( ″x大于 0″) ;
else printf( ″x小于等于 0″) ;
(2) 如果 a等于 b,输出 a等于 b,否则输出 a不等于 b。
if( a==b) printf( ″a等于 b″) ;
else printf(,a不等于 b″) ;
第 5章 选择结构程序设计
(3) 求两个数 x,y的最大值 max。
if( x>y) max=x;
else max=y;
(4) 判断整数 i的奇偶性 。
if( i%2= =0) printf( ″偶数 \n″) ;
else printf( ″奇数 \n″) ;
第 5章 选择结构程序设计
(1) 双分支 if语句形式上相当于单分支 if语句扩展 else
分支而来,else分支称为 else子句,else子句不能单独存在 。
(2) 在其它高级语言中特别强调 else子句前不能有分号,
C语言中 else子句前必有分号 。
(3) 选择体如为多条语句同样必须采用复合语句 。
(4) 可采用条件运算等价实现,从而以表达式的形式参与运算 。
例如,上例中三个双分支 if语句用条件运算描述,
① ( x>0)? printf( ″x大于 0″),printf( ″x小于等于 0″)
② ( a==b)? printf( ″a等于 b″),printf( ″a不等于 b″)
③ ( x>y)? max=x,max=y
第 5章 选择结构程序设计
(5) 单分支 if 语句可认为是双分支 if 语句缺省 else子句的特殊情况,一条双分支 if语句可用两条单分支 if语句实现 。
例如,前例中三条双分支 if语句改用单分支 if语句实现,
① if ( x>0) printf( ″x大于 0″) ;
if ( x<=0) printf( ″x小于等于 0″) ;
② if ( a==b) printf( ″a等于 b″) ;
if( a!=b) printf( ″a不等于 b″) ;
③ if( x>y) max=x;
if( x<=y) max=y;
第 5章 选择结构程序设计例 5 – 2 计算? 11
11,


xx
xxyy
/*程序 5 - 2,求函数值 */
main( )
{float x;
float y;
printf( ″请输入 x,″) ;
scanf( ″%f″,&x) ;
if ( x>1
y=x+1;
else
y=x- 1;
printf( ″x=%6.2f,y=%6.2f\n″,x,y) ;
}
输入数据,1.2
运行结果,x= 1.20,y= 2.00
第 5章 选择结构程序设计例 5 –3 输入两个数,求两个数的最大值、最小值。
数据分析,
输入量,两个数 x,y,float
输出量,最大值 max,最小值 min,float
算法分析,
① 输入两个数 x,y
② 比较两个数 x,y
如果 x>y,max=x,min=y
如果 x<y,max=y,min=x
③ 输出最大值 max,最小值 min
第 5章 选择结构程序设计
/*程序 5 - 3,求两个数的最大值,最小值 */
main( )
{ float x,y;
float max,min;
printf( ″请输入两个数 x,y,″) ;
scanf( ″%f,%f″,&x,&y) ;
if ( x>y
{max=x;
min=y;
}
else
{max=y;
min=x;
}
printf( ″max=%6.2f,min=%6.2f\n″,max,min) ;
}
输入数据,1.2,2.54
运行结果,max= 2.54,min= 1.20
第 5章 选择结构程序设计
5.1.3 多分支 if语句一般形式,
if (条件表达式 1
if (条件表达式 2) 语句 1
else 语句 2
else
if (条件表达式 3) 语句 3
else 语句 4
第 5章 选择结构程序设计图 5 - 2
第 5章 选择结构程序设计例 5 – 4 计算 y,

0 1
1y
0
00

x
xx
/*程序 5 - 4,求函数值 */
main( )
{float x;
float y;
printf( ″请输入 x,″) ;
scanf( ″%f″,&x) ;
if ( x<0
y=-1;
else
if ( x=0) y=0;
else y=1;
printf( ″x=%8.4f,y=%5.2f\n″,x,y) ;
}
输入数据,12.345
运行结果,x= 12.3450,y= 1.00
第 5章 选择结构程序设计例 5 –5 将百分制成绩转成五级记分( A,B,C,D,E)。
if ( cj>=90) ch=′A′;
else if ( cj>=80) ch=′B′;
else if (cj>=70) ch=′C′;
else if (cj>=60) ch=′D′;
else ch=′E′;
第 5章 选择结构程序设计说明,
( 1 ) 多分支 if语句中,else子句总是与最近的 if 配套 。
(2) 通过加花括号,加注释来明确 else与 if的配套关系 。
(3) 多分支 if语句可用多条单分支,双分支 if 语句等价实现 。
第 5章 选择结构程序设计例如,
① 例 5 — 4 用单分支 if
if ( x<0) y=-1;
if ( x=0) y=0;
if ( x>0) y=1;
② 例 5 — 5 用单分支 if语句处理,
if ( cj>=90) ch=′A′;
if ( cj>=80&&cj<90) ch=′B′;
if (cj>=70&&cj<80) ch=′C′;
if (cj>=60&&cj<70) ch=′D′;
if (cj<60) ch=′E′;
第 5章 选择结构程序设计
5.2 switch语句
switch语句称为开关语句,用于多分支选择的一种特殊情况的处理,即每个分支,每种情况通过一个表达式取不同的值 ( 选择常量,情况常量 ) 来描述,相当于 PASCAL语言中的 CASE语句 。
格式,
switch
{case 常量 1,语句 1
case 常量 2,语句 2
……
case 常量 n,语句 n
default,语句 n+1
}
第 5章 选择结构程序设计功能,计算选择表达式的值,当表达式的值与某一个 case后面的常量相等,相匹配时,就执行此 case后面的处理语句 。 执行完一个 case后面的语句后,流程控制转移到下一个 case处继续执行 。
若所有 case中的常量都不与选择表达式的值相匹配,
就执行 default后面的语句 。
第 5章 选择结构程序设计
NS图,见图 5 — 3。
图 5 — 3
第 5章 选择结构程序设计例 5 — 6 根据输入的字符,输出相应的字符串。
t-Turbo C
b-Borland C
m-Microsoft C
v-Visual C
第 5章 选择结构程序设计
/*程序 5 — 6,根据输入的字符,输出相应的字符串 */
main( )
{char ch;
scanf( ″%c″,&ch);
switch ( ch
{case ′t′,printf( ″Turbo C\n″) ; break;
case ′b′,printf( ″Borland C\n″) ; break;
case′m′,printf( ″Microsoft C\n″) ; break;
case ′v′,printf( ″Visual C\n″) ; break;
default,printf( ″error C\n″) ;
}
}
第 5章 选择结构程序设计例 5 — 7 将例 5 — 5 用 switch语句实现。
switch (( int)( cj/10)) /*注意选择表达式的构造 */
{
case 10,
case 9,ch=′A′;
break;
case 8,ch=′B′;
break;
case 7,ch=′C′;
break;
case 6,ch=′D′;
break;
default,ch=′E′;
}
第 5章 选择结构程序设计说明,
(1) 选择表达式可以是任何表达式,一般为整型,
字符型,枚举型表达式 。
(2) 选择表达式必须用小括号括起 。
(3) case后可以是常量表达式,每一个 case后的值必须互不相同,否则会出现二义性 。
(4) 一种情况处理完后,一般应使程序的执行流程跳出 switch结构,终止 switch语句的执行,这可借助 break
语句完成 。
第 5章 选择结构程序设计
break语句形式为,break;
一般使用的 switch语句形式为,
switch ( 选择表达式 )
{case 常量 1,语句 1[ break; ]
case 常量 2,语句 2[ break; ]
……
case 常量 n,语句 n[ break; ]
default,语句 n+1
}
第 5章 选择结构程序设计最后一种情况处理中可以不加 break语句 。
(5) 在上述 switch语句的一般使用形式下,case出现的次序不影响执行结果 。
(6) 当多个常量代表一种情况时,出现在前面 case中的情况处理无语句,这实际上也是多个 case共用一组执行语句 。
(7) 可以没有 default子句 。
(8) switch语句描述的是多分支选择的一种特殊情况,
可用 if语句等价实现,在例 5-5的对比分析中可注意到这样一个事实 。
第 5章 选择结构程序设计
5.3 goto语句格式,goto 语句标号 ;
功能,将程序的执行流程无条件转移至语句标号所标识的位置语句处执行 。
说明,
(1) C语言的语句标号用标识符表示,它仅仅表示 goto语句转移的目标地址 。
(2) 带有标号的语句称为标号语句,标号与语句之间用冒号分隔 。 标号语句仅对 goto语句有意义 。
(3) goto语句往往与 if 语句配套使用构成一种远距离的转移。
第 5章 选择结构程序设计
(4) if语句加 goto语句还可构成循环 。 例如,
x=0;
flag,if( x<10)
{x++;
goto flag; }
(5) 不允许使用 goto语句把程序控制转移到其它函数内部,不允许使用 goto语句把程序控制转向数据说明语句 。
(6) 尽量少使用 goto语句,即使使用,一般也不要将程序执行流程向后转移。
第 5章 选择结构程序设计
5.4 程序设计举例例 5 - 8 求三个数的最大值。
数据分析,
输入量,三个数 x,y,z,float
输出量,max,float
算法分析,
算法一,直接求最大值。
算法二,先假定第一个数是最大值,将其它数依次与最大值比较,如比最大值还大,这个数是新的最大值。
第 5章 选择结构程序设计程序一,
/*程序 5 — 7-1,求三个数的最大值 */
main( )
{float x,y,z;
float max;
clrscr( );
printf( ″请输入三个数 x,y,z,″) ;
scanf( ″%f,%f,%f″,&x,&y,&z) ;
if ( x>y) &&( x>z) max=x;
if ( y>x) &&( y>z) max=y;
if ( z>x) &&( z>y) max=z;
printf( ″x=%5.2f,y=%5.2f,z=%5.2f,max=%5.2f\n″,x,y,z,max) ;
}
第 5章 选择结构程序设计程序二,
/*程序 5 — 7 — 2,求三个数的最大值 */
main( )
{float x,y,z;
float max;
clrscr( );
printf( ″请输入三个数 x,y,z,″) ;
scanf( ″%f,%f,%f″,&x,&y,&z) ;
max=x;
if ( y>max) max=y;
if ( z>max) max=z;
printf( ″x=%5.2f,y=%5.2f,z=%5.2f,max=%5.2f\n″,x,y,z,max) ;
}
输入数据,12.34,2.18,10.68
运行结果,x=12.34,y= 2.18,z=10.68,max=12.34
第 5章 选择结构程序设计例 5 — 9 由三边求三角形面积和周长。
/*程序 5 — 9,求三角形的面积和周长 */
main( )
{float a,b,c;
int flag; /*为 1,三边能构成三角形 */
float hl;
float s,l;
clrscr( );
printf( ″请输入三角形的三边,″) ;
scanf( ″%f,%f,%f″,&a,&b,&c) ;
flag=( a+b>c) &&( b+c>a) &&( c+a>b) ;
第 5章 选择结构程序设计
if (flag)
{l=a+b+c;
hl=0.5*l;
s=sqrt( hl*( hl- a) *( hl- b) *( hl- c)) ;
printf( ″面积 =%5.2f,周长 =%5.2f \n″,s,l) ;
}
else printf(″不能构成三角形! ″) ;
}
输入数据,3,4,5
运行结果,面积 = 6.00,周长 =12.00
输入数据,1,1,5
运行结果,不能构成三角形!
第 5章 选择结构程序设计例 5 — 10 求方程 ax2+bx+c=0的实根。
图 5 — 4
第 5章 选择结构程序设计程序如下,
/*程序 5 — 10,求方程 a*x*x+b*x+c=0的实根 */
main( )
{float a,b,c;
float d;
float x;
float x1,x2;
clrscr( );
printf( ″请输入方程系数 a,b,c,″) ;
scanf( ″%f,%f,%f″,&a,&b,&c) ;
if ( a==0
{if( b==0
{if( c==0) printf( ″无数解! \n″) ;
else printf( ″无解! \n″) ;
}
第 5章 选择结构程序设计
else
{x= -c/b;
printf( ″方程的根 =%6.2f\n″,x) ;
}
}
else
{d=b*b-4*a*c;
if ( d>=0)
{x1=( -b+sqrt( d)) /( 2*a) ;
x2=( -b-sqrt( d)) /( 2*a) ;
printf( ″第一个根 =%6.2f,第二个根 =%6.2f \n″,x1,x2) ;
}
else printf( ″方程无实根! \n″) ;
}
}
输入数据,0,2,1
运行结果,方程的根 = -0.50
输入数据,1,2,3
运行结果,方程无实根!
第 5章 选择结构程序设计例 5 — 11 输入年号,判断是否为闰年 。 输入月号,输出每月天数 。
数据分析,
输入量,年号 year,月号 month,int
中间量,闰年标志 leap,int
输出量,无,
算法提示,
① 闰年用 ( year%400==0 ) ‖
( year%4==0&&year%100! = =0) 判断 。
② 每月天数的输出通过开关语句处理。
第 5章 选择结构程序设计
/*程序 5 — 11,判断闰年,输出每月天数 */
main( )
{int year,month;
int leap;
printf( ″输入年号,″) ;
scanf( ″%d″,&year);
leap=( year%400= =0) ‖ ( year%4= =0&&year%100! = =0) ;
if ( leap) printf( ″%d年是闰年 \n″) ;
else printf( ″%d年不是闰年 \n″) ;
printf( ″输入月号,″) ;
scanf( ″%d″,&month);
switch ( month
{case 1,
3,
5,
第 5章 选择结构程序设计
7,
8,
10,
12,printf( ″%d年 %d月的天数为 %d天 \n″,year,month,31) ; break;
4,
6,
9,
11,printf( ″%d年 %d月的天数为 %d天 \n″,year,month,30) ; break;
2,if ( leap) printf( ″%d年 %d月的天数为 %d天 \n″,year,m
onth,29) ;
else printf( ″%d年 %d月的天数为 %d天 \n″,year,month,28) ;
}
}
运行结果,
输入年号,1999
1999
输入月号,12
1999年 12月的天数为 31天第 5章 选择结构程序设计例 5 — 12 两个数的 +,-,*,/
数据分析,
输入量,两个数 x,y,float
运算符 op,char
输出量,计算结果 j,float
算法提示,
① 运算选择通过开关语句处理。
② 除法运算时要考虑被除数为 0的情况。
第 5章 选择结构程序设计
/* 程序 5 — 12,简易计算器程序 */
main( )
{float x,y;
char op;
printf( ″输入两个数,″) ;
scanf( ″%f,%f″,&x,&y);
printf( ″输入运算符,″) ;
scanf( ″%c″,&op);
switch ( op
第 5章 选择结构程序设计
{case ′+′,j=x+y; printf( ″结果 =%9.4f\n″,j) ; break;
case ′-′,j=x-y; printf( ″结果 =%9.4f\n″,j) ; break;
case ′*′,j=x*y; printf( ″结果 =%9.4f\n″,j) ; break;
case ′/′,if ( y! =0)
{ j=x+y; printf( ″结果 =%9.4f\n″,j) ; }
else printf( ″除数为零 \n″) ;
}
}
运行结果,
输入两个数,3,6
输入运算符,*
结果 = 18.0000
第 5章 选择结构程序设计例 5 — 13 通讯录管理主控程序。
/*程序 5 — 13,通讯录管理主控程序 */
# include ″stdio.h″
main( )
{char ch; /*选择变量 */
/*界面显示 */
clrscr( );
printf( ″%s\n″,″ 通讯录管理程序 ″) ;
printf( ″%s\n″,″Add-追加数据 Modify-修改数据 ″) ;
printf( ″%s\n″,″Delete-删除数据 Print-打印数据 ″) ;
printf( ″%s\n″,″Quit-退出程序 ″) ;
printf( ″请选择( A/M/D/P/Q),″) ;
第 5章 选择结构程序设计
/*选择处理 */
scanf( ″%c″,&ch) ;
switch ( ch
{case ′A′,
case ′a′,printf( ″追加数据 ……″) ; break;
case ′M′,
case ′m′,printf( ″修改数据 ……″) ; break;
case ′D′,
case ′d′,printf( ″删除数据 ……″) ; break;
case ′P′,
case ′p′,printf( ″打印数据 ……″) ; break; }
case ′Q′,
case ′q′,printf( ″退出程序 ……″) ; exit( 0) ;
}
}