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;
}
相关推荐
xiangyun617 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun617 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
Logic1019 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位
Escalating_xu9 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
Navigator_Z9 小时前
LeetCode //C - 1250. Check If It Is a Good Array
c语言·算法·leetcode
SuperByteMaster11 小时前
freertos 任务创建方式
c语言
susplus12 小时前
【传感器DS18B20】51单片机上实现温度采集
c语言·51单片机·ds18b20·温度采集
Logic10113 小时前
C语言/数据结构位运算题解:异或XOR找出流水线上的“独特零件编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
山下梅子酒22513 小时前
洛谷-入门-B2043
c语言
幼儿园蛋小黑15 小时前
【无标题】C语言变量,类型转换,运算符,输入和输出
c语言·嵌入式实时数据库