当前位置: 首页 > news >正文

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 练习

  1. 闰年判断

由题目,我们只需保证四年一闰,百年不闰,四百年再闰就行,即年数对 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. 晶晶赴约会

只需要保证晶晶在 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;
}

演示效果:

在这里插入图片描述

在这里插入图片描述

  1. 三角形判断

判断三角形的一个特性就是:两边之和大于第三边。其中题目规定的取值范围未超过 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;	    } 
  1. 判断能否被 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. 输入1~5,输出的是“Workday”
  2. 输入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 练习

  1. 四季

这道题有一个难点就是:

在这里插入图片描述

想要保留后面两位数,我们可以一下都想到的方法就是取模,即 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;
}      
  1. 简单计算器

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

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 练习

  1. 反向输出一个四位数

想要得到 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;} 

演示结果:

在这里插入图片描述

  1. 数位之和

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

参考代码:

#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 ,所以保险起见

参考代码:

#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 语句,为后面的循环嵌套做好准备。

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

在这里插入图片描述

请添加图片描述

http://www.dtcms.com/a/614702.html

相关文章:

  • 浏阳建设局网站广告电商怎么做
  • 微信朋友圈做网站推广赚钱吗网站建设费专票会计分录
  • 友元的作用与边界
  • 如何提高英语口语?
  • (6)框架搭建:Qt实战项目之主窗体快捷工具条
  • 做阿里云网站空间建设工程施工合同实例
  • web中间件——Tomcat
  • Linux中管理员和一般用户的用法小结
  • html手机网站模板html5网页设计教程
  • 【Mac】开发环境使用/维护
  • 网站代码设计惠州网站建设排名
  • 精美网站建设wordpress gae
  • 【STM32MP157 异核通信框架学习篇】(10)Linux下Remoteproc相关API (下)
  • 企业建站服务退役军人215专业品牌网站建设
  • 杭州模板网站建站做国外夏令营的网站
  • 基于SpringBoot的房屋租赁管理系统【协同过滤推荐算法+可视化统计+合同签署】
  • 【MySQL | 基础】函数
  • Java Set
  • (60页PPT)数据治理与数据安全防护方案(附下载方式)
  • DSAC-T算法实现控制倒立摆
  • 学校网站建设需要多少钱wordpress添加首页导航
  • 开发区网站制作公司wordpress+系统安装
  • 什么是性能测试?它的分类?(负载测试、压力测试、并发测试等)
  • 4.3 Go 协程:goroutine
  • 查询缓存8.0
  • 【PostgreSQL】查询所有表和视图
  • 页面布局练习
  • Cortex-M3 02-地址映射
  • 大丰做网站哪家公司好大理州城乡建设局官方网站
  • 推荐做素菜的网站电商网站开发环境怎么写