第 3章 选择结构
3.1 语句与复合语句
3.2 if 语 句
3.3 if…else 结构
3.4 条件运算符
3.5 switch结构
3.6 程序举例
3.1 语句与复合语句
在 C语言中,一个表达式后面跟随一个分号就构成了
一个语句,这种语句称为表达式语句。
在 C语言中, 分号 ( ; ) 是表达式语句的终结符, 而
不是语句之间的分隔符, 也就是说, 分号是表达式语句的
一个组成部分, 只不过它位于表达式的后面 。
在一个函数体内部, 由左, 右花括号括起来的语句称
为复合语句, 它的一般形式为
{说明部分;语句部分; }
对于复合语句要注意以下几点:
( 1)一个复合语句在语法上等同于一个语句,因此,在
程序中,凡是单个语句(如表达式语句)能够出现的地方
都可以出现复合语句,并且,复合语句作为一个语句又可
以出现在其他复合语句的内部。
( 2) 复合语句是以右花括号为结束标志, 因此, 在复合
语句右括号的后面不必加分号, 但在复合语句内的最后一
个非复合语句是要以分号作为结束的 。
( 3)在复合语句的嵌套结构(将函数体也看成是一
个复合语句,而且是最外层的复合语句)中,一个
复合语句内所进行的说明只适合于本层中该说明语
句以后的部分(包括其内层的复合语句),在该复
合语句外不起作用。
( 4)在复合语句的嵌套结构中,如果在内层与外层
作了相同的说明,则按照局部优先的原则,内层复
合语句中的执行结果不带回到外层。
3.2 if 语 句
If 语句的形式为
if ( 表达式 ) 语句
这种选择结构的流程图如图 3.1所示 。
表达式
≠ 0 = 0
语句 空操作
图 3.1 if语句的流程图
下面对 if语句作几点说明:
( 1) if语句中的逻辑表达式(即条件)必须要用一对圆括号括
起来。
( 2) if语句后的语句可以是复合语句。
( 3) 一个 if语句
最后需要强调的是,在使用 if语句时,一定要注意逻辑表达
式的正确写法,特别是在连续使用多个 if语句时更要注意。
3.3 if…else 结构
在 C语言中, if… else结构的语句形式为
if ( 表达式 ) 语句 1
else 语句 2
表达式
≠ 0 = 0
语句 1 语句 2
图 3.2 if… else结构的流程图
下面对 if… else结构作以下几点说明:
( 1) if… else结构中的语句 1与语句 2都可以是复合语句。
( 2)在 if… else结构中,语句 1与语句 2都可以是空语句。
( 3) 在 if… else结构中, 如果在 else前面有多个 if语句,
则 else与最近的 if配对 。
( 4) 如果有多个 if…… else结构嵌套如下:
if (表达式 1) 语句 1
else
if ( 表达式 2) 语句 2
else
…
else
if ( 表达式 n) 语句 n
else 语句 n+ 1
则可简写成
if ( 表达式 1) 语句 1
else if ( 表达式 2) 语句 2
…
else if ( 表达式 n) 语句 n
else 语句 n+ 1
这种结构又称为 if…else if 结构,其流程图如图 3.3所示。
图 3.3 if…else if 结构的流程图
表达式 1
表达式 2
表达式 n
≠ 0
≠ 0
= 0
= 0
= 0 ≠ 0
语句 1 语句 2 ? 语句 n 语句 n +1
3.4 条件运算符
在 if… else结构中,如果语句 1与语句 2都是单一的赋值
语句,并且都是给同一个变量赋值,则可以用条件运算符
来进行处理。
下面对条件表达式作几点说明:
( 1)条件运算符优先级要比赋值运算符高。
( 2)条件运算符的优先级比关系运算符与算术运算符都要
低,因此,条件表达式中的, 表达式 1”,,表达式 2”与
,表达式 3”都不必用括号括起来。
( 3)条件运算符的结合方向为, 从右到左, 。
3.5 switch结构
在 C语言中提供了一个直接实现多路分支选择的结构,
称为 switch结构, 其一般形式如下:
switch(表达式 )
{ case 常量表达式 1,语句 1
case 常量表达式 2,语句 2
…
case 常量表达式 n,语句 n
default, 语句 n+ 1
}
图 3.4 switch结构的流程图
表达式
情况 1
语句 1
情况 2 情况 n ?
? 语句 2 语句 n
其他
语句 n +1
下面对 switch结构作几点说明:
( 1) switch结构中的表达式、常量表达式 1,… ?,常
量表达式 n必须是整型或字符型。这是因为,在 switch结
构中,其分支数一般是有限的,并且是离散的,因此,
其表达式的值也应是有限的,且是离散的。
( 2)同一个 switch结构中的常量表达式值必须互不相
同,否则就会出现矛盾的现象,即对于“表达式”的同
一个值对应多种执行方案,这是错误的。
( 3)在 switch结构中,case 与 default 的顺序可以任
意,各 case之间 的顺序也可以任意。
( 4)在执行 switch结构时,当执行完某 case 后的语句
后,将顺序执行后面 case 后的语句,直到遇 break 语
句才退出整个 switch 结构的执行。
( 5)在 switch结构中,如果没有 default 且“表达式
”值不等于任何 case 后常量表达式的值,则直接退出
switch 结构而转到其后的语句执行。
3.6 程序举例
例 3.12 计算奖金 。
当企业利润 P等于或低于 0.5万元时, 奖金为利润的
1%;当 0.5< P≤1万元时, 超过 0.5万元部分的奖金为利润
的 1.5%,0.5万元以下仍按 1%计算;当 1< P≤2万元时, 1
万元以下部分仍按前面的方法计算, 超过 1万元的部分其
奖金按利润的 2%计算;当 2< P≤5万元时, 2万元以下部分
仍按前面的方法计算, 超过 2万元部分的奖金按利润的
2.5%计算;当 5< P≤10万元时, 5万元以下部分仍按前面
的方法计算, 超过 5万元部分的奖金按利润的 3%计算;当
P> 10万元时, 10万元以下部分仍按前面的方法计算, 超
过 10万元部分按 3.5%计算 。 其中 P由键盘输入, 计算并输
出相应的奖金数 W。
其流程图如图 3.5所示 。
W = 0.0
输入利润 P
0.0 < P ≤ 0.5
Y es
Y es
Y es
Y es
Y es No
No
No
No
No
P ≤ 1.0
P ≤ 2.0
P ≤ 5.0
P ≤ 10.0
W = 0.2575+
0.035(P - 10)
W = 0.1075+
0.03(P - 5)
W = 0.0325+
0.025(P - 2)
W = 0.0125+
0.02(P - 1)
W = 0.005+
0.015(P - 0.5 )
W = 0.01P
输出 W
图 3.5 例 3.12中 if…else if 结构的流程图
根据图 3.5所示的流程图, 用 if… else if结构写出 C程序如下:
#include "stdio.h"
main()
{ float p,w;
printf("input p,");
scanf("%f",&p);
if (p<= 0.0) w= 0.0;
else if (p<= 0.5) w= 0.01*p;
else if (p<= 1.0) w= 0.005+ 0.015*(p- 0.5);
else if (p<= 2.0) w= 0.0125+ 0.02*(p- 1.0);
else if (p<= 5.0) w= 0.0325+ 0.025*(p- 2.0);
else if (p<= 10.0) w= 0.1075+ 0.03*(p- 5.0);
else w= 0.2575+ 0.035*(p- 10.0);
printf("w= %f\n",w);
}
例 3.14 求解一元二次方程 Ax2+ Bx+ C= 0。
可以得到求一元二次方程根的流程图如图 3.8所示 。
输入系数 A, B, C
A =0
Y es
Y es
B =0
No Y es
B =0
D = – C /A
Y es
C =0
Y es
D ≥ 0
No
X 1= – C /B
输出 X 1=
D
,ER R, 输出 X1 X 2= – X1 X 2= – X2 X 2= – B /A
X 1= j
- D X 1= 0
No
No
No
D =B
2
– 4A C
D ≥ 0
Y es No
B > 0
Y es No
输出 X1, X2
X 1= – B +
X 1= X 1/(2 A )
X 2= C /(A *X 1)
D X 1= – B –
X 1= X 1/(2 A )
X 2= C /(A *X 1)
D
P= – B /(2A )
Q=
X 1= P +jQ
X 2= P – jQ
– D
图 3.8 例 3.14的流程图
相应的 C程序如下:
#include "stdio.h"
#include "math.h"
main()
{ double a,b,c,d,x1,x2,p;
printf("input a,b,c,");
scanf("%lf%lf%lf",&a,&b,&c);
if (a== 0.0)
{ if (b== 0.0) printf("ERR\n");
else printf("X= %f\n",- c/b);
}
else if (b== 0.0)
{ d= c/a;
if (d<= 0.0)
{ printf("X1= %f\n",sqrt(- d));
printf("X2= %f\n",- sqrt(- d));
}
else
{ printf("X1=+ j%f\n",sqrt(d));
printf("X2=- j%f\n",sqrt(d));
}
else if (c== 0.0)
{ printf("X1= 0.0\n");
printf("X2= %f\n",- b/a);
}
else
{ d= b*b- 4*a*c;
if (d>= 0.0)
{ d= sqrt(d);
if (b> 0.0) x1= (- b- d)/(2*a);
else x1= (- b+ d)/(2*a);
x2= c/(a*x1);
printf("X1= %f\n",x1);
printf("X2= %f\n",x2);
}
else
{ d= sqrt(- d)/(2*a);
p=- b/(2*a);
printf("X1= %f+ j%f\n",p,d);
printf("X2= %f- j%f\n",p,d);
}
}
}
3.1 语句与复合语句
3.2 if 语 句
3.3 if…else 结构
3.4 条件运算符
3.5 switch结构
3.6 程序举例
3.1 语句与复合语句
在 C语言中,一个表达式后面跟随一个分号就构成了
一个语句,这种语句称为表达式语句。
在 C语言中, 分号 ( ; ) 是表达式语句的终结符, 而
不是语句之间的分隔符, 也就是说, 分号是表达式语句的
一个组成部分, 只不过它位于表达式的后面 。
在一个函数体内部, 由左, 右花括号括起来的语句称
为复合语句, 它的一般形式为
{说明部分;语句部分; }
对于复合语句要注意以下几点:
( 1)一个复合语句在语法上等同于一个语句,因此,在
程序中,凡是单个语句(如表达式语句)能够出现的地方
都可以出现复合语句,并且,复合语句作为一个语句又可
以出现在其他复合语句的内部。
( 2) 复合语句是以右花括号为结束标志, 因此, 在复合
语句右括号的后面不必加分号, 但在复合语句内的最后一
个非复合语句是要以分号作为结束的 。
( 3)在复合语句的嵌套结构(将函数体也看成是一
个复合语句,而且是最外层的复合语句)中,一个
复合语句内所进行的说明只适合于本层中该说明语
句以后的部分(包括其内层的复合语句),在该复
合语句外不起作用。
( 4)在复合语句的嵌套结构中,如果在内层与外层
作了相同的说明,则按照局部优先的原则,内层复
合语句中的执行结果不带回到外层。
3.2 if 语 句
If 语句的形式为
if ( 表达式 ) 语句
这种选择结构的流程图如图 3.1所示 。
表达式
≠ 0 = 0
语句 空操作
图 3.1 if语句的流程图
下面对 if语句作几点说明:
( 1) if语句中的逻辑表达式(即条件)必须要用一对圆括号括
起来。
( 2) if语句后的语句可以是复合语句。
( 3) 一个 if语句
最后需要强调的是,在使用 if语句时,一定要注意逻辑表达
式的正确写法,特别是在连续使用多个 if语句时更要注意。
3.3 if…else 结构
在 C语言中, if… else结构的语句形式为
if ( 表达式 ) 语句 1
else 语句 2
表达式
≠ 0 = 0
语句 1 语句 2
图 3.2 if… else结构的流程图
下面对 if… else结构作以下几点说明:
( 1) if… else结构中的语句 1与语句 2都可以是复合语句。
( 2)在 if… else结构中,语句 1与语句 2都可以是空语句。
( 3) 在 if… else结构中, 如果在 else前面有多个 if语句,
则 else与最近的 if配对 。
( 4) 如果有多个 if…… else结构嵌套如下:
if (表达式 1) 语句 1
else
if ( 表达式 2) 语句 2
else
…
else
if ( 表达式 n) 语句 n
else 语句 n+ 1
则可简写成
if ( 表达式 1) 语句 1
else if ( 表达式 2) 语句 2
…
else if ( 表达式 n) 语句 n
else 语句 n+ 1
这种结构又称为 if…else if 结构,其流程图如图 3.3所示。
图 3.3 if…else if 结构的流程图
表达式 1
表达式 2
表达式 n
≠ 0
≠ 0
= 0
= 0
= 0 ≠ 0
语句 1 语句 2 ? 语句 n 语句 n +1
3.4 条件运算符
在 if… else结构中,如果语句 1与语句 2都是单一的赋值
语句,并且都是给同一个变量赋值,则可以用条件运算符
来进行处理。
下面对条件表达式作几点说明:
( 1)条件运算符优先级要比赋值运算符高。
( 2)条件运算符的优先级比关系运算符与算术运算符都要
低,因此,条件表达式中的, 表达式 1”,,表达式 2”与
,表达式 3”都不必用括号括起来。
( 3)条件运算符的结合方向为, 从右到左, 。
3.5 switch结构
在 C语言中提供了一个直接实现多路分支选择的结构,
称为 switch结构, 其一般形式如下:
switch(表达式 )
{ case 常量表达式 1,语句 1
case 常量表达式 2,语句 2
…
case 常量表达式 n,语句 n
default, 语句 n+ 1
}
图 3.4 switch结构的流程图
表达式
情况 1
语句 1
情况 2 情况 n ?
? 语句 2 语句 n
其他
语句 n +1
下面对 switch结构作几点说明:
( 1) switch结构中的表达式、常量表达式 1,… ?,常
量表达式 n必须是整型或字符型。这是因为,在 switch结
构中,其分支数一般是有限的,并且是离散的,因此,
其表达式的值也应是有限的,且是离散的。
( 2)同一个 switch结构中的常量表达式值必须互不相
同,否则就会出现矛盾的现象,即对于“表达式”的同
一个值对应多种执行方案,这是错误的。
( 3)在 switch结构中,case 与 default 的顺序可以任
意,各 case之间 的顺序也可以任意。
( 4)在执行 switch结构时,当执行完某 case 后的语句
后,将顺序执行后面 case 后的语句,直到遇 break 语
句才退出整个 switch 结构的执行。
( 5)在 switch结构中,如果没有 default 且“表达式
”值不等于任何 case 后常量表达式的值,则直接退出
switch 结构而转到其后的语句执行。
3.6 程序举例
例 3.12 计算奖金 。
当企业利润 P等于或低于 0.5万元时, 奖金为利润的
1%;当 0.5< P≤1万元时, 超过 0.5万元部分的奖金为利润
的 1.5%,0.5万元以下仍按 1%计算;当 1< P≤2万元时, 1
万元以下部分仍按前面的方法计算, 超过 1万元的部分其
奖金按利润的 2%计算;当 2< P≤5万元时, 2万元以下部分
仍按前面的方法计算, 超过 2万元部分的奖金按利润的
2.5%计算;当 5< P≤10万元时, 5万元以下部分仍按前面
的方法计算, 超过 5万元部分的奖金按利润的 3%计算;当
P> 10万元时, 10万元以下部分仍按前面的方法计算, 超
过 10万元部分按 3.5%计算 。 其中 P由键盘输入, 计算并输
出相应的奖金数 W。
其流程图如图 3.5所示 。
W = 0.0
输入利润 P
0.0 < P ≤ 0.5
Y es
Y es
Y es
Y es
Y es No
No
No
No
No
P ≤ 1.0
P ≤ 2.0
P ≤ 5.0
P ≤ 10.0
W = 0.2575+
0.035(P - 10)
W = 0.1075+
0.03(P - 5)
W = 0.0325+
0.025(P - 2)
W = 0.0125+
0.02(P - 1)
W = 0.005+
0.015(P - 0.5 )
W = 0.01P
输出 W
图 3.5 例 3.12中 if…else if 结构的流程图
根据图 3.5所示的流程图, 用 if… else if结构写出 C程序如下:
#include "stdio.h"
main()
{ float p,w;
printf("input p,");
scanf("%f",&p);
if (p<= 0.0) w= 0.0;
else if (p<= 0.5) w= 0.01*p;
else if (p<= 1.0) w= 0.005+ 0.015*(p- 0.5);
else if (p<= 2.0) w= 0.0125+ 0.02*(p- 1.0);
else if (p<= 5.0) w= 0.0325+ 0.025*(p- 2.0);
else if (p<= 10.0) w= 0.1075+ 0.03*(p- 5.0);
else w= 0.2575+ 0.035*(p- 10.0);
printf("w= %f\n",w);
}
例 3.14 求解一元二次方程 Ax2+ Bx+ C= 0。
可以得到求一元二次方程根的流程图如图 3.8所示 。
输入系数 A, B, C
A =0
Y es
Y es
B =0
No Y es
B =0
D = – C /A
Y es
C =0
Y es
D ≥ 0
No
X 1= – C /B
输出 X 1=
D
,ER R, 输出 X1 X 2= – X1 X 2= – X2 X 2= – B /A
X 1= j
- D X 1= 0
No
No
No
D =B
2
– 4A C
D ≥ 0
Y es No
B > 0
Y es No
输出 X1, X2
X 1= – B +
X 1= X 1/(2 A )
X 2= C /(A *X 1)
D X 1= – B –
X 1= X 1/(2 A )
X 2= C /(A *X 1)
D
P= – B /(2A )
Q=
X 1= P +jQ
X 2= P – jQ
– D
图 3.8 例 3.14的流程图
相应的 C程序如下:
#include "stdio.h"
#include "math.h"
main()
{ double a,b,c,d,x1,x2,p;
printf("input a,b,c,");
scanf("%lf%lf%lf",&a,&b,&c);
if (a== 0.0)
{ if (b== 0.0) printf("ERR\n");
else printf("X= %f\n",- c/b);
}
else if (b== 0.0)
{ d= c/a;
if (d<= 0.0)
{ printf("X1= %f\n",sqrt(- d));
printf("X2= %f\n",- sqrt(- d));
}
else
{ printf("X1=+ j%f\n",sqrt(d));
printf("X2=- j%f\n",sqrt(d));
}
else if (c== 0.0)
{ printf("X1= 0.0\n");
printf("X2= %f\n",- b/a);
}
else
{ d= b*b- 4*a*c;
if (d>= 0.0)
{ d= sqrt(d);
if (b> 0.0) x1= (- b- d)/(2*a);
else x1= (- b+ d)/(2*a);
x2= c/(a*x1);
printf("X1= %f\n",x1);
printf("X2= %f\n",x2);
}
else
{ d= sqrt(- d)/(2*a);
p=- b/(2*a);
printf("X1= %f+ j%f\n",p,d);
printf("X2= %f- j%f\n",p,d);
}
}
}