一、程序中的运算
程序中的计算
计算机程序,其实就是计算机按照我们编写好的代码,一步接一步的执行的过程。在程序中,会经常遇到一些计算,这些计算和我们数学上的计算很相似,但是又有一些区别,我们需要掌握计算机程序中的运算的表达,我们此处只介绍C++的表达。
类似与数学上的加减乘除、括号,C++中也是同样的。在C++中,加减乘除分别用:『+』、『-』、『*』、『/』来表示。与数学不同的是,在C++的除法中,分两种情况,一种是整除之间的除法、一种小数之间的除法。整数的除法,并不是数学上的除法,而是整除;小数间的除法,才是数学上的除法。那么既然整数之间有整除,必然会存在余数的情况,也就是求余,求余,C++用『%』来表示。
5+3 = 8
5*2 = 10
5/2 = 2 // 注意这里是整除
5%2 = 1 //求余
另外,C++中的括号只有小括号(),没有中括号、大括号,遇到有多重的括号,就“嵌套”使用小括号。所谓『嵌套』,我们暂且理解为就是自己里面包含自己。
一般幂运算,我们都是用多次相乘,开平方,我们用sqrt(x),如『根号2』 表示为sqrt(2)
数学式子的表达二、布尔值
1、布尔值
众所周知,在计算机里,我们使用的是二进制,即要么是0,要么是1。虽然我们提倡做人不要“非黑即白”,但是计算机是“一根筋”,它是“非一即零”。同样地,要计算机判断一个事情,在它眼里,也有简单的对错之分,没有中间含糊其辞的“半对”。对或错,在计算机中我们用true 和 false 来表示,我们将这种只有对错的值称为布尔值(bool),这其实是一个译音,就像我们说的“车厘子”(cherry,粤语读法,樱桃)。布尔值,只有两个值,true 和 false。true 表示正确、条件是成立的,是真的;flase 表示错误、条件是不成立的,是假的。
2、布尔值的判断
布尔值,只有两个结果,对或者错,那么要如何才能判断呢?首先必须要是命题,才能判断,如果本身都不是命题,则无法判断。命题即是明确描述或表达一种观点的语句。例如:今天是9月1日。这是一个命题,而且我们可以判断它是否正确。一般来讲,命题是陈述句,不能是疑问句。譬如:今天是9月1日吗?这个就不是命题,我们无法判断真假。
为了更好地理解布尔值的判断,我们用一些案例来说明:
3.4 > 5
2017年9月14日是星期四
10是正整数
15 能被3整除
15 能被5整除
对于上面的例子,我们不难得出结果,很显然除了第一个案例是false,其他都是true。
当然,我们在程序中,不太可能用我们的语言文字去描述,而往往使用表达式来表示,那么常用的关系符号有以下这些。
常用符号a%2 == 0 // a能被2整除,即a对2求余,余数是0
y>=60 // 年龄y大于等于60岁
二、与、或、非、异或
有时,我们的布尔的判断,并不仅仅是一个条件,可能需要同时满足多个条件,这个时候,我们就需要涉及到一些逻辑运算中的连接词。譬如在上面的例子中,15能被3整除、15能被5整除,如果我们需要这两个条件都要同时满足,我们可以这样描述:15既能被3整除且能被5整除。
1、与运算
串联电路类似于这种需要同时满足的条件,我们称之为“与”运算,可以类似于电学里面的串联电路,不同的条件是串联的几个开关,必须全部条件都满足,才能电路才通,也就是说必须全部条件都成立,最后结果才成立。与运算,在数学符号中,我们常用『∧』来表示,类似于集合中的交集,在C++语言中,与运算我们用“&&” 或者 “ and ” 来表示。一般两个逻辑表达式,我们都用小括号括起来,这是比较良好的代码习惯。
x能被3整除,且能被5整除 (x%3 == 0) && (x%5 == 0)
语文成绩高于90,数学高于95 (yw>90) && (sx>95)
运算规则:很显然,与运算中,只有所以条件都为真时,整个条件才为真,只要出现某个条件为假,整个条件就是假。
2、或运算
并联电路类似于串联电路,也有并联电路,即在若干条件中,只需要满足一个条件就成立,这样的运算我们成为“或”运算。或运算,在数学符号中,我们常用『∨』来表示,类似于集合中的并集,在C++语言中,或运算我们用“||” 或者 “ or ” 来表示。
乘坐公车,身高低于1.2m或年龄高于60岁的免费 (h<1.2) || (y>60)
语文超过95或数学超过98的获单科奖励 (yw>95) || (sx>98)
运算规则:很显然,或运算中,只要有一个条件为真时,整个条件就为真,只有全部条件都为假,整个条件才是假。
3、非运算
上面我们就提到,计算机是『非黑即白』的,非运算,就是对某种情况的对立面。就好比我们抛硬币,在计算机眼中,只有正面和反面,正面的非运算就是反面,反面的非运算就是正面,不存在硬币立起来的情况。非运算,在数学符号中,我们常用『﹁』来表示,类似于集合中的补集,在C++语言中,非运算我们用“!” 来表示。
a == 0 // a等于0
!(a==0) // 非运算,相当于 (a<0) || (a>0) 也可以写成 a != 0
b > 2 // b大于2
!(b>2) // 非运算,相当于 b<= 2
运算规则:很显然,非运算中,真条件的非运算是假,假条件的非运算是真。
4、异或运算
异或相对上面几个,使用的相对较少,它是一个很奇怪的运算,它一般用在两个条件之间,运算的规则是两个条件相同,即同样为真或同样为假,那它的结果就是假;而如果两个条件不同,即一真一假时,它的结果就为真。异或比较常用在『博弈论』里面。异或运算,在数学符号中,我们常用『⊕』来表示,在C++语言中,与运算我们用“^” 或者 “ xor ” 来表示。
5、总结
我们假定有两个命题或条件P、Q,我们用下表来总结与、或、非、异或的计算关系。
运算结果还有需要注意的是运算的先后顺序。运算级比较:非>与>或、异或(or和xor是同级的),当然括号最优先。
三、练习
例题1.若A=True,B=False,C=True,D=False,以下逻辑运算表达式真的有()。
A.(A∧B)∨(C∧D∨¬A) B.((¬A∧B)∨C)∧¬B
C.(B∨C∨D)∨D∧A D.A∧(D∨¬C)∧B
题解:一个个算结果,比如A选项(A∧B)∨(C∧D∨¬A) ,根据运算级的比较,我们可以定下运算的顺序,然后按运算顺序计算结果。注意,这类题是有个小技巧的。比如A选项可以先看中间的∨,为什么呢?因为∨的左右有一边是真就行,可以不去看另外一边。
A选项的结果是:(A∧B)∨(C∧D∨¬A),(A∧B)=假,(C∧D∨¬A)中C∧D =假,¬A=假,所以(C∧D∨¬A)=假。于是A选项可以简写为:假∨(假∨假)=假。
B选项的结果是:((¬A∧B)∨C)∧¬B,如果¬B是假那么就可以不去看前面的((¬A∧B)∨C),可惜的是¬B是真,那么就要看((¬A∧B)∨C),发现C是真,所以不看(¬A∧B),于是B选项可以简写为:(?∨真)∧真=真。
C选项的结果是:(B∨C∨D)∨D∧A,D∧A=假,所以不得不看前面部分(B∨C∨D),只要BCD有一个是真,那么(B∨C∨D)=真,而容易发现C=true。所以C选项可以简写为:真∨假=真。
D选项的结果是:A∧(D∨¬C)∧B,我们很容易发现D选项的特殊结构为 ?∧?∧?,三个?有一个是假,那么D为假,A和B不用计算便可看出,所以先发现B=假,所以D=假。
历年题目
1、【2010提高(同2010普及)】以下逻辑表达式的值恒为真的是()。
A.P∨(┓P∧Q)∨(┓P∧┓Q)
B.Q∨(┓P∧Q)∨(P∧┓Q)
C.P∨Q∨(P∧┓Q)∨(┓P∧Q)
D.P∨┓Q∨(P∧┓Q)∨(┓P∧┓Q)
2、【2008提高(多选)】若A=True,B=False,C=True,D=False,以下逻辑运算表达式真的有( )。
A.(A∧B)∨(C∧D∨¬A) B.((¬A∧B)∨C)∧¬B
C.(B∨C∨D)∨D∧A D.A∧(D∨¬C)∧B
3、【2008普及】设A=true,B=false,C=true,D=false,以下逻辑运算表达式值为真的是( )。
A. (A∧B)∨(C∧D∨¬A) B. ((¬A∧B)∨C)∧¬D
C. (B∨C∨D)∧D∧A D. A∧(D∨¬C)∧B
4、【2007普及】设A=B=True,C=D=False,一下逻辑运算表达式值为假的有( )。
A.(﹁A∧B)∨(C∧D∨A)
B.﹁(((A∧B)∨C)∧D)
C.A∧(B∨C∨D)∨D
D.(A∧(D∨C))∧B
5、【2006提高(多选)】设A=B=D=true,C=E=false,以下为真的有( )。
A. (A∧B)∨(C∧D)∨E B. (((A∧B)∨C)∧D∧E)
C. A∧(B∨C∨D∨E) D. (A∧(B∨C))∧D∧E
答案:
1~5 A、BC、B、D、AC
网友评论