《C语言程序设计》一3.3 多分支选择结构

简介: 本节书摘来自华章出版社《C语言程序设计》一 书中的第3章,第3.3节,作者:赵宏 陈旭东 马迪芳,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 多分支选择结构

多分支选择结构有多种形式,嵌套的if语句和switch语句可以实现多分支结构,嵌套的if语句又包括else-if语句和嵌套的if-else语句。

3.3.1 else-if语句

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所示。

image

【例3-5】 输入学生的成绩,根据成绩打出相应的评定等级。

学生成绩 等级
grade>=90 A
90> grade >=80 B
80> grade >=70 C
70> grade >=60 D
60> grade E

/*
程序名:prg3-5.c
功能:输入学生的成绩,根据成绩打出相应的评定等级
*/

#include <stdio.h>
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;
}

3.3.2 嵌套的if-else语句

在一个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<stdio.h>

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<stdio.h>

 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<stdio.h>
 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;
    
}

3.3.3 switch语句

在多分支的应用中,有些情况是通过同一表达式的不同取值来决定执行哪一条分支。如果采用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<stdio.h>

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;
}
相关文章
|
2月前
|
C语言
初识C语言2——分支语句和循环语句
初识C语言2——分支语句和循环语句
71 5
|
2月前
|
网络协议 编译器 Linux
【C语言】结构体内存对齐:热门面试话题
【C语言】结构体内存对齐:热门面试话题
|
23天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
61 16
|
2月前
|
C语言
【c语言】分支语句
C语言通过三种基本结构——顺序、选择和循环,构建复杂的程序逻辑。本文主要介绍了C语言的选择结构,即if-else语句及其变体,包括简单的if语句、if-else组合、else if多分支判断、嵌套if以及解决悬空else问题的方法。此外,还详细讲解了逻辑运算符和关系运算符的使用,以及如何利用条件操作符简化逻辑判断。最后,文章对比了if-else与switch语句在实现多分支逻辑时的应用,并解释了switch语句中的break和default关键字的作用。
31 8
|
2月前
|
Serverless C语言
C语言控制语句:分支、循环和转向
C语言控制语句:分支、循环和转向
|
2月前
|
算法 编译器 C语言
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
|
2月前
|
编译器 C语言 Python
C语言结构
C语言结构
17 0
|
2月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
17 0
|
2月前
|
程序员 C语言
【C语言】分支语句(逻辑运算符与关系运算符)
【C语言】分支语句(逻辑运算符与关系运算符)
|
3月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。