C++条件判断与循环(二)(算法竞赛)

🌊用有趣的言语来阐述苦涩难懂的代码世界,让每一个技术都充满风趣!
🔭个人主页:散峰而望
🚀学习方向: C/C++等方向
📌专栏系列:
- 📖《C语言:从基础到进阶》
- 📚《编程工具的下载和使用》
- 🚀《C语言刷题》
- ⚖️《算法竞赛从入门到获奖》
💬人生格言:冀以尘雾之微,补益山海,荧烛末光,增辉岁月。
🎬博主简介



文章目录
- 前言
- 4. 逻辑操作符
- 4.1 逻辑取反运算符
- 4.2 逻辑与运算符
- 4.3 逻辑或运算符
- 4.4 短路
- 4.5 练习
- 5. switch 语句
- 5.1 if 语句和 switch 语句的对比
- 5.1.1 switch 语句中的 break
- 5.1.2 switch 语句中的 default
- 5.2 switch语句中的case和default的顺序问题
- 5.3 练习
- 6. while 循环
- 6.1 while 形式
- 6.2 执行流程
- 6.3 实践
- 6.4 练习
- 结语
前言
前面一篇已经对 if-else 语句、关系操作符、条件操作符详细的介绍了,不知各位能否熟练的掌握。接下来将对逻辑操作符、switch 语句、while 语句一一介绍,帮你打通条件判断与循环的任督二脉。
4. 逻辑操作符
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
| 符号 | 名称 | 功能 |
|---|---|---|
| ! | 逻辑取反运算符 | 改变单个表达式的真假状态。如果表达式为真,则结果为假;如果表达式为假,则结果为真 |
| && | 逻辑与运算符 | 两侧的表达式都需要为真时,结果才为真。如果任何一个表达式为假,结果就为假 |
|| 逻辑或运算符 两侧的表达式中,只要有一个为真,结果就为真。只有当两个表达式都为假时,结果才为假
(由于文本编辑器问题,|| 占时只能那样写,还请见谅)
C/C++中,非0表示真,0表示假
4.1 逻辑取反运算符

! 是逻辑取反运算符,可以把假变为真,把真变为假。
比如,我们有一个变量叫 flag,如果 flag 为假的时候,就做某些事情,可以这样写代码:
#include <iostream>
using namespace std;
int main()
{int flag = 0;//可以改为1试试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 ,当左操作数 month >= 3 的结果是0的时候,即使不判断 month <= 5,整个表达式的结果也是 0(不是季)。
所以,对于 && 操作符来说,左边操作数的结果是 0 的时候,右边操作数就不再执行。对于 || 操作符是怎么样呢?我们结合前面的代码:
if(month == 12 || month == 1 || month == 2)
如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以,|| 操作符的左操作数的结果不为0时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
4.5 练习
- 闰年判断
由题目,我们只需保证四年一闰,百年不闰,四百年再闰就行,即年数对 4 和 400 取模为 0。对 100 取模不为 0。
代码如下:
//代码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;elsecout << "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;elsecout << "0" << endl;return 0;
}
- 晶晶赴约会
只需要保证晶晶在 1、3、5 这三天不能接受邀请就行。
代码如下:
#include <iostream>
using namespace std;
int main()
{int d = 0;cin >> d;if (d == 1 || d == 3 || d == 5)cout << "NO" << endl;elsecout << "YES" << endl;return 0;
}
演示效果:


- 三角形判断
判断三角形的一个特性就是:两边之和大于第三边。其中题目规定的取值范围未超过 int 型,故可以使用 int 型。
代码如下:
#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; }
- 判断能否被 3,5,7 整除
该题目可以先自己试一试,后面会讲。
5. switch 语句
除了 if-else 语句外,C语言还提供了 switch 语句来实现分支结构。
switch 语句是一种特殊形式的 if-else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
语法形式如下:
switch (expression)
{case value1: statementcase value2: statementdefault: statement
}
上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。
注意:
- switch 后的 expression 必须是整型表达式,字符型也行
- case 后的值,必须是整形常量表达式
5.1 if 语句和 switch 语句的对比
例如:输入任意一个整数值,计算除3之后的余数
if-else 语句:
#include <iostream>
using namespace std;int main()
{int n = 0;cin >> n;if (n % 3 == 0)cout << "余数为0" << endl;else if (n % 3 == 1)cout << "余数是1" << endl;elsecout << "余数是2" << endl;return 0;
}
switch语句:
#include <iostream>
using namespace std;
int main()
{int n = 0;cin >> n;switch (n % 3){case 0:cout << "余数为0" << endl;case 1:cout << "余数是1" << endl; case 2:cout << "余数是2" << endl; }return 0;
}
//这里代码,只是展示两种不同写法
//有一部分未写完,具体下面会详细的讲
可以看到在某一方面 switch 语句可能比 if-else 语句表达简便些,但有时候可能恰恰相反,在之后的学习我们可以慢慢体会。
5.1.1 switch 语句中的 break
switch语句分支语句,在switch语句中,case语句决定了分支的入口,而break才是决定分支出口的,所以当一条case语句执行结束后,如果没有遇到break语句就会继续往下执行,而只有遇到break才会跳出switch语句。
就像上面的代码:
#include <iostream>
using namespace std;
int main()
{int n = 0;cin >> n;switch (n % 3){case 0:cout << "余数为0" << endl;case 1:cout << "余数是1" << endl; case 2:cout << "余数是2" << endl; }return 0;
}
如果输入 2,演示结果:

发现没有什么问题,那么试一试输入 1 或 3 会什么样呢?演示结果如下:


我们会发现,不应该只打印一种情况,怎么会打印这么多。原因是没有跳出 switch 语句,根据上面代码的情况,我们应该在每个case语句执行完后,加上 break 语句。
代码如下:
#include <iostream>
using namespace std;
int main()
{int n = 0;cin >> n;switch (n % 3){case 0:cout << "余数为0" << endl;break; case 1:cout << "余数是1" << endl;break; case 2:cout << "余数是2" << endl; break;}return 0;
}
演示结果:


发现输入正常了,并没有出现像最开始的那样什么都打印。
练习:
输入一个1~7的数字,打印对应的星期几
例如:
输入:1 输出:Monday
输入:2 输出:Tuesday
输入:3 输出:Wednesday
输入:4 输出:Thursday
输入:5 输出:Friday
输入:6 输出:Saturday
输入:7 输出:Sunday
参考代码如下:
#include<iostream>
using namespace std;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;
}
那是不是每一个 case 语句后面都要跟 break 呢?并不一定,如果给题目改一下的话
- 输入1~5,输出的是“Workday”
- 输入6~7,输出“Weekend”
参考代码如下:
#include<iostream>
using namespace std;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: statementcase value2: statementdefault: statement
}
switch 后边的 expression 的结果不是 value1,也不是value2的时候,就会执 default 子句。
就比如前面做的打印星期的练习,如果 day 的输入不是1~7的值,如果我们要提示:input error!,表示输出错误。则可以这样完成代码:
#include<iostream>
using namespace std;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 练习
- 四季
这道题有一个难点就是:

想要保留后面两位数,我们可以一下都想到的方法就是取模,即 YYYYMM % 100 。代码如下:
#include <iostream>
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;
}
那是否还有其他方法呢?那就是限定行数。
我们可以限定应该 %d 的指定宽度,代码如下:
#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;
}
- 简单计算器
这道题可以先自己试试,后面会一快讲。
6. while 循环
C++ 中由三种循环 ,while 就是其中一种,接下来就介绍一下 while 语句。
6.1 while 形式
while语句的语法结构和if语句非常相似,但不同的是while是用来实现循环的,if是无法实现循环的。
下面是while循环的语法形式:
//形式1
while(表达式) if(表达式)语句; 语句;//形式2
while(表达式) if(表达式)
{ {语句 1; 语句 1;语句 2; 语句 2;... ...
} }
6.2 执行流程

首先上来就是执行判断表达式,表达式的值为 0,循环直接结束;表达式的值不为 0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
6.3 实践
**题目:**使用while循环在屏幕上打印1~10的值
参考代码:
#include <iostream>
using namespace std;int main()
{int i = 1;while (i <= 10){cout << i << " ";i++;}return 0;
}
演示效果:

6.4 练习
- 反向输出一个四位数
想要得到 n 的最低位,可以使用 n % 10 的运算,得到的余数就是最低位。想要去掉 n 的最低位,找出倒数第二位,则使用 n = n / 10 操作。剩下的循环一直到为 0 跳出循环。
参考代码:
#include<iostream>
using namespace std;int main()
{int n = 0;cin >> n;while(n){cout << n % 10;n /= 10;}return 0;}
演示结果:

- 数位之和
该题目与上面的题目是相似的,只不过是加起来了。
参考代码:
#include<iostream>
using namespace std;int main()
{int n = 0;int sum = 0;cin >> n;while(n){sum += n % 10;n /= 10;}cout << sum << endl;return 0;}
- 小乐乐求和
非常简单的一道题,只需要将规定范围的数相加就行,但是要注意取值范围,题目限定 1~10^9 ,所以保险起见
参考代码:
#include<iostream>
using namespace std;int main()
{int n = 0;cin >> n;int i = 1;long long sum = 0; while(i <= n){sum += i;i++;}cout << sum << endl;return 0;
}
-
含 k 个 3 的数
-
角谷猜想
这两道题先试一试手,后面会详细的讲解。
结语
希望这篇文章能够更好的帮助勇闯算法的各位,更好的了解逻辑操作符、switch 语句、while 语句,为后面的循环嵌套做好准备。
同时愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。


