第一部分  C++编程知识  第三章 分支语句与循环语句  

第五节  switch语句

        除了 if 语句外,C语言和C++语言还提供了 switch 语句来实现分支结构。 switch 语句是一种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更简单易用、可读性更好的形式。下面是 switch 语句的基本语法:

switch (expression) 
{
	case value1: statement
	case value2: statement
	default: statement
}

        上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值, 就执行 default 分支。但是我们要注意,switch 后的 expression 必须是整型表达式,另外 case 后的值,必须是整型常量表达式。


一、if 语句和 switch 语句的对比

        我们现在想实现“输入任意一个整数,计算除三之后的余数”这个功能,用之前学习的if语句很容易就可以实现,代码如下:

#include <cstdio>
int main(){
	int num = 0;
	scanf("%d", &num);
	if (num % 3 == 0)
		printf("您输入的整数除三之后的余数为0。\n");
	else if (num % 3 == 1)
		printf("您输入的整数除三之后的余数为1。\n");
	else if (num % 3 == 2)
		printf("您输入的整数除三之后的余数为2。\n");
	return 0;
}

        这段代码是可以拿 switch 语句修改的,改完之后的代码是:

#include <cstdio>
int main(){
	int num = 0;
	scanf("%d", &num);
	switch (num % 3)
	{
	case 0: printf("您输入的整数除三之后的余数为0。\n");
		break;
	case 1: printf("您输入的整数除三之后的余数为1。\n");
		break;
	case 2: printf("您输入的整数除三之后的余数为2。\n");
		break;
	}
	return 0;
}

        上述的代码中,我们要注意的事项有:

1、case 和后边的数字之间必须有空格

2、每一 case 语句中的代码执行完成后,需要加上 break,才能跳出这个switch语句。case 语句仅决定了代码的入口。


二、switch 语句中的 break

        如果上面的示例代码中,我们去掉所有 case 语句中的 break。那么运行结果就会完全不一样:

#include <cstdio>
int main()
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d", &num);
	switch (num % 3){
	case 0:
		printf("您输入的整数除三之后的余数为0。\n");
	case 1:
		printf("您输入的整数除三之后的余数为1。\n");
	case 2:
		printf("您输入的整数除三之后的余数为2。\n");
	}
	return 0;
}

        输入一个数据测试一下,运行结果如下:

        我们发现,124除以3本来余数是1,但是程序运行的结果多了一行“您输入的整数除三之后的余数为2”的打印。出现这个问题的原因就是 switch 语句只是起到分支选择效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语句,如果某一个 case 语句的后边没有 break 语句,代码会继续往下执行,也就是执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。

        所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。当然,break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

        下面我们就来通过两个示例体会 break 语句的重要性。

        第一个示例是要去实现“输入一个1~7的数字,打印对应的星期几”的功能,例如:输入1 ,输出星期一;输入2 ,输出星期二;…… 下面是实现这个功能所编写的代码:

#include <cstdio>
int main()
{
	int day = 0;
	printf("请输入一个整数:");
	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;
	}
	return 0;
}

        上面这个示例中,每个case语句后面都有对应需要执行的语句以及break语句,接下来第二个实例是要去实现输入一个1~7的数字,如果输入的是1~5,打印“工作日”;如果输入的是6~7,打印“休息日”的功能,那么就可以将上面这段代码修改如下:

#include <cstdio>
int main() {
	int day = 0;
	printf("请输入一个整数:");
	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;
	}
	return 0;
}

        从上面的两个示例中,我们发现应该根据实际的情况,来在代码中判断是否应该使用 break ,以及在哪里使用 break ,才能正确完成实际的需求。


三、switch语句中的default

        在使用 switch 语句的时候,经常可能遇到一种情况,就是 switch 后的表达式中的值无法匹配代码中的任何一个 case 语句,这时候要是不做特殊处理,编译器的输出结果就为空,所以为了让运行结果不为空,我们在 switch 语句中加入 default 子句。

switch (expression) 
{
	case value1: statement
	case value2: statement
	default: statement
}

        简单来说就是,switch后面的expression的结果不是value1也不是value2的时候,就会执行default子句。比如“实现‘输入一个1~7的数字,打印对应的星期几’的功能”这个例子,如果我们输入的数字不是1 ~ 7的值,就可以设置一个 default 子句来实现打印“输入错误,请输入一个1~7之间的整数。”具体操作是将上面的示例代码更改如下:

#include <cstdio>
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("输入错误,请输入一个1~7之间的整数");
		break;
	}
	return 0;
}

四、switch语句中的case和default的顺序问题

        在 switch 语句中 case 子句和 default 子句其实是没有顺序要求的,只要编程代码的顺序是可以满足实际需求的就可以。

        不过大多数程序员的编程习惯是把 default 子句放在最后处理。


【练习一】

        气象意义上,通常以3~5月为春季(spring),6~8月为夏季(summer),9~11月为秋季(autumn),12月~来年2月为冬季(winter)。请根据输入的年份以及月份,输出对应的季节。

· 输入描述:输入的数据格式是固定的YYYYMM的形式,即:年份占4个数位,月份占2个数位。

· 输出描述:输出月份对应的季节(用英文单词表示,全部用小写字母)。

· 备注:输入的年份应该是4位数,输入的月份应该为1~12。

【参考答案1 —— 使用scanf和printf函数】

#include <cstdio>
int year, month;
int main()
{
	scanf("%4d%2d", &year, &month);
	switch (month)
	{
	case 3:
	case 4:
	case 5:
		printf("spring\n");
		break;
	case 6:
	case 7:
	case 8:
		printf("summer\n");
		break;
	case 9:
	case 10:
	case 11:
		printf("autumn\n");
		break;
	case 12:
	case 1:
	case 2:
		printf("winter\n");
		break;
	}
	return 0;
}

【参考答案2 —— 使用cin和cout】

#include <iostream>
using namespace std;
int yearandmonth;
int main(){
	cin >> yearandmonth;
	int month = yearandmonth % 100;
	switch (month){
	case 3:
	case 4:
	case 5:
		cout << "spring" << endl;
		break;
	case 6:
	case 7:
	case 8:
		cout << "summer" << endl;
		break;
	case 9:
	case 10:
	case 11:
		cout << "autumn" << endl;
		break;
	case 12:
	case 1:
	case 2:
		cout << "winter" << endl;
		break;
	} return 0;
}

【参考答案3 —— 使用if-else语句】

        这种类型的题目可以使用switch语句来解决,但使用正常的if…else语句也是可以解决的,而且可能更加方便,对于针对这种连续的数据范围,其实更加推荐使用if语句。

#include <cstdio>
int year, month;
int main(){
	scanf("%4d%2d", &year, &month);
	if (month >= 3 && month <= 5)
		printf("spring\n");
	else if (month >= 6 && month <= 8)
		printf("summer\n");
	else if (month >= 9 && month <= 11)
		printf("sutumn\n");
	else
		printf("winter\n"); //因为month的范围就是1~12
	return 0;
}

【练习二】

        一个最简单的计算器,支持 + , -, * , / 四种运算。仅需考虑输入输出为整数的情况,数据和运算结果不会超过 int 表示的范围。然而:

(1)如果出现除数为 0的情况,则输出:Divided by zero!。

(2)如果出现无效的操作符(即不为 + , - , * , /  之一),则输出:Invalid operator!。

(3)除号表示整除,结果向 0 取整。

· 输入格式:输入只有一行,共有三个参数,其中第 1,2 个参数为整数,第 3个参数为操作符。

· 输出格式:输出只有一行,一个整数,为运算结果。然而:

(1)如果出现除数为 0的情况,则输出:Divided by zero!。

(2)如果出现无效的操作符(即不为 + , - , * , /  之一),则输出:Invalid operator!。

(3)除号表示整除,结果向 0 取整。

【参考输入输出】

【参考答案】

#include <iostream>
using namespace std;
int a, b;
char c;
int main()
{
	cin >> a >> b >> c;
	switch (c)
	{
	case '+':
		cout << a + b << endl;
		break;
	case '-':
		cout << a - b << endl;
		break;
	case '*':
		cout << a * b << endl;
		break;
	case '/':
		if (0 == b)
			cout << "Divided by zero!" << endl;
		else
			cout << a / b << endl;
		break;
	default:
		cout << "Invalid operator!" << endl;
		break;
	}
	return 0;
}

【本题注意点 】

        本题当中运用到了case语句后面连接字符,因为字符的本质是其对应的ASCII码值,也是属于整型表达式的范畴。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐