《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;
}
相关文章
|
7月前
|
C语言
C语言分支和循环语句
分支语句由`if-else`构成,用于根据不同条件执行相应代码。`else`会与最近未配对的`if`结合,多个条件可用`else if`实现。若连续使用`if`,各条件互不影响。嵌套结构可在`if`中再加入`if-else`。此外,`switch`语句适用于多分支选择(注意表达式不能为浮点数,`case`后需加`break`)。循环语句包括`for`、`while`和`do...while`,注意`do...while`末尾需加分号。循环中,`break`直接终止循环,`continue`跳过当前循环剩余部分,但`for`的语句三仍会执行,而`while`中位置影响效果。
167 0
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
696 16
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
335 18
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
572 3
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
432 2
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
232 1
|
IDE 定位技术 开发工具
C语言 第四章 关系、逻辑运算与分支流程控制
一、关系运算 若干表达式用关系运算符连接而成,就构成关系表达式。 关系表达式中,表达式成立,其值为1(真);表达式不成立,其值为0(假)。其他表达式中,其结果如果是非0则为真,结果为0则为假。 关系运算符的优先级低于算术运算符,高于赋值运算符。
1180 0
|
4月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1104 0
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
758 23
|
6月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
355 15