C初阶(八)选择结构(分支结构)--if、else、switch

前言:

  • C语言是用来解决问题的,除了必要的数据输入与输出(见前文),还要有逻辑结构。其中基本可以归为三类:顺序结构、选择结构、循环结构。
  • 今天,杰哥提笔写的是关于选择结构(又叫"分支结构")的笔记。
  • 👉在本博文中,将有对 if 、else、switch使用场景的举例,还有 关键字 case 、break的使用。

一、if 、 else 引导的分支结构

1、单分支

场景示例:公司要么录用你,要么没有消息。(要么执行,要么不执行)👉

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d",&score);
    if(score > 90)
    {
        printf("录用\n");
    }
    return 0;
}

2、双分支

场景示例1:

公司给大家都发奖金,要么多发,要么少发。(从两个执行的操作中选择一个执行)👉

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d",&score);
    if(score > 90)
    {
        printf("多发奖金\n");
    }
    else
    {
        printf("少发奖金\n");
    }
    return 0;
}

场景示例2:

成年与未成年👉

tip:一条执行内容时可以不用花括号,多条执行内容时看情景判断是否用花括号,但从代码阅读的体验感来说,一般来说,我们加上花括号比较好。

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d",&age);
    if(age >= 18)
    {
        printf("成年\n");
        printf("可以自己办银行卡\n");
    }
    else
    {
        printf("未成年\n");
    }
    return 0;
}

3、多分支

场景示例1:

成绩评级 ----> 60以下(不及格)、60~80(等级C)、80~90(等级B)、90~100(等级A)。👉

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d",&score);
    if(score < 60)
    {
        printf("不及格\n");
    }
    else //此时前提变为score >= 60
    {
        if(score < 80)
        {
            printf("C\n");
        }
        else //此时前提变为score >= 80
        {
            if(score <90)
            {
                printf("B\n");
            }
            else //此时前提变为score >= 90
            {
                printf("A\n");
            }
        }
    }
	return 0;
}

但是,这样看着观感不好,这里我们可以写if - else 多重嵌套的省略版本。👉

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d",&score);
    if(score < 60)
        printf("不及格\n");
    else if(score < 80)
        printf("C\n");
    else if(score <90)
        printf("B\n");
    else 
        printf("A\n");
	return 0;
}

如何理解if - else 嵌套中if和else的关系呢?解答如下:

场景示例2: 年龄段的判断👉

tip:以下执行内容为一条语句,可以省略花括号。

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age < 18)
    {
        printf("少年\n");
    }
    else if (age >= 18 && age < 30)
    {
        printf("青年\n");
    }
    else if (age >= 30 && age < 50)
    {
            printf("中年\n");
    }
    else if (age >= 50 && age < 80)
    {
        printf("老年\n");
    }
    else
    {
        printf("老寿星\n");
    }
    return 0;
}

二、switch 引导的分支结构

  • 关键字:case --- "事件",用于各情况的罗列;break --- 跳出switch 分支;default --- 提供一种处理意外情况的机制,确保在没有匹配的case情况下程序仍有相应的执行逻辑。
  • switch --- 作用:使多分支结构的可读性加强。
  • 注意:switch(input) --- 其中的input 只能为整型变量,不能是浮点型等。
  • 注意:case后的情况只能是"整型常量表达式",如:1、3+2
    场景示例:1---星期一 ······ 7---星期日👉

法一:if - else 嵌套 ---- 实现多分支

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
 
	if (1 == day)
		printf("星期一");
	else if (2 == day)
		printf("星期二");
	else if (3 == day)
		printf("星期三");
	else if (4 == day)
		printf("星期四");
	else if (5 == day)
		printf("星期五");
	else if (6 == day)
		printf("星期六");
	else if (7 == day)
		printf("星期日");
    else
        printf("输入错误\n");
	return 0;
}

法二:switch --- 实现多分支

可读性是不是比法一好呢?

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");
        break;
    case 3:
        printf("星期三\n");
        break;
    case 4:
        printf("星期四\n");
        break;
    case 5:
        printf("星期五\n");
        break;
    case 6:
        printf("星期六\n");
        break;
    case 7:
        printf("星期天\n");
        break;
    default:
        printf("输入错误\n");
        break;
    }
    return 0;
}

另外,switch还 可以这样用:

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("工作日\n");
        break;
    case 6:
    case 7:
        printf("周末\n");
        break;
    default:
        printf("输入错误\n");
        break;
    }
    return 0;
}

三、使用switch过程中容易发生的问题

注意不要漏掉*++break++* !!!!!

漏掉会怎么样呢?示例如下:👉

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");//此处漏掉break
    case 3:
        printf("星期三\n");
        break;
    case 4:
        printf("星期四\n");
        break;
    case 5:
        printf("星期五\n");
        break;
    case 6:
        printf("星期六\n");
        break;
    case 7:
        printf("星期天\n");
        break;
    default:
        printf("输入错误\n");
        break;
    }
    return 0;
}

输入:

cs 复制代码
输入 2

输出(结果):

cs 复制代码
星期二
星期三

分析:输入2后,case 2作为入口,开始进入执行,然而刹不住"车",直到遇到break才停止执行。

接着,看看以下这个会输出什么👉,答案见下节

cs 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int n = 1;
    int m = 2;
    switch (n)
    {
    case 1:m++;
    case 2:n++;
    case 3:
        switch (n)//switch可以嵌套使用
        {
        case 1:n++;
        case 2:
            m++; n++;
            break;
        }
    case 4:
        m++;
        break;
    default:
        break;
    }
    printf("m = %d,n = %d\n", m, n);
    return 0;
}
相关推荐
长天一色21 分钟前
【C语言系统编程】【第三部分:网络编程】3.1 套接字编程(TCP/UDP基础)
c语言·网络·tcp/ip
丁丁Tinsley11172 小时前
数据结构——顺序表(基础代码题)
c语言·数据结构·算法
Grayson_Zheng4 小时前
【解决方案】关于 UART 接收数据时丢失数据的解决办法——环形缓冲存储区
c语言·数据结构·stm32·单片机
潜※者5 小时前
C语言 动态数据结构的C语言实现内存映像
c语言
长天一色7 小时前
【C语言系统编程】【第三部分:网络编程】3.2 数据传输和协议
c语言·开发语言·网络
Lbs_gemini06037 小时前
Java研发笔记6——C语言程序设计学习笔记5
c语言·笔记·学习
朔北之忘 Clancy8 小时前
2021 年 12 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解
2401_858286119 小时前
68.【C语言】动态内存管理(重点)(1)
c语言·开发语言·数据结构
卑微求AC9 小时前
(C语言贪吃蛇)14.用绝对值方式解决不合理的走位
linux·c语言·开发语言·嵌入式·c语言贪吃蛇
且听吟风°12 小时前
04 B-树
c语言·数据结构·b树