本文所有代码均在Vscode中编译通过
本节目录
1° 是与非
2° 复杂的条件分支
鸽了将近一个月后的教程4终于写完了,真不容易,本篇内容较短,我绝不会告诉你是因为我偷工减料了
是与非
还记得bool型时学的是与否吗?我们简单的了解了是和非的逻辑关系,我们现在来深入探讨一下。
bool型有两种值,即ture和false,同时,我们还知道!代表了取反,也就是说,!ture=false,!false=ture。但是!和数学中的相反数不一样,相反数是正负相反,但是!并不能做到正负相反,他只能做到是和非的相反。
现在我们回忆一下这些,先做几道题目:
-1 > 1 2 < 3 4 > -3 6 = 5
嗯。。有点弱智,答案分别是false,ture,ture,false,用int型表示出来就是:0,1,1,0。
再次强调一遍,0为false,1为ture。。
之前讲过,在main函数最后要写上return 0;告诉计算机程序结束正常。可能有人有问题,为什么要return false?其实他并不表示返回错误,就把他当做c++中不成文的规定记住就好了。唔。。乌龟的屁股,规定。
那么,我们想判断两个语句是否同时成立的时候怎么办呢?这时候,就需要用''&&"来把这两个表达式"捆绑"起来,把他们绑起来了,才能让他们同时满足。
比如这样:1>0&&2>1,把1>0和2>1这两个式子绑起来了,只有他们两个人同时点头同意,结果才是ture,只要有一个人摇了头,结果就是false。比如一对情侣黏在一起,出去吃饭,看到韩式料理,男生同意了,女生不同意,那么他们就不会去吃这个,看到了烤肉,两个人都同意了,这时返回值才是ture,于是他们一起快快乐乐的吃烤肉了。(这场景。。)
有人问:呐两个式子都不满足呢?这还用说嘛,两个人都不想去吃面条,还有可能吃面条吗?。
这个&&可以捆绑很多很多式子,不像是一对情侣,只有两个人,当他绑定很多式子的时候,可以看成一家人出去聚餐,要满足所有人的餐馆,大家才会去吃。(排除家长逼迫孩子吃的情况)
那么,我们如果两个表达式中满足一个就可以怎么办呢?这时候,我们需要用"||"这个符号把他们"隔开",只要一边满足情况就可以。像是这样:1>0||2>1。举一个小小的栗子,你默写没合格,你那个恶心至极的垃圾班主任兼英语老师要挟你回家给家长看并签字,这个时候,只要家长一方看了签字就行了,返回值就是ture,如果两方都看了都签了字,返回值也是ture(不过有谁默写不合格主动给两个家长看的,这得男女混合双打)。当然了,这个||也可以连接很多个式子,比如你可以找你爷爷奶奶,七大姑八大姨签字,只要有一个人签了字就行。(当然,那个恶心至极的垃圾万恶班主任可能不会同意)。
如果不是很明白,可以试一试这一段代码:
#include <iostream> using namespace std; int main() { bool first = true, second = false; cout<<(first&&second)<<endl; cout<<(first||second)<<endl; return 0; }
改变first和second的值,多试几次,寄几理解一哈
还有一个重要的问题,就是&&比||的优先级要高,就如同乘法和加法一样,&&比||要先运算。
也就是说,1>2 || 2>3 && 4>5 和 1>2 || ( 2>3 && 4>5 ) 是一样的。()当然是优先级最高的,在程序中,一个表达式如果要有很多个括号嵌套起来,是不需要[]和{}的,直接多个()嵌套就可以。比如1>2 && ( 2>3 || (4>5 || 6>5 ) ) 是可以的。
emmm。可能有人不知道&&和||怎么打出来,&&是shift+7,||是shift+\。(你能想到写教程有多麻烦嘛。。中英文实时切换,shift都快磨没了)。
这里提示一下,之前我们布尔型时说过,0住进去,出来的是0,而其他任何数字住进去,出来的就是1。这个一定一定要记住!
来实际看一下&&和||的用法吧!
请听题:
有一数,知其能并为三、五日。若能,言能,若以为不,言不能。
这个"日"是整除的意思。。虽然有点怪怪的。
第一个栗子就一起看吧。
首先整除就是余数为0,也就是n%m=0,此时n能被m整除。这里有两个表达式,分别是n%3==0和n%5==0。
那么把这两个式子连在一起,也就成了n%3==0 && n%5==0。有人可能会疑惑,这里会不会有优先级问题,其实是没有的。/和%优先级比+-高,+-比==高,==比&&高,&&比||高。表示出来就是 / % 》 + - 》 == 》&& 》|| 。(这里由于用>可能会看不懂,就用》代替了>)
表达式解决了,再来解决一下if的框架问题。
刚开始还是建议每次都把框架写出来
if || ||=====||=====|| ture false || || 能 不能 || || ||=====||=====|| end
框架和语句都有了,把程序写出来叭。
答案
#include <iostream> using namespace std; int main(){ int n; cin>>n; if(n%3==0&&n%5==0){ cout<<"能"; }else{ cout<<"不能"; } return 0; }
其实呢,if如果只有一个语句的话,是可以省略{}的,比如
if(n%3==0&&n%5==0){ cout<<"能"; }
可以变成
if(n%3==0&&n%5==0) cout<<"能";
但是如果他有两个及两个以上语句,就必须用{}了,不然程序会当条件满足时,就执行第一句,第二句及以下的语句将会无条件执行。这么说可能会有点难懂,举个例子:
if(a>1){ cout<<"你"; cout<<"好"; cout<<"哇"; }
如果这是三个语句,不写{},就会成这样:
if(a>1) cout<<"你"; cout<<"好"; cout<<"哇";
这种写法,和这个是一样的:
if(a>1) cout<<"你"; cout<<"好"; cout<<"哇";
也就是说,我们本来想让程序在a>1的时候说出你好哇,不满足a>1的时候不输出。但是如果使用第二种错误写法,就会变成 在a>1时说出你好哇,不满足a>1时说出好哇,和我们想让程序做的不同。
复杂的条件分支
上节学习了简单的if判断,上面学习了&&和||,现在来把它们结合起来。
比如 学校开学后不让回家吃饭饭了,必须在学校吃饭,(学校食堂赚大了),食堂缺人手急需找人,于是发布了寻人启事:
现招聘厨师3名,25-50岁均可报名,50岁以上不能报名。
现在食堂在网站上发布了报名表,需要你写一个验证程序,(有点假,表单一般是php语言来验证的),当满足条件时返回true,不满足返回否。
如果没有学过&&和||,你写出来的核心语句就系酱紫的:
if(age > 25){ if(age < 50){ cout<<"true"; } }else{ cout<<"false"; }
代码虽然似乎可以实现,但是可读性差,很冗杂,不便于后期维护,所以这个时候需要用上我们的&&来连接条件
if(age > 25 && age < 50 ){ cout<<"true"; }else{ cout<<"false"; }
这样看是不是可读性就高了?
这是一个&&的简单小栗子,下面来看一个难一点的,不要因为这一题就从入门到入土了。
闰年判断器: 闰年的判断规则是:非整百年,能被4整除的是闰年;整百年,能被400整除的是闰年。
也就是说,这里出现了两个分支,一个是整百年,一个是非整百年,先把这个写出来。
if(year % 100 ==0){ }else { }
那么在整百时,只要能被400整除,就是闰年。
if(year % 400 = 0 ){ cout<<"true"; }
在不是整百年时,只要能被4整除,就是闰年。
if(year % 4 == 0){ cout<<"true"; }else { cout<<"false"; }
所以,把他合起来就是:
if(year % 100 == 0){ if(year % 400 == 0){ cout<<"true"; }else { cout<<"false"; } }else{ if(year % 4 == 0){ cout<<"true"; }else { cout<<"false"; } }
这段代码虽然可以实现判断闰年,但是非常的冗杂,现在我们来缩减一下;
捋一下闰年的定义:(整百且整除400)或(非整百且整除4)
那么直接换成代码也就是:
(year % 100 == 0 && year % 400 == 0 ) || (year % 100 != 0 && year % 4 == 0 )
其实不用加括号,但是为了好看,先加上吧
第一个括号中,year % 400 == 0 明显包含了year % 100 == 0 ,所以year % 100 == 0 可以直接删去。也就变成了
year % 400 == 0 || ( year % 100 != 0 && year % 4 == 0 )。
这个代码可以直接放进去了,也就变成了
if(year % 400 == 0 || year % 100 != 0 && year % 4 == 0 ) cout<<"true"; else { cout<<"false"; }
比上面的代码短了很多,当然,似乎更加难懂了。
最终代码就是这样的:
//本代码已在c++ NOI环境下通过全部测试数据。 #include <iostream> using namespace std; int main(){ int year; cin>>year; if(year % 400 == 0 || year % 100 != 0 && year % 4 == 0 ) cout<<"true"; else cout<<"false"; return 0; }
本节作业:
小于班上举办了一场信息比赛,由于差距大导致分差太大,聪(ruo)明(zhi)的小于想到了一个好办法 用分段的方法来计分,这样分差就大大减少了 规则如下 答对题数在 0 - 10 者,每题给 6 分。 题数在 11 - 20 者,从第 11 题开始,每题给 2 分。(前 10 题还是每题给 6 分) 题数在 21 - 40 者,从第 21 题开始,每题给 1 分。 题数在 40 以上者,一律 100 分。 这样一来,答对10题可以得到60分,答对20题可以得到80分,分差减小了 但是小于班上同学太多,小于这个垃圾数学水平算不清,请设计一个程序来帮助小于计算。
答案如下: