文章目录
- 前言
- 一、逻辑运算符
- 1.导入
- 2.逻辑与(&&)
- 3.逻辑或(||)
- 4.逻辑非(!)
- 二、例题讲解
- 问题:1656. 是两位的偶数吗
- 问题:1658. 游乐设施
- 问题:1659. 是否含有数字5
- 问题:1660. 今天要上课吗
- 问题:1661. 宇航员选拔
- 三、总结
- 四、感谢
前言
本章节在之前学习的单分支与双分支结构基础上,深入探讨了多条件判断在程序设计中的应用。
通过引入逻辑运算符——逻辑与(&&)、逻辑或(||)以及逻辑非(!),我们学会了如何将多个条件组合,以解决实际问题中更为复杂的逻辑判断需求。
借助具体场景实例,如学生选拔和数值特性判断,理解了逻辑运算符的运作机制及其在分支结构中的重要性。
学习路线:C++从入门到NOI学习路线
学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲
一、逻辑运算符
1.导入
在上一节中,我们学习了一种新的数据类型——bool。
布尔类型(bool)在编程中扮演着逻辑判断的基石角色。它仅具有两种状态:“真”(True)和“假”(False),对应生活中的二选一情境,如“对错”、“有无”、“开闭”、“是否”。
利用bool变量,我们可以简洁明了地表示复杂问题中的关键逻辑状态。
在学习新知识后我们常常拿之与以前学习的内容进行对比。
例如我们前面学习的整型和浮点型的变量可以通过算术运算符进行比较、计算。
bool类型是否也存在同样的能力呢?
哎,先不着急回答。
我们来设想一个场景。
假设你们学校打算建立一支编程校队,并邀请学生报名参加选拔。报名人数非常多,学校不得不增加要求筛选出更加优秀的学生。
学校的要求如下:
- 编程基础:学生已经有一定的编程基础,或者能通过学校组织的思维逻辑测试。
- 学习成绩:学生的学科成绩至少达到全校前50%。
- 时间安排:确保每周能投入至少10小时用于编程练习和团队活动。
以上要求,学生至少满足两个,才会被选入校队。这个时候应该怎么判断一个学生是否能够加入到校队呢?
同时满足1,2;或者同时满足1,3;或者同时满足2,3。
可以看到这个时候单独的某个条件不能决定结果,我们需要将多个条件组合在一起判断。
还记得,刚才的问题吗?我想答案大家已经知道了。
答案是肯定,而bool类型的运算需要用到逻辑运算符。
2.逻辑与(&&)
逻辑与(&&): 当两边的操作数都为true时,结果才为true;否则为false。
bool a = true;
bool b = false;
bool result = a && b; // result为false,因为b为false
此运算符具有短路特性,即如果左边的操作数为false,右边的操作数不会被评估。
3.逻辑或(||)
逻辑或(||): 如果两边的操作数中至少有一个为true,结果为true;只有当两边都为false时,结果才为false。
bool a = true;
bool b = false;
bool result = a || b; // result为true,因为a为true
同样具有短路特性,如果从左到右评估操作数时,一旦遇到一个true值,运算就会立即停止,不再继续评估后续的操作数。。
4.逻辑非(!)
逻辑非(!): 这是一个一元运算符,用来反转操作数的布尔值。如果操作数为true,结果为false;如果操作数为false,结果为true。
bool a = true;
bool result = !a; // result为false,因为a为true
二、例题讲解
问题:1656. 是两位的偶数吗
类型:分支结构
题目描述:
输入一个整数 n ,请帮忙判断一下这个整数 n 是否是两位的偶数,如果是输出 Yes ,如果不是,请输出 No 。(请注意大小写)。
比如:28 就是一个两位偶数,而 128 就不是两位偶数。
输入:
一个整数 n 。
输出:
如果n是两位偶数输出 Yes ,否则输出 No 。
样例:
输入:
28
输出:
Yes
1.分析问题
- 已知:一个整数 n 。
- 未知:n是否是两位的偶数。
- 关系:10<=n<100&&n%2==0
2.定义变量
- 定义一个整型变量 n 来存储待判断的整数。
//二、数据定义 int n;
3.输入数据
- 使用 cin 从标准输入(通常是键盘)读取一个整数到变量 n 中。
//三、数据输入cin>>n;
4.数据计算
- 使用 if 语句进行条件判断,条件是:
- n 大于等于10(确保是两位数)
- n 小于100(确保是两位数)
- n 对2取余等于0(确保是偶数)
- 如果上述条件都满足,输出 “Yes”;否则,输出 “No”。
//四、数据计算 if(n>=10&&n<100&&n%2==0){//五、输出结果 cout<<"Yes";}else{//五、输出结果 cout<<"No";}
完整代码如下:
#include <bits/stdc++.h> // 包含常用头文件,提供标准输入输出等功能
using namespace std; // 使用std命名空间,简化代码中的标准库调用int main() {// 一、问题分析// 给定:一个整数n。// 目标:判断该整数是否满足两个条件:// 1. 是两位数(即10到99之间的整数)// 2. 是偶数(能被2整除)// 二、数据定义int n; // 定义一个整数变量n来存储待判断的数// 三、数据输入cin >> n; // 从标准输入读取一个整数到变量n中// 四、逻辑判断与计算// 使用if语句检查n是否满足两位数且为偶数的条件if (n >= 10 && n < 100 && n % 2 == 0) { // 判断n是否在10到99之间且能被2整除cout << "Yes"; // 如果满足条件,输出"Yes"} else {cout << "No"; // 如果不满足条件,输出"No"}// 五、程序结束return 0; // 程序执行完毕,返回0表示成功结束
}
问题:1658. 游乐设施
类型:分支结构
题目描述:
游乐场引进了一个新的游乐设施,可以两人一组开动该设施,但设施设计上有一个缺陷,必须一个人的体重在 60 公斤以上(包含 60 公斤),另一个人体重在 60 公斤以下,才能启动该设施。
请你编程从键盘读入两个游客的体重,判断一下设施能否启动,如果能启动输出 green,不能启动输出 red 。
比如输入:65.2 28.5,就可以启动设施,输出 green 。
再比如输入:28.5 56.7,就不能启动设施,输出 red 。
输入:
两个小数,代表两位游客的体重。
输出:
如果能启动输出 green ,不能启动输出 red 。
样例:
输入:
65.2 28.5
输出:
green
1.分析问题
- 已知:两个游客的体重。
- 未知:判断一下设施能否启动,如果能启动输出 green,不能启动输出 red 。
- 关系:必须一个人的体重在 60 公斤以上(包含 60 公斤),另一个人体重在 60 公斤以下,才能启动该设施。
2.定义变量
- double a, b;定义了两个变量a和b,用来存储两个游客的体重。
//二、数据定义 double a,b;
3.输入数据
- 从标准输入(通常是键盘)读取两个游客的体重。
//三、数据输入 cin>>a>>b;
4.数据计算
- if (a < b) { swap(a, b); }这行代码确保a始终代表较重的游客体重,b代表较轻的游客体重,简化后续的条件判断。
- 接下来的if语句检查体重条件是否满足设施启动的要求:a(较重者)是否大于等于60公斤且b(较轻者)是否小于60公斤。
//四、数据计算 if(a<b){swap(a,b);}if(a>=60&&b<60){//五、输出结果cout<<"green";}else{//五、输出结果cout<<"red";}
完整代码如下:
#include <bits/stdc++.h> // 包含标准库中的所有常用头文件
using namespace std; // 使用std命名空间,可以直接调用其中的函数、对象等,无需加std::前缀int main() {// 一、问题分析// 已知:需要判断两个游客的体重条件。// 目标:确定游乐设施是否能够启动。// 规则:设施启动条件为,两位游客中一人体重≥60kg且另一人<60kg。// 二、数据定义double a, b; // 定义两个双精度浮点数变量a和b,分别存储两位游客的体重// 三、数据输入cin >> a >> b; // 从标准输入读取两个体重值到a和b中// 四、数据处理// 交换a和b的值(如有必要),确保a为两人中的较重者,简化后续判断逻辑if (a < b) {swap(a, b); // 使用swap函数交换a和b的值}// 五、逻辑判断// 检查体重条件是否满足设施启动要求if (a >= 60 && b < 60) { // 若较重者≥60kg且较轻者<60kg// 六、输出结果cout << "green"; // 输出"green",表示设施可以启动} else {// 六、输出结果cout << "red"; // 输出"red",表示设施不能启动}// 七、程序结束return 0; // 主函数返回0,表示程序正常退出
}
问题:1659. 是否含有数字5
类型:分支结构
题目描述:
请从键盘读入一个五位整数 n,判断其是否含有数字 5,如果含有数字 5 ,请输出这个 5 位数各个位的和;如果不含数字 5 ,请直接输出这个 5 位数。
比如:输入:12345,就是含有数字5 ,因此输出 15(1+2+3+4+5=15)。
再比如:输入:12188 ,就不含数字 5,那么直接输出12188 。
输入:
一个五位正整数 n 。
输出:
输出一个整数,代表按要求计算的结果。
样例:
输入:
12345
输出:
15
1.分析问题
- 已知:一个五位正整数 n 。
- 未知:输出一个整数,代表按要求计算的结果。
- 关系:如果含有数字 5 ,请输出这个 5 位数各个位的和;如果不含数字 5 ,请直接输出这个 5 位数。
2.定义变量
- 定义了六个整数变量,其中n用于存储输入的五位数,而g, s, b, q, w分别对应该数的个位、十位、百位、千位和万位。
//二、数据定义 int n,g,s,b,q,w;
3.输入数据
- 从标准输入(如键盘)读取一个五位正整数并存储在变量n中。
//三、数据输入cin>>n;
4.数据计算
- 通过除法和取余运算,分离出n的每一位数字并分别存储。
- 检查五位数的每一位是否包含数字5。如果有任何一位是5,则将n更新为其各位数字之和。
//四、数据计算 g=n%10;s=n/10%10;b=n/100%10;q=n/1000%10;w=n/10000;if(g==5||s==5||b==5||q==5||w==5){n=g+s+b+q+w;}
5.输出结果
- 这里输出的n可能是原始的五位数(如果没有5),也可能是它的各位数字之和(如果包含至少一个5)。
//五、输出结果 cout<<n;return 0;
完整代码如下:
#include <bits/stdc++.h> // 包含大量常用的头文件,适用于快速编程但可能增加编译时间
using namespace std; // 使用标准命名空间std,简化对标准库函数和对象的访问int main() {// 一、问题分析// 已知:输入是一个五位正整数 n。// 目标:根据 n 中是否包含数字 5,输出不同的结果。// 规则:// - 如果 n 包含数字 5,则输出 n 各位数字之和。// - 如果 n 不包含数字 5,则直接输出 n。// 二、数据定义int n, g, s, b, q, w; // 分别代表五位数的各位(个位g, 十位s, 百位b, 千位q, 万位w)// 三、数据输入cin >> n; // 从标准输入读取一个五位正整数到变量n中// 四、数据处理// 提取各位数字g = n % 10; // 个位s = n / 10 % 10; // 十位b = n / 100 % 10; // 百位q = n / 1000 % 10; // 千位w = n / 10000; // 万位// 检查是否包含数字5if (g == 5 || s == 5 || b == 5 || q == 5 || w == 5) {// 如果n中包含数字5,则计算并更新n为各位数字之和n = g + s + b + q + w;}// 注意:如果n不含5,此处逻辑默认直接使用原n值,无需额外处理// 五、输出结果cout << n; // 输出处理后的n值,根据规则可能是原数或各位数字之和return 0; // 表示程序成功执行完毕
}
问题:1660. 今天要上课吗
类型:分支结构
题目描述:
暑假来了,晶晶报了自己心仪已久的游泳课,非常开心,老师告诉晶晶每周周一、周三、周五、周六四天都要上课的,晶晶担心自己会忘记,请你编写一个程序,从键盘读入今天星期几,输出是否要上课,如果要上课,请输出 youke ,如果不要上课,请输出 meike 。
输入:
从键盘读入一个整数 n(n 是 1∼7 之间的整数),代表今天是星期几。
输出:
根据要求输出 youke 或者 meike 。
样例:
输入:
1
输出:
youke
1.分析问题
- 已知:一个整数 n(n 是 1~7 之间的整数),代表今天是星期几。
- 未知:是否要上课。
- 关系:每周周一、周三、周五、周六四天都要上课的。
2.定义变量
- 定义一个整型变量n来存储输入的表示星期几的数字。
//二、数据定义 int n;
3.输入数据
- 从标准输入接收一个整数,用户应输入1到7之间的值,代表星期一到星期日。
//三、数据输入 cin>>n;
4.数据计算
- 如果n是1(周一)、3(周三)、5(周五)、或6(周六),则输出"youke",表示那天有课;否则,输出"meike",表示没有课。
//四、数据计算 if(n==1||n==3||n==5||n==6){//五、输出结果 cout<<"youke";}else{//五、输出结果 cout<<"meike";}
完整代码如下:
#include <bits/stdc++.h> // 包含C++标准库中的常用功能,方便快捷但可能增加编译时间
using namespace std; // 使用std命名空间,可以直接调用std中的函数和对象,无需前缀int main() {// 一、问题阐述// 给定:一个整数n,范围是1到7,分别代表星期一到星期日。// 目标:判断该天是否需要上课。// 规则:星期一(1)、星期三(3)、星期五(5)、星期六(6)需要上课。// 二、数据定义int n; // 定义一个整型变量n,存储输入的表示星期的数字// 三、数据输入cin >> n; // 从控制台读取用户输入的星期数,用户应输入1至7之间的整数// 四、逻辑判断// 使用if语句检查n的值,以判断当天是否为上课日if (n == 1 || n == 3 || n == 5 || n == 6) { // 如果n为1、3、5、或6,则表示当天有课// 五、输出结果cout << "youke"; // 输出"youke",表示需要上课} else {// 五、输出结果cout << "meike"; // 输出"meike",表示无需上课}// 六、程序结束return 0; // 主函数返回0,表示程序执行成功结束
}
问题:1661. 宇航员选拔
类型:分支结构
题目描述:
宇航局来到某部队,想从该部队挑选身体好的战士进行航空航天的培训和考核,挑选未来的宇航员。宇航局在身体素质方面定了 33 个基本的标准:身高在 165 厘米∼185 厘米之间,体重在 50 公斤∼80公斤之间,年龄在16∼19周岁(所有数据都包含边界值,也就是身高包含165 厘米和 185 厘米,体重和年龄以此类推)。
现从键盘读入一位战士的年龄、身高、体重数据(都是整数),请问该战士是否符合宇航局定的基本标准,如果符合,请输出 Y ,如果不符合,请输出 N 。
输入:
读入三个整数,分别代表一位战士的年龄、体重、身高数据。
输出:
根据判断结果输出 Y 或者 N 。
样例:
输入:
16 60 185
输出:
Y
1.分析问题
-
已知:一位战士的年龄、身高、体重数据(都是整数)。
-
未知:该战士是否符合宇航局定的基本标准。 如果符合,请输出 Y ,如果不符合,请输出 N 。
-
关系:身高在 165 厘米~185 厘米之间,体重在 50 公斤~80公斤之间,年龄在16~19周岁(所有数据都包含边界值,也就是身高包含165 厘米和 185 厘米,体重和年龄以此类推)。
2.定义变量
- 定义了三个整型变量:h(身高,厘米)、w(体重,公斤)、a(年龄,岁)。
//二、数据定义 int a,w,h;
3.输入数据
- 通过cin从标准输入读取三个整数分别赋值给变量a、w、h,即战士的年龄、体重、身高。
//三、数据输入 cin>>a>>w>>h;
4.数据计算
- 使用if语句进行逻辑判断,检查战士的身高是否在165厘米到185厘米之间、体重是否在50公斤到80公斤之间、年龄是否在16岁到19岁之间。
- 如果所有条件满足(即战士符合宇航局的标准),则输出字符Y;否则,输出N。
//四、数据计算 if(h>=165&&h<=185&&w>=50&&w<=80&&a>=16&&a<=19){//五、输出结果 cout<<"Y";}else{//五、输出结果 cout<<"N";}
完整代码如下:
#include <bits/stdc++.h> // 包含了C++标准库的大部分头文件,适合快速编程但可能导致编译时间较长
using namespace std; // 声明使用std命名空间,简化代码中标准库的使用int main() {// 一、问题分析// 已知:战士的年龄(a)、身高(h, 单位:厘米)、体重(w, 单位:公斤)皆为整数。// 目标:判断这些数据是否符合宇航局的基本标准。// 标准:身高165cm~185cm,体重50kg~80kg,年龄16岁~19岁(包含边界值)。// 二、数据定义int h, w, a; // 分别定义整型变量h(身高, cm), w(体重, kg), a(年龄, 岁)// 三、数据输入cin >> a >> w >> h; // 从控制台依次输入年龄、体重、身高的值// 四、逻辑判断// 判断输入的年龄、身高、体重是否全部满足宇航局的标准if (h >= 165 && h <= 185 && w >= 50 && w <= 80 && a >= 16 && a <= 19) {// 五、输出结果cout << "Y"; // 如果满足所有条件,输出 "Y" 表示合格} else {// 五、输出结果cout << "N"; // 如果有任何一项不满足条件,输出 "N" 表示不合格}return 0; // 程序结束,返回0表示程序执行成功
}
三、总结
通过本节内容的学习,我们掌握了逻辑运算符的使用方法及其在处理复合条件分支结构中的应用,能够编写出解决多条件筛选问题的C++程序。实例练习如判断两位偶数、分析上课日、宇航员选拔等,不仅巩固了分支结构的编程技巧,还提升了逻辑思维能力。这为应对NOI及其他编程竞赛中涉及的复杂条件判断问题打下了坚实的基础。
四、感谢
如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。
每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!