Bootstrap

蓝桥杯之c++入门(三)【条件判断】


前言

在编程的世界中,条件判断与循环控制是构建复杂程序逻辑的基础。它们能够帮助我们根据不同的条件执行不同的代码路径,。本章将深入探讨C/C++语言中条件判断和循环控制的多种方式,包括if-else语句、关系和逻辑操作符、switch语句,通过这些工具,我们可以实现复杂的逻辑控制和重复任务的自动化。


1. if-else语句

1.1 if语句

if 语句的语法形式如下:

if ( 表达式 )
  语句;

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行0为假,非0表示真,也就是表达式的结果如果是0 ,则语句不执行,表达式的结果如果是不是 0 ,则语句执行。

题目:输入一个正整数 n,判断 n 是否为奇数

#include <iostream>
using namespace std;
int main()
{
 	int n = 0;
 	cin >> n;
 	if (n % 2 == 1) 
 	cout << n << "是奇数" << endl;
 	return 0;
}

if语句执行流程 :
在这里插入图片描述

1.2 else语句

一个正整数不是奇数,那就是偶数了,把上面的题目换一下:

题目:输入一个正整数 n ,如果 n \mathsf{n} n 是奇数就打印 奇数 ,是偶数就打印 偶数这里就需要 if…else… 语句了,语法形式如下:

if ( 表达式 )
 语句1;
else
 语句2;

代码如下:

#include <iostream>
using namespace std;
int main()
{
 	int n = 0;
 	cin >> n;
 	if (n % 2 == 1) 
 		cout << n << "是奇数" << endl;
 	else
 		cout << n << "是偶数" << endl;
 	return 0;
}

注意:if 和 else的后边是没有分号的

练习:输入一个数表示年龄,年龄 > =   18 >=~18 >= 18 岁就输出: 成年 ,否则就输出: 未成年

#include <iostream>
using namespace std;
int main()
{
 	int age = 0;
 	cin >> age;
 	if (age >= 18)
 		cout << "成年" << endl;
 	else
 		cout << "未成年" << endl;
 	return 0;
}

如果 a g e > = 18 \mathsf{a g e>=18} age>=18 的时候,还需要打印: 可以谈恋爱了 , age < 18 时,还需要提示 “不能早恋” ,代码该怎么写?

这时候 if 和 else 控制的就是2条语句了,就得带上 {} 了。

#include <iostream>
using namespace std;
int main()
{
 	int age = 0;
 	cin >> age;
 	if (age >= 18)
 	{
 		cout << "成年" << endl;
 		cout << "可以谈恋爱了" << endl;
 	}
 	else
 	{
 	cout << "未成年" << endl;
 	cout << "不能早恋" << endl;
 	}
 	return 0;
}

小提示:

if / else 后边默认只能控制一条语句,如果需要写多条语句的时候,需要使用{}

1.3 嵌套if

在 if else 语句中, else 可以与另一个 if 语句连用,构成多重判断。形如:

//形式1
if()
 	语句1;
else
{
 	if()
 	语句2;
 	else
 	语句3;
} 

//形式2
if()
 	语句1;
else if()
 	语句2;
else
 	语句3;

上面的代码和下边代码是相同的逻辑

其中后面的部分相当于嵌套在 else 语句中; if…else 语句是在 if 或者 else 中选择执行其中一句代码,其实 f…else 是一条语句,那么 形式 1 中橙色代码外边的 {} 就可以省略掉,就和 形式 2 一样了。

练习:判断数正负
#include <iostream>
using namespace std;
int main()
{
 	int n = 0;
 	cin>>n;
 	if(n>0)
 		cout << "positive" << endl;
 	else if(n < 0)
 		cout << "negative" << endl;
 	else
 		cout << "zero" << endl;
 	return 0;
}

其实上面的代码也可以这样写代码:

#include <iostream>
using namespace std;
int main()
{
 	int n = 0;
 	cin >> n;
 	if (n >= 0)
 	{
 	if (n > 0)
 		cout << "positive" << endl;
 	else if (n == 0)
 		cout << "zero" << endl;
 	}
 	else
 		cout << "negative" << endl;
 	return 0;
}

以上就是嵌套 if 语句的语法,有了嵌套 if 语句,就可以完成更多复杂逻辑的判断。

1.4 悬空else

我们首先从下面代码开始

#include <iostream>
using namespace std;
int main()
{
 	int a = 0;
 	int b = 2;
 	if(a == 1)
 		if(b == 2)
 			cout << "hehe" << endl;
 	else
		cout << "haha" << endl;
 return 0;
}

程序运行的结果是啥?

很多初学者,上来以判断 a 是 0,不等于 1 ,那就执行 else 子句,打印 haha但是当你去运行代码,输出的结果是:啥都不输出

为什么呢?

这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最接近的 if 匹配

上面的代码排版,让 else 和第一个 if 语句对齐,让我们以为 else 是和第一个 if 匹配的,当if 语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第二个 if 进行匹配的,这样后边的 if…else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印。

如果代码改成下面这样就更加容易理解了

#include <iostream>
using namespace std;
int main()
{
 	int a = 0;
 	int b = 2;
 	if(a == 1)
 	{
 		if(b == 2)
 			cout << "hehe" << endl;
 		else
 			cout << "haha" << endl;
 	}
 	return 0;
}

或者如果我们希望 else 确实和第一个 if 匹配,可以这样修改代码:

#include <iostream>
using namespace std;
int main()
{
 	int a = 0;
 	int b = 2;
 	if(a == 1)
 	{
 		if(b == 2)
 		cout << "hehe" << endl;
 	}
 	else
 	{
 		cout << "haha" << endl;
 	}
 	return 0;
}

小提示:

只要带上适当的大括号,代码的逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。

1.5 练习

练习1: 整除判断

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
    int m = 0;
    int n = 0;
    cin >> m >> n;
    if(m % n == 0)
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}

小提示:

判断相等是 = = == == 不能写成 = = =

注意输出信息的格式 (大小写)

练习2:比较大小

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
    long long x = 0;
    long long y = 0;
    cin >> x >> y;
    if (x > y)
        cout << ">" << endl;
    else if (x == y)
        cout << "=" << endl;
    else
        cout << "<" << endl;
    return 0;
}

小提示

在这里插入图片描述

练习3:输出绝对值

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
    float n = 0;
    scanf("%f", &n);
    if (n >= 0)
        printf("%.2f\n", n);
    else
        printf("%.2f\n", -n);
    return 0;
}

当然这个题目,还有其他的解法,比如

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
 	float n = 0;
 	scanf("%f", &n);
 	n = fabs(n);
 	printf("%.2f\n", n);
 	return 0;
}

这里使用了一个库函数fabs 是用来求一个浮点数的绝对值的,需要的头文件是 函数原型如下:

double fabs (double x);   
float fabs (float x);   
long double fabs (long double x);  

相关的函数还有abs ,是求整数的绝对值的,需要的头文件是 ****函数原型如下:

int abs (int n);
long int abs (long int n);
练习4:奇偶数判断

在这里插入图片描述

//代码1
#include <iostream>
using namespace std;
int main()
{
 	int n = 0;
 	cin >> n;
 	if (n % 2)
 		cout << "odd" << endl;
 	else
 		cout << "even" << endl;
 	return 0;
}

注意这种写法可能是存在问题的,因为题目中n的取值范围是: − 100   ≤   n   ≤   100 -100~\leq~n~\leq~100 100  n  100 ,所以 n % 2可能是 -1 的。

#include <iostream>
using namespace std;
int main()
{
 	int n = 0;
 	cin >> n;
 	if (n % 2 == 1)
 		cout << "odd" << endl;
 	else if(n % 2 == -1)
 		cout << "odd" << endl;
 	else 
 		cout << "even" << endl;
 	return 0;
}

2. 关系操作符

2.1 关系操作符介绍

用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称为“关系运算符”(relational operator),主要有下面6个。

运算符描述
>大于运算符,用于比较两个数值,如果左侧数值大于右侧数值,则返回1(真),否则返回0(假)
<小于运算符,用于比较两个数值,如果左侧数值小于右侧数值,则返回1(真),否则返回0(假)
>=大于等于运算符,用于比较两个数值,如果左侧数值大于或等于右侧数值,则返回1(真),否则返回0(假)
<=小于等于运算符,用于比较两个数值,如果左侧数值小于或等于右侧数值,则返回1(真),否则返回0(假)
==相等运算符,用于比较两个值是否相等,如果相等,则返回1(真),否则返回0(假)
!=不等于运算符,用于比较两个值是否不相等,如果不相等,则返回1(真),否则返回0(假)

下面是一些例子:

a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;

关系表达式通常返回 0 或 1 ,表⽰真假( 0 表⽰假,所有⾮零值表⽰真)。⽐如, 20 > 12 返回1 , 12 > 20 返回 0 。

关系表达式常用于 if 或 while 结构。

if (x == 3) 
{
 	cout << "x is 3" << endl;
}

注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。

if (x = 3) ...

这里是赋值语句,不是比较,始终会走到if条件里。

2.1.1 关系操作符连用

另一个需要避免的错误是:多个关系运算符不宜连用

(i < j) < k

上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。

i < j && j < k
2.1.2 浮点数比较相等

在比较浮点数时,由于浮点数在计算机中是以有限精度表示的,也就是说有些浮点数在内存中其实无法精确保存,这可能导致浮点数比较中的一些精度误差问题。

如果直接使用 = = == == 来比较两个浮点数,很可能会由于这些微小的误差导致不准确的结果。

举例:

#include <iostream>
using namespace std;
int main()
{
 	double a = 0.1;
 	double b = 0.2;
 	double c = 0.3;
 	if (a + b == c) 
 		cout << "a + b == c" << endl;
 	else
 		cout << "a + b != c" << endl;
 	return 0;
}

Microsoft Visual Studio 调试控制台

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是不是很奇怪?

那浮点数怎么比较呢?这时候就要允许有误差存在,常见的写法如下:

#include <iostream>
using namespace std;
int main()
{
 	double a = 0.1;
 	double b = 0.2;
 	double c = 0.3;
 	if (fabs((a + b) - c) < 1e-9) // 1e-9 表⽰允许的误差范围
 		cout << "a + b 约等于 c" << endl;
 	else
 		cout << "a + b 不等于 c" << endl;
	return 0;
}

2.2 练习

练习1:有一门课不及格的学生

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
 	int s1, s2, s3;
 	int c = 0;
 	cin >> s1 >> s2 >> s3;
 	if (s1 < 60)
 		c++;
 	if (s2 < 60)
 		c++;
 	if (s3 < 60)
 		c++;
 	if (c == 1)
 		cout << 1 << endl;
 	else
 		cout << 0 << endl;
 	return 0;
}

这个题目还可以这样写:

#include <iostream>
using namespace std;
int main()
{
 	int s1, s2, s3;
 	int c = 0;
 	cin >> s1 >> s2 >> s3;
 	if ((s1 < 60) + (s2 < 60) + (s2 < 60) == 1)
		cout << 1 << endl;
 	else
 		cout << 0 << endl;
 	return 0;
}

因为⼀个关系操作符计算的结果如果是真就是 1 ,如果是假就是 0 ,所以这⾥我们把三⻔成绩判断的结果相加,如果等于 1 ,就说明只有⼀⻔成绩不及格,也能达到题⽬的要求,⼀定程度上简化了代码。

练习2: 等差数列末项计算

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include <iostream>
using namespace std;
int main()
{
 	int a1, a2, n;
 	cin >> a1 >> a2 >> n;
 	if (n == 1)
 		cout << a1 << endl;
 	else if (n == 2)
 		cout << a2 << endl;
 	else
 		cout << a2 + (n - 2) * (a2 - a1) << endl;
 	return 0;
}

小提示:

  1. 这类题目中也要注意变量的范围,比如:题目中 n 的取值是 >0 的,那么n是有可能为1和2的,这两个值要特殊处理,剩余的值是可以通过计算得到的。
  2. 如果从第2个数 a2 开始计算,第 n 个数和 a2之间的差就是 (n-2) 个等差的值。

3. 条件操作符

3.1 条件操作符介绍

条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:

 exp1 ? exp2 : exp3  

条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算, exp2 计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算, exp3 计算的结果是整个表达式的结果。这种三目操作符和 if 语句的逻辑非常相似,就是根据 exp1 的结果来选择执行 exp2 ,或者exp3 。一般使用在简单的逻辑判断中。

练习:使用条件操作符表示下面代码的逻辑

#include <iostream>
using namespace std;
//改造前:未使⽤条件操作符
int main()
{
 	int a = 0;
 	int b = 0;
 	cin >> a;
 	if (a > 5)
 		b = 3;
 	else
 		b = -3;
 	cout << b << endl;
 	return 0;
}
//改造后:使⽤了条件操作符
#include <iostream>
using namespace std;
int main()
{
 	int a = 0;
 	int b = 0;
 	cin >> a >> b;
 	b = (a > 5 ? 3 : -3);
 	cout << b << endl;
 	return 0;
}

3.2 练习

练习1:最大值输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include <iostream>
using namespace std;
int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    int m = a > b ? (a > c ? a : c) : (b > c ? b : c);
    cout << m << endl;
    return 0;
}

小提示

三目操作符不仅应用在比大小场景中,在后续的学习中我们会见到更加丰富的用法,但是般不会应用在非常复杂的逻辑中。

练习2:特殊计算

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include <iostream>
using namespace std;
int main()
{
    long long x = 0;
    long long y = 0;
    long long z = 0;
    cin >> x >> y;
    if (y % x == 0)
        z = x + y;
    else
        z = y - x;
    cout << z << endl;
    return 0;
}

这个题目在审题的时候,也是要注意数据范围的问题,选择适当的数据类型:这样的数据范围,其实 int 类型是无法满足的,只能使用 long long 类型。

那有人就说,以后只要是整型数据,我直接把类型写成long long 是不是更好呢?其实大部分情况下是没问题,但是如果是开辟数组,数组比较大的情况下,如果类型选择 longlong 类型作为元素类型,可能会发生空间不满足的情况。

练习3:Apples Prologue / 苹果和虫子

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include <iostream>
using namespace std;
int main()
{
    int m, t, s;
    cin >> m >> t >> s;
    if(t == 0)
    {
        cout << 0 << endl;
        return 0;
    }
    int r = 0;
    if(s % t == 0)
    {
        r = m - s/t > 0 ? m - s/t : 0; 
    }
    else
    {
        
        r = m - s/t - 1 > 0 ? m - s/t - 1 : 0; 
    }
    cout << r << endl;
    return 0;
}

小提示

这个题目要注意,题目中的特殊情况分析

  1. t 可能是0,t会被当做除数,而除数不能是0,所以可能会导致运行时错误的。如果不增加特殊处理,就会有问题,题目最后有提示。
  2. 根据题目给出的数据,算出的吃掉的苹果数可能要比真实的苹果还多,这样会计算出负数,这也是不允许的,最多就是吧苹果吃完,一个都不剩余。
  3. 题目中有些特殊情况,没有提示,有时候需要从数据上做推断。

4. 逻辑操作符

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

符号名称功能
!逻辑取反运算符改变单个表达式的真假状态。如果表达式为真,则结果为假;如果表达式为假,则结果为真。
&&逻辑与运算符两侧的表达式都需要为真时,结果才为真。如果任何一个表达式为假,结果就为假。
||逻辑或运算符两侧的表达式中,只要有一个为真,结果就为真。只有当两个表达式都为假时,结果才为假。

注: C/C++ 中,非0表示真,0表示假

4.1 逻辑取反运算符

逻辑反操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比如,我们有一个变量叫 flag ,如果 flag 为假的时候,就做某些事情,可以这样写代码:

#include <iostream>
using namespace std;
int main()
{
 	int flag = 0;
 	if (!flag)
 	{
 		cout << "do something" << endl;
 	}
 	return 0;
}

如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真,所以上面的代码的意思就是flag 为假,执行if语句中的代码。

4.2 逻辑与运算符

逻辑与

在这里插入图片描述

&& 就是与运算符,也是并且的意思, & & \&\& && 是一个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。

比如:如果我们说月份是3月到5月,是春天,那使用代码怎么体现呢?

int month = 0;
cin >> month;
if (month >= 3 && month <= 5)
{
 	cout << "春季" << endl;
}

这里表达的意思就是 month 既要大于等于3,又要小于等于5,必须同时满足。

4.3 逻辑或运算符

逻辑或

在这里插入图片描述

|| 就是或运算符,也就是或者的意思, || 也是一个双目操作符,使用的方式是 a || b , ||两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

比如:我们说一年中月份是 12 月或者 1 月或者 2 月是冬天,那么我们怎么使用代码体现呢?

int month = 0;
cin >> month;
if (month == 12 || month == 1 || month == 2)
{
 	cout << "冬季" << endl;
}

4.4 短路

逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。

如果左边的表达式就能确定整个表达式的结果,就不再对右边的表达式求值。这种情况称为“短路”。

如前面的代码:

 if(month >= 3 && month <= 5)

表达式中 && 的左操作数是 month >= 3 ,右操作数是 month < 5 <5 <5 ,当左操作数 month >= 3的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。

所以,对于 && 操作符来说,左边操作数的结果是 0 的时候,右边操作数就不再执行。

对于 || 操作符是怎么样呢?我们结合前面的代码:

 if(month == 12 || month == 1 || month == 2)

如果 m o n t h = = 12 \mathtt{m o n t h}==12 month==12 ,则不用再判断 month 是否等于 1 ^{1} 1 或者 2 ^2 2 ,整个表达式的结果也是 1 (是冬季)。

所以, || 操作符的左操作数的结果不为 0 时,就无需执行右操作数。

像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值

4.5 练习

练习1:闰年的判断

小提示:

闰年判断的规则:

  1. 能被4整除并且不能被100整除是闰年2. 能被400整除是闰年口诀:四年一闰,百年不闰,四百年再闰
//代码1
#include <iostream>
using namespace std;
int main()
{
 	int year = 0;
 	cin >> year;
 	if (year % 4 == 0 && year % 100 != 0)
 		cout << "1" << endl;
 	else if (year % 400 == 0)
 		cout << "1" << endl;
 	else
 		cout << "0" << endl; 
 	return 0;
}

//代码2
#include <iostream>
using namespace std;
int main()
{
 	int year = 0;
 	cin >> year;
 	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
 		cout << "1" << endl;
 	else
 		cout << "0" << endl;
 	return 0;
}
练习2:晶晶赴约会

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
 	int d = 0;
 	cin >> d;
 	if (d == 1 || d == 3 || d == 5)
 		cout << "NO" << endl;
 	else
 		cout << "YES" << endl;
 	return 0;
}

小提示:一定要注意输出信息大小写的要求,写错了,是不能AC的​

练习3:三角形判断

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
 	int a, b, c;
 	cin >> a >> b >> c;
 	if (a + b > c && a + c > b && b + c > a)
 		cout << 1 << endl;
 	else
 		cout << 0 << endl;
 	return 0;
}

小提示:三角形的任意两条边的和大于第三条边。

练习4:判断能否被 3,5,7 整除

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
 	int n = 0;
 	cin >> n;
 	if (n % 3 == 0)
 	{
 		cout << 3 << " ";
 	}
 	if (n % 5 == 0)
 	{
 		cout << 5 << " ";
 	}
	if (n % 7 == 0)
 	{
 		cout << 7 << " " << endl;
 	}
 	if (n % 3 != 0 && n % 5 != 0 && n % 7 != 0)
 		cout << "n" << endl;
 	return 0;
}

小提示:

关于代码的简洁性,前期不要追求简洁,先写出来,必要时暴力求解,然后优化。
优化的方式可以是自己想到的,有时候也可以模仿别人的代码。

练习5:数的性质

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
 	int x = 0;
 	cin >> x;
 	//同时满足的情况
 	if (x % 2 == 0 && (x > 4 && x <= 12))
 		cout << 1;
 	else
 		cout << 0;
 	//至少满足1种情况
 	if (x % 2 == 0 || (x > 4 && x <= 12))
 		cout << " " << 1;
 	else
 		cout << " " << 0;
 	//只满足1种情况
 	if ((x % 2 == 0) + (x > 4 && x <= 12) == 1)
 		cout << " " << 1;
 	else
 	cout << " " << 0;
 	//2种情况都不满足 
 	if ((x % 2 == 0) + (x > 4 && x <= 12) == 0)
 		cout << " " << 1;
 	else
 		cout << " " << 0;
 	return 0;
}

5. switch 语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。

switch 语句是一种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。

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

上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。

注:

switch 后的 expression 必须是整型表达式。
case 后的值,必须是整形常量表达式。

5.1 if语句和switch语句的对比

练习1:输入任意一个整数值,计算除3之后的余数

如果使用 if 语句完成,如下:

#include <stdio.h>
int main()
{
 	int n = 0;
 	cin >> n;
 	if (n % 3 == 0)
 		cout << "余数为0" << endl;
 	else if (n % 3 == 1)
 		cout << "余数是1" << endl;
 	else
 		cout << "余数是2" << endl;
 	return 0;
}

如果使用 switch 语句改写,就可以是这样的:

#include <stdio.h>
int main()
{
 	int n = 0;
 	scanf("%d", &n);
 	switch (n % 3)
 	{
 	case 0:
 		cout << "余数为0" << endl;
 	case 1:
 		cout << "余数是1" << endl; 
	 case 2:
 		cout << "余数是2" << endl; 
 }
 	return 0;
}

上述的代码中,我们要注意的点有: case 和后边的数字之间必须有空格如果运行代码,当我们输入 6 的时候,输出结果:

在这里插入图片描述

这个结果是有问题的,我们期望的输出是: 整除,余数为0 ,但是输出的结果,明显不对,为什么呢?

5.1.1 switch语句中的break

switch 语句分支语句,在 switch 语句中, case 语句决定了分支的入口,而 break 才是决定分支出口的,所以当一条 case 语句执行结束后,如果没有遇到 break 语句就会继续往下执行,而只有遇到 break 才会跳出 switch 语句。

根据上面代码的情况,我们应该在每个 case 语句执行完后,加上 break 语句。

#include <stdio.h>
int main()
{
 	int n = 0;
 	scanf("%d", &n);
 	switch (n % 3)
 	{
 	case 0:
 		cout << "整除,余数为0" << endl;
 		break;
 	case 1:
 		cout << "余数是1" << endl; 
 		break;
 	case 2:
 		cout << "余数是2" << endl; 
 	break;
 }
 return 0;
}

测试一组,看一下结果:

在这里插入图片描述

练习2:

输入一个1~7的数字,打印对应的星期几
例如:
输入:1 输出:Monday
输入:2 输出:Tuesday
输入:3 输出:Wednesday
输入:4 输出:Thursday
输入:5 输出:Friday
输入:6 输出:Saturday
输入:7 输出:Sunday

参考代码如下:

#include <cstdio>
int main()
{
 	int day = 0;
 	cin >> day;
 	switch (day)
 	{
 	case 1:
 		cout << "Monday" << endl;
 		break;
 	case 2:
 		cout << "Tuesday" << endl;
 		break;
 	case 3:
 		cout << "Wednesday" << endl;
 		break;
 	case 4:
 		cout << "Thursday" << endl;
 		break;
 	case 5:
 		cout << "Friday" << endl;
 		break;
 	case 6:
 		cout << "Saturday" << endl;
 		break;
 	case 7:
 		cout << "Sunday" << endl;
 		break;
 }
	return 0;
}

如果需求发生变化,变为:

  1. 输入1~5,输出的是“Workday”;
  2. 输入 6 ∼ 7 6\sim7 67 ,输出“Weekend”
#include <cstdio>
int main()
{
 int day = 0;
 cin >> day;
 switch (day)
 {
 	case 1:
 	case 2:
 	case 3:
 	case 4:
 	case 5:
 		cout << "Workday" << endl;
 		break;
 	case 6:
 	case 7:
 		cout << "Weekend" << endl;
 		break;
 }
 	return 0;
}

上面的练习中,我们发现应该根据实际的情况,来在代码中觉得是否使用break ,或者在哪里使用break ,才能正确完成实际的需求。

5.1.2 switch语句中的default

在使用 switch 语句的时候,我们经常可能遇到一种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入default 子句。

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

switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行default 子句。

就比如前面做的打印星期的练习,如果 day 的输入不是1~7的值,如果我们要提示:input error!,则可以这样完成代码:

#include <cstdio>
int main()
{
 int day = 0;
 cin >> day; 
 switch(day)
 {
 	case 1:
 	case 2:
 	case 3:
 	case 4:
 	case 5:
 		cout << "Workday" << endl;
 		break;
 	case 6:
 	case 7:
 		cout << "Weekend" << endl;
 	break;
 	default:
 		cout << "input error!" << endl;
 		break;
 }
 	return 0;
}

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

在 switch 语句中 case 子句和 default 子句有要求顺序吗? default 只能放在最后吗?其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过我们通常是把 default 子句放在最后处理的。

5.3 练习

练习1:四季

在这里插入图片描述

//版本1
//输⼊的⽅式使⽤C语⾔的scanf的⽅式
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
 	int year = 0, month = 0;
 	scanf("%4d%2d", &year, &month);
 	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;
}

```cpp
//版本2
//输⼊的⽅式使⽤C++中的cin
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
 	int n = 0, month = 0;
 	cin >> n; //⼀次性读取到的事6位整数
 	month = n % 100; //获取最低2位,就是⽉份
 	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;
}

小提示:

该类型题目可以用 switch 来解决,但是使用 if 也是可以解决的,而且可能更加方便,对于针对一个数据范围内的条件判断,推荐使用 if

练习2:简单计算器

在这里插入图片描述

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

总结

本章对C/C++中的条件判断进行了全面而深入的讲解。从基础的if-else语句,到复杂的关系和逻辑操作符,再到灵活的switch语句和多种循环结构,我们不仅学习了它们的语法和使用方法,还通过大量实例展示了如何在实际编程中灵活运用这些工具


;