前言:
- C语言是用来解决问题的,除了必要的数据输入与输出(见前文),还要有逻辑结构。其中基本可以归为三类:顺序结构、选择结构、循环结构。
- 今天,杰哥提笔写的是关于选择结构(又叫“分支结构”)的笔记。
- 👉在本博文中,将有对 if 、else、switch使用场景的举例,还有 关键字 case 、break的使用。
一、if 、 else 引导的分支结构
1、单分支
场景示例:公司要么录用你,要么没有消息。(要么执行,要么不执行)👉
#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:
公司给大家都发奖金,要么多发,要么少发。(从两个执行的操作中选择一个执行)👉
#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:一条执行内容时可以不用花括号,多条执行内容时看情景判断是否用花括号,但从代码阅读的体验感来说,一般来说,我们加上花括号比较好。
#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)。👉
#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 多重嵌套的省略版本。👉
#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:以下执行内容为一条语句,可以省略花括号。
#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 嵌套 ---- 实现多分支
#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 --- 实现多分支
可读性是不是比法一好呢?
#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还 可以这样用:
#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 !!!!!
漏掉会怎么样呢?示例如下:👉
#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;
}
输入:
输入 2
输出(结果):
星期二
星期三
分析:输入2后,case 2作为入口,开始进入执行,然而刹不住“车”,直到遇到break才停止执行。
接着,看看以下这个会输出什么👉,答案见下节
#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;
}