多分支选择结构有多种形式,嵌套的if语句和switch语句可以实现多分支结构,嵌套的if语句又包括else-if语句和嵌套的if-else语句。
else-if语句是最常用的多分支选择结构,其语法格式如下:
if(表达式1)
语句1;
else if (表达式2)
语句2;
…
else if (表达式n)
语句n;
else
语句n+1;
执行过程是首先判断表达式1,如果为真,则执行语句1,跳过其余的判断语句,结束整个else-if语句,否则依次判断表达式2到表达式n,直到找到满足条件的表达式,每次运行只有一个分支能够执行。如果没有找到满足条件的表达式,则执行最后的else,执行语句n+1。如果没有else语句,则当所有条件都不满足时什么也不执行。其执行流程如图3-3所示。
【例3-5】 输入学生的成绩,根据成绩打出相应的评定等级。
学生成绩 等级
grade>=90 A
90> grade >=80 B
80> grade >=70 C
70> grade >=60 D
60> grade E
/*
程序名:prg3-5.c
功能:输入学生的成绩,根据成绩打出相应的评定等级
*/
#include
int main()
{
float grade;
char letter;
printf("Enter the student's grade: ");
scanf("%f", &grade);
if (grade >= 90.0)letter = 'A';
else if (grade >= 80.0)letter = 'B';
else if (grade >= 70.0)letter = 'C';
else if (grade >= 60.0)letter = 'D';
else letter = 'E';
printf("The student grade level is :%c", letter);
return 0;
}
在一个if-else语句内包含一个以上的if-else语句称为嵌套的if-else语句,它的一般形式如下:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
else
if(表达式3)
语句3;
else
语句4;
当只有else部分嵌入if-else语句时,就是典型的else-if语句,它是最常用的实现多分支的方法。
if(表达式1)
语句1;
else
if(表达式2)
语句2;
else
语句3;
等价于
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
在嵌套的if-else语句中,很容易出错的地方是else与if匹配错误,例如:
if(表达式1)
if(表达式2)
语句1;
else
if(表达式3)
语句3;
else
语句4;
第一个else与上面两个if中的哪一个匹配呢?为了避免产生二义性,C语言规定,从内层开始,else总是与它上面最近的、未曾匹配过的if匹配。上例中尽管else与第一个if对齐,但它与离它最近的第二个if匹配。
为了避免产生错误,在if嵌套语句中通常采用缩进的代码书写方式表示不同的层次,使同一层次位于相同的缩进位置,这样书写的程序清晰易读,便于改错。
【例3-6】 输入x值,计算出相应的y值。函数的公式如下:
−x x<0
y= 0 x=0
x+10 x>0
该题可以用三种嵌套方式来实现。
方式一:在if中嵌套
#include
int main()
{
int x,y;
printf("Enter x value: ");
scanf("%d", &x);
if(x >= 0)
if(x > 0)
y = x + 10;
else
y = 0;
else
y = -x;
printf("y= %d",y);
return 0;
}
方式二:在else中嵌套
#include
int main()
{
int x,y;
printf("Enter x value: ");
scanf("%d", &x);
if(x > 0)
y = x + 10;
else
if(x == 0)
y = 0;
else
y = -x;
printf("y= %d",y);
return 0;
}
方式三:用else-if语句实现
#include
int main()
{
int x,y;
printf("Enter x value: ");
scanf("%d", &x);
if(x > 0)
y = x + 10;
else if(x == 0)
y = 0;
else
y = -x;
printf("y= %d",y);
return 0;
}
在多分支的应用中,有些情况是通过同一表达式的不同取值来决定执行哪一条分支。如果采用else-if语句或嵌套的if结构实现,程序不够简洁。C语言提供了switch语句专门处理此类多路分支的情况。switch语句的一般格式为:
switch(表达式)
{
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
…
case 常量表达式n:
语句n;
break;
default:
语句n+1;
}
其中表达式的值必须是整型、字符型或枚举型,否则会发生编译错误。其执行过程是首先判断switch后面表达式的值,依次与case常量表达式比较,如果与某个case中的常量表达式相等,则执行其后的语句,遇到break语句跳出整个switch结构执行后面的语句。如果表达式的值与任何case常量表达式都不相等,则执行default中的语句。switch结构中的default可以省略,如果省略了default,当表达式的值与任何case中的常量表达式都不相符时,就什么都不执行。
注意,所有的case后面的语句块后都需要配一个break语句,确保一个特定的case结束。如果省略break语句,则当前匹配的case值之后所有的case值都不再判断,直接执行其后的所有case和default后的语句。
【例3-7】 实现简单的四则运算,从键盘上输入操作符和两个操作数,计算出运算结果。
该问题的解决步骤如下:
1)输入+,−,*,/ 任意一值存入变量。
2)根据变量的值执行相应的操作。
/*
程序名:prg3-7.c
功能:实现简单的四则运算
*/
#include
int main()
{
float num1,num2,result;
char operate;
printf("Please enter a operator: ");
scanf("%c", &operate); //输入操作符
printf("Please enter two numbers: ");
scanf("%f,%f", &num1,&num2); //输入两个操作数
switch(operate)
{ //对operate做多次判断,根据不同的条件执行不同的语句
case '+':
result = num1 + num2;
printf("%5.2f +%5.2f = %5.2f", num1,num2,result);
break; //break语句是必需的,否则会执行下面的语句
case '-':
result = num1 - num2;
printf("%5.2f -%5.2f = %5.2f", num1,num2,result);
break;
case '*':
result = num1 * num2;
printf("%5.2f *%5.2f = %5.2f", num1,num2,result);
break;
case '/':
if(num2 != 0)//除数不能为0
{
result = num1 / num2;
printf("%5.2f /%5.2f = %5.2f", num1,num2,result);
}
else
printf("In a division operation,the divisor can not be zero");
break;
default: //输入的不是+,-,*,/时执行
printf("The operator is invalid");
}
return 0;
}