首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++条件判断与循环(二)(算法竞赛)

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

作者头像
散峰而望
发布2025-12-23 12:58:56
发布2025-12-23 12:58:56
1550
举报

前言

前面一篇已经对 if-else 语句、关系操作符、条件操作符详细的介绍了,不知各位能否熟练的掌握。接下来将对逻辑操作符、switch 语句、while 语句一一介绍,帮你打通条件判断与循环任督二脉

4. 逻辑操作符

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

符号

名称

功能

逻辑取反运算符

改变单个表达式的真假状态。如果表达式为真,则结果为假;如果表达式为假,则结果为真

&&

逻辑与运算符

两侧的表达式都需要为真时,结果才为真。如果任何一个表达式为假,结果就为假

|| 逻辑或运算符 两侧的表达式中,只要有一个为真,结果就为真。只有当两个表达式都为假时,结果才为假

(由于文本编辑器问题,|| 占时只能那样写,还请见谅)

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

4.1 逻辑取反运算符

! 是逻辑取反运算符,可以把假变为真,把真变为假。

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

代码语言:javascript
复制
#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月是春天该怎么表达呢?

代码语言:javascript
复制
int month = 0;
cin >> month;
if (month >= 3 && month <= 5)
{
    cout << "春季" << endl;
}

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

4.3 逻辑或运算符

在这里插入图片描述
在这里插入图片描述

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

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

代码语言:javascript
复制
int month = 0;
cin >> month;
if (month == 12 || month == 1 || month == 2)
{
    cout << "冬季" << endl;
}

4.4 短路

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

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

如前面的代码:

代码语言:javascript
复制
if(month >= 3 && month <= 5)

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

所以,对于 && 操作符来说,左边操作数的结果是 0 的时候,右边操作数就不再执行。对于 || 操作符是怎么样呢?我们结合前面的代码:

代码语言:javascript
复制
if(month == 12 || month == 1 || month == 2)

如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。

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

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

4.5 练习

  1. 闰年判断

由题目,我们只需保证四年一闰,百年不闰,四百年再闰就行,即年数对 4 和 400 取模为 0。对 100 取模不为 0。

代码如下:

代码语言:javascript
复制
//代码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;
}
  1. 晶晶赴约会

只需要保证晶晶在 1、3、5 这三天不能接受邀请就行。

代码如下:

代码语言:javascript
复制
#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;
}

演示效果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  1. 三角形判断

判断三角形的一个特性就是:两边之和大于第三边。其中题目规定的取值范围未超过 int 型,故可以使用 int 型。

代码如下:

代码语言:javascript
复制
#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;	    
 } 
  1. 判断能否被 3,5,7 整除

该题目可以先自己试一试,后面会讲。

5. switch 语句

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

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

语法形式如下:

代码语言:javascript
复制
switch (expression) 
{
  case value1: statement
  case value2: statement
  default: statement
}

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

注意:

  • switch 后的 expression 必须是整型表达式,字符型也行
  • case 后的值,必须是整形常量表达式

5.1 if 语句和 switch 语句的对比

例如:输入任意一个整数值,计算除3之后的余数

if-else 语句

代码语言:javascript
复制
#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;
    else
        cout << "余数是2" << endl;
    return 0;
}

switch语句

代码语言:javascript
复制
#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语句。

就像上面的代码:

代码语言:javascript
复制
#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 语句。

代码如下:

代码语言:javascript
复制
#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

参考代码如下:

代码语言:javascript
复制
#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. 输入1~5,输出的是“Workday”
  2. 输入6~7,输出“Weekend”

参考代码如下:

代码语言:javascript
复制
#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 子句。

语法形式如下:

代码语言:javascript
复制
switch (expression) 
{
  case value1: statement
  case value2: statement
  default: statement
}

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

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

代码语言:javascript
复制
#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 练习

  1. 四季

这道题有一个难点就是:

在这里插入图片描述
在这里插入图片描述

想要保留后面两位数,我们可以一下都想到的方法就是取模,即 YYYYMM % 100 。代码如下:

代码语言:javascript
复制
#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 的指定宽度,代码如下:

代码语言:javascript
复制
#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;
}      
  1. 简单计算器

这道题可以先自己试试,后面会一快讲。

6. while 循环

C++ 中由三种循环 ,while 就是其中一种,接下来就介绍一下 while 语句。

6.1 while 形式

while语句的语法结构和if语句非常相似,但不同的是while是用来实现循环的,if是无法实现循环的。

下面是while循环的语法形式:

代码语言:javascript
复制
//形式1
while(表达式)            if(表达式)
     语句;                 语句;
   
//形式2
while(表达式)           if(表达式)
{                        {
     语句 1;               语句 1;
     语句 2;               语句 2;
     ...                  ...
}                        }

6.2 执行流程

在这里插入图片描述
在这里插入图片描述

首先上来就是执行判断表达式,表达式的值为 0,循环直接结束;表达式的值不为 0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。

6.3 实践

**题目:**使用while循环在屏幕上打印1~10的值

参考代码:

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
    int i = 1;
    while (i <= 10)
    {
        cout << i << " ";
        i++;
    }
    return 0;
}

演示效果:

在这里插入图片描述
在这里插入图片描述

6.4 练习

  1. 反向输出一个四位数

想要得到 n 的最低位,可以使用 n % 10 的运算,得到的余数就是最低位。想要去掉 n 的最低位,找出倒数第二位,则使用 n = n / 10 操作。剩下的循环一直到为 0 跳出循环。

参考代码:

代码语言:javascript
复制
#include<iostream>
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	while(n)
	{
		cout << n % 10;
		n /= 10;
	}
	return 0;
 } 

演示结果:

在这里插入图片描述
在这里插入图片描述
  1. 数位之和

该题目与上面的题目是相似的,只不过是加起来了。

参考代码:

代码语言:javascript
复制
#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. 小乐乐求和

非常简单的一道题,只需要将规定范围的数相加就行,但是要注意取值范围,题目限定 1~10^9 ,所以保险起见

参考代码:

代码语言:javascript
复制
#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;
}
  1. 含 k 个 3 的数
  2. 角谷猜想

这两道题先试一试手,后面会详细的讲解。

结语

希望这篇文章能够更好的帮助勇闯算法的各位,更好的了解逻辑操作符、switch 语句、while 语句,为后面的循环嵌套做好准备。

同时愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 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 练习
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档