Bootstrap

C语言基础12:双分支多分支if..else以及switch语句使用

双分支:if …else…

语法:

//语法1:舍弃{}
if(表达式)
    单语句;
else
    单语句;

//语法2:保留{}
if(条件表达式)
{
    单语句或者复合语句;
}
else
{
    单语句或者复合语句;
}

注意:else语句本身不能单独存在,必须和if配合使用

流程图:

在这里插入图片描述

功能:

​ 若表达式的值为1,则执行语句1;否则执行语句2。不管条件表达式成不成立都要执行一个语句,其次需要注意的是,语句1和语句2都可以是单语句或者复合语句。

说明:

if…else…结构可以实现双分支选择结构。C语言允许if…else…结构嵌套使用。即在语句1与语句2中又可以包含完整的if语句或者if…else…结构,并且这种嵌套可以多层使用(为了保证程序的执行效率,建议不超过4层)。利用if…else…结构的嵌套,可以实现多分支选择结构

案例:

  • 需求:计算并输出下列分段的值:

    y = { − 2 x < 0 2 x ≥ 0 y = \begin{cases} -2 \quad x<0\\ \\ 2 \quad\quad x\geq0 \end{cases} y= 2x<02x0

  • 流程图:

    在这里插入图片描述

  • 代码:

    /*************************************************************************
      > File Name:    demo03.c
      > Author:       zk
      > Description:双分支案例,计算并输出分段函数的值 
      > Created Time: 2025年02月11日 星期二 11时32分08秒
     ************************************************************************/
    
    #include <stdio.h>
    
    int main(int argc,char *argv[])
    {
        int x,y;//创建两个变量来存储x,y
    
        printf("请输入x:\n");
        scanf("%d",&x);//通过键盘输入x的值
    
        //校验
        if (x < 0)    y = -2;
        else          y = 2;
    
        printf("y = %d\n",y);//打印输出的结果
    
        return 0;
    }
    
    
  • 运行结果:

    在这里插入图片描述

注意:对于单语句的双分支,我们可以使用三目(三元)运算符的写法简化

三目运算符

语法:

表达式1?表达式2:表达式3;

说明:

​ ①如果表达式1的结果为真,就执行表达式2,否则就执行表达式3

​ ②三目运算符的写法实际上就是单语句的双分支的缩略写法

案例:

  • 需求:将上面的双分支的案例改造为三目运算符的写法。

  • 代码:

    /*************************************************************************
      > File Name:    demo03.c
      > Author:       zk
      > Description:双分支案例,计算并输出分段函数的值 
      > Created Time: 2025年02月11日 星期二 11时32分08秒
     ************************************************************************/
    
    #include <stdio.h>
    
    int main(int argc,char *argv[])
    {
        int x,y;//创建两个变量来存储x,y
    
        printf("请输入x:\n");
        scanf("%d",&x);//通过键盘输入x的值
    
        //校验
        y = x < 0 ? -2 : 2;
    
        printf("y = %d\n",y);//打印输出的结果
    
        return 0;
    }
    
    
  • 运行结果:

    在这里插入图片描述

多分支:if…else if…else…

语法:

//写法1:嵌套if..else..(不推荐)
if (表达式1) 语句1;
else
    if (表达式2) 语句2;
	else
        ....
        else
            if (表达式n) 语句n;
		    else 语句n+1;

//写法2:并列if..else if..else..(推荐)
if (表达式) 语句1;
else if (表达式) 语句2;
.....
else if (表达式n) 语句n;
else 语句+1;		--else 是可选的,由需求决定

流程图:

在这里插入图片描述

注意:多分支中,同一时刻只能满足一个分支。

案例:

  • 需求:根据学生的成绩,对学生进行分级。

    • 成绩>=90 A
    • 成绩>=80 B
    • 成绩>=60 C
    • 成绩< 60 D
  • 代码:

    /*************************************************************************
    > File Name:demo04.c
    > Author:zkk
    > Description: 多分支案例:根据学生的考试成绩分级
    > Created Time: 2025年02月11日 星期二 14时39分22秒
    ************************************************************************/
    
    #include <stdio.h>
    
    // 方式1:借助于执行顺序,减少判断条件
    int if_test1()
    {
        // 创建一个变量,用来存储输入的成绩
        int score;
        // 通过键盘录入成绩
        printf("请输入一个整数:\n");
        scanf("%d",&score);
        
        // 校验
        if (score >= 90) printf("A\n");
        else if (score >= 80) printf("B\n");
        else if (score >= 60) printf("C\n");
        else printf("D\n");
    }
    
    // 方式2:不借助执行顺序,做更精确的判断
    int if_test2()
    {
        // 创建一个变量,用来存储输入的成绩
        int score;
        // 通过键盘录入成绩
        printf("请输入一个整数:\n");
        scanf("%d",&score);
        
        // 校验
        if (score >= 60 && score < 80) printf("C\n");
        else if (score >= 80 && score < 90) printf("B\n");
        else if (score >= 90) printf("A\n");
        else printf("D\n");
        
    }
    
    int main(int argc,char *argv[])
    {
        if_test1();
        if_test2();
        
        return 0;
    }
    
    
if…else结构注意点
  • if…else结构中的语句1和语句2都可以是复合语句。

  • 在if…else结构中,语句1和语句2都可以是空语句。

if语句的嵌套

语法:

if (..)
    if (..)  语句1;
	else     语句2;
else
    if (..)  语句3;
	else     语句4;

流程图:

在这里插入图片描述

注意:

​ ①else总是与前面最近的未配对的if配对使用

​ ②可通过增加{}来确定配对关系

​ ③只要if中包含if,都属于是if语句的嵌套

案例:

/*************************************************************************
> File Name:demo04.c
> Author:zk
> Description: 多分支:if..else if....else..
> Created Time: 2024年11月29日 星期五 14时20分18秒
************************************************************************/
/**
* 要求:根据学生的成绩,对学生进行分级,
成绩 >= 90,A
成绩 >= 80,B
成绩 >= 60,C
成绩 < 60,D
*/
#include <stdio.h>

// 方式1:借助于执行顺序,减少判断的条件
int if_test1()
{
    // 创建一个变量,用来存放输入的成绩
    int score;
    // 通过控制台输入一个成绩
    printf("请输入一个整数:\n");
    scanf("%d",&score);
    
    // 校验,分级 95
    if(score < 0 || score > 100)
    {
        printf("您的输入不合法!\n");
    }
    else
    {
        if(score >= 90)
        {
            printf("A\n");
        }
        else if(score >= 80)
        {
            printf("B\n");
        }
        else if(score >= 60)
        {
            printf("C\n");
        }
        else
        {
            printf("D\n");
        }
    }
}
// 方式2:不借助于执行顺序,做更精准的判断
int if_test2()
{
    // 创建一个变量,用来存放输入的成绩
    int score;
    // 通过控制台输入一个成绩
    printf("请输入一个整数:\n");
    scanf("%d",&score);
    // 校验,分级
    if(score < 0 || score > 100)
    {
        printf("您的输入不合法!\n");
    }
    else if(score >= 60 && score < 80)
    {
        printf("C\n");
    }
    else if(score >= 80 && score < 90)
    {
        printf("B\n");
    }
    else if(score >= 90)
    {
        printf("A\n");
    }
    else
    {
        printf("D\n");
    }
}
int if_test3()
{
    // 需求:判断一个数是奇数还是偶数
    int num;
    printf("请输入一个整数:\n");
    scanf("%d",&num);
    
    // 校验
    if(num == 0)
    {
        printf("0既不是偶数也不是奇数!");
    }
    else
    {
        if(num % 2 == 0)
        {
            printf("%d是偶数!\n",num);
        }
        else
        {
            printf("%d是奇数!\n",num);
        }
    }
}

int main(int argc,char *argv[])
{
    if_test1();
    if_test2();
    if_test3();
    
    return 0;
}

小贴士:

如何拆出一个三位数中的每一位:

实现:123

个位:123 % 10 = 3

十位:123 % 100 / 10 = 2

百位:123 /100 = 1

经典面试题:求水仙花树

解释;一个n位数各位数的n次方和等于这个数本身,复合这种规则的数叫做水仙花数!

用switch语句实现分支结构

我们可以用switch实现多分支选择结构(多分支也被称作多路分支)

语法:

switch (表达式)//表达式的结果建议是字符或者整型
{
    case 常量表达式://这里一般使用自变量,符号常量或者枚举
        语句1;
        break;
    case 常量表达式:
        语句2;
        break;
    .............
    case 常量表达式:
        语句n;
        break;  
    default:
        语句n+1;
        break;//一般省略
}

流程图:

说明:

​ ①switch后括号内的表达式可以是任意类型的表达式,但是表达式的值尽量是整型、字符型、枚举

​ ②若表达式的值与某个常量表达式的值相等时,执行此case后面的语句;若没有相等的值时,执行default后面的语句。

​ ③每个case后面的常量表达式的值必须不相同,否则出现矛盾。

​ ④各个case出现的次序不影响执行结果。

​ ⑤case后面的语句中如果没有break语句,则执行完本case后的语句后会接着执行下面的case,直到遇到下一个break为止。

​ ⑥多个case共用一组语句。

案例:

  • 要求:按照考试成绩的等级输出百分制分数段

  • 分析:

    • 设分段规则如下:
      • A级:85~100段
      • B级:70~84段
      • C级:60~69段
      • D级:<60段
    • 输入其他字符时错误
  • 代码:

    /*************************************************************************
    > File Name:demo05.c
    > Author:  ZK
    > Description: switch案例
    > Created Time: 2025年02月11日 星期二 15时55分43秒
    ************************************************************************/
    
    #include <stdio.h>
    
    
    // 案例1:按照考试成绩的等级输出百分制分数段
    int switch_test1()
    {
        // 创建一个变量,用来存放考试等级
        char grade;
        // 通过控制台输入一个字符
        printf("请输入一个字符:\n");
        scanf("%c",&grade);
        
        // 校验,根据等级输出分数段 Y
        switch(grade)
        {
            case 'A':
                printf("85~100\n");
                break;
            case 'B':
                printf("70~84\n");
                break;
            case 'C':
                printf("60~69\n");
                break;
            case 'D':
                printf("<60\n");
                break;
            default:
                printf("Error\n");
                break;// 如果default在switch的最下面,break是可以省略,反之不能省略。
        }
    }
    
    int main(int argc,char *argv[])
    {
        switch_test1();
        
        return 0;
    }
    
    

案例:

  • 需求:若要求按照百分制考试分数输出等级。

  • 分析:

    • 若分段原则如下:
      • 90~100 A级
      • 80~89 B级
      • 70~79 C级
      • 60~69 D级
  • 代码:

    /*************************************************************************
    > File Name:demo05.c
    > Author:  ZK
    > Description: switch案例
    > Created Time: 2025年02月11日 星期二 15时55分43秒
    ************************************************************************/
    
    #include <stdio.h>
    
    // 需求:若要求按照百分制考试分数输出等级
    int switch_test2()
    {
        // 创建一个变量,存储成绩
        int score;
        // 通过键盘输入一个成绩
        printf("请输入考试成绩:\n");
        scanf("%d",&score);
        
        // 校验,根据成绩输出等级
        switch(score/10)
        {
            case 10:
            case 9:
                printf("A\n");
                break;
            case 8:
                printf("B\n");
                break;
            case 7:
                printf("C\n");
                break;
            case 6:
                printf("D\n");
                break;
            default:
                printf("Error\n");
                
        }
    }
    
    int main(int argc,char *argv[])
    {
        switch_test2();
        
        return 0;
    }
    
    
;