03-Logic

03-Logic
03-Logic

03-Logic

关系运算符和逻辑运算符

概述:

到目前为止所写的程序代码都是一句接着一句执行的,但实际上大多数的决定都需要根据实际情形作判断。例如,如果X大于等于0,那么输出X的平方根。逻辑是让程序做出判断的必要条件。

逻辑学是由古希腊的亚里斯多德创立的。在他之后的两千多年里,来自世界各地的无数的哲学家、逻辑学家和数学家不断地对他的理论进行发展。现在我们说的逻辑是属于数学的一个分支,但是早期的逻辑完全和数学没有关系。直到17世纪,一些数学家才把它看成是数学的一个领域。在现代数学中,逻辑学已成为一个非常强大的工具。

通过本节的学习,我们将学会用逻辑表达式来描述生活中的逻辑问题;能够确定哪些是真,哪些是假;能把开关图与程序的逻辑表达式互相转换。

1. 布尔值: true, false

在人类知道的事物中,有些量的变化是连续的,如时间的流动;有些量的变化是非连续的,如人口的数量总是自然数,不可能有小数出现;还有些量只可能是真或假两种情况。例如,“亚马逊河是世界上最长的河流。(假)”,“1小时等于60分钟。(真)”,“实数a减去b的值大于0。(可能真也可能假,根据a和b的具体数值决定)”。

下面的例子说明了如何在程序中判断“真”和“假”。

例1:输出关系表达式的值 [上机做一遍]

设x和y为整数类型变量,那么x>y的值只可能是真(true)或假(false)。

using System;

class App1

{

static void Main()

{

int x,y; //定义x,y为整数类型变量

x=1; //把1赋给

y=2; //把2赋给y

Console.WriteLine(x>y); //输出表达式x>y的值

}

由于x的值小于y的值,所以执行x>y的值应该是“假”。运行结果如下

输出表达式x>y的值

例2.把关系表达式的值(true或者false)赋给布尔类型的变量 [上机做一遍]

using System;

class App1

{

static void Main()

{

bool b; //定义b是布尔类型变量

int x, y; //定义x,y为整数类型变量

x=1; //把1赋给

y=2; //把2赋给y

b=x>y; //把表达式x>y的值赋给b

Console.Write(b); //输出b的值

}

把关系表达式的值赋予布尔类型变量

乔治.布尔(Boole, George 1815-1864),英国著名的

数学家和逻辑学家,发展了布尔代数学.他的一生大

部分是自学成名的。1849年布尔受聘为爱尔兰考克州

皇家学院的数学教授。1854年在一次概率思想的研究

中,布尔提出了一套数学系统,就是现在有名的布尔

代数学.在布尔代数学中逻辑命题可以由抽象的符号

来代表,这样以来逻辑命题就可以通过抽象的数学操

作来执行,与概率逻辑相对应。布尔代数的提出对于早先的计算机的设计

和数学思想的研究都有很重要的作用。因此,乔治.布尔被看作是计算技

术和信息技术的奠基人之一。

2. 关系运算符

例3.6个关系表达式的判断 [上机做一遍]

假设有下面的定义:

int i = 1;

int j = 2;

int k = 2;

char c = ’2’;

char d = ‘3’;

char e = ‘2’;

下列表达式的值为true.

c==e //当两个操作数的值相等的时候==为真值

i!=k //当两个操作数的值不同的时候!=为真值

i

d>e //当左侧的操作数的值大于右侧的操作数的值的时候>为真值

i<=k //当左侧的操作数的值不大于右侧的操作数的值的时候<=为真值

j>=k //当左侧的操作数的值不小于右侧的操作数的值的时候>=为真值

下列表达式的值为false .

i==j //当两个操作数的值不相等的时候==为假值 c!=e //当两个操作数的值相等的时候!=为假值

je //当左侧的操作数的值不大于右侧的操作数的值的时候>为假值 d<=c //当左侧的操作数的值大于右侧的操作数的值的时候<=为假值 i>=k

//当左侧的操作数的值小于右侧的操作数的值的时候>=为假值

3. 逻辑运算:(&&、||、!)

通过前面的学习已经知道布尔变量的值不是True 就是False 。正如实数变量可以通过加、减、乘、除符号构成表达式一样,布尔变量也有它的运算符,叫做逻辑运算符。下面将学习逻辑运算符的用法。

逻辑运算符有3个,它们是“与”、“或”、“非”。“与”运算符用“&&”表示;“或”运算符用“||”表示;“非”运算符用“!”表示。为了能形象地说明三个运算符的使用方法,这里用电路开关作为描述手段。

例1.用电路开关的闭合与断开表示布尔变量的True 和False

1937年,美国数学家克劳德.香农发现电路开关能够实现逻辑运算:当电路上有一个开关,而这个开关闭合时,电流能够通过,相当于逻辑上的“是”;开关断开时,电流不能通过,相当于逻辑上的“非”。由于布尔类型变量的值只可能是true 或者false ,所以把布尔变量看作一个开关。断开的状态是false ;闭合的状态是true 。

例2.电路开关的串联与并联表示布尔变量的“与”和“或”

当电路上串连着两个开关时,有串联和并联两种组合方式。串联时,只有p 和q 都闭合电路才导通;并联时,p 或q 的任何一个闭合电路就导通。并联用符号||表示,读作“或”;串联用符号&&表示,读作“与”。 开关的两种状态

p

q

串联: p && q 并联: p || q

例3.“与”、“或”运算的规则

下表的左侧两列呈现了布尔变量p和q的所有组合。右侧两列呈现了串联和并联开关电路的值。也就是说从这张表可以知道“与”和“或”运算的规则。

例4.用电路开关表示逻辑运算符“非”

开关的断开与闭合是两种相反的状态。如果p 的值是false ,则!p 就是true 。感叹号在这里是取反符号,读作“非”。 “&&与、||或、!非”统称为逻辑运算符。

p

逻辑运算符“非”的开关图

上面的例子说明了逻辑运算符的表示方法和运算规则。请运用逻辑运算符的规则解下列例题,然后比较自己的解答过程与例题的解,看看是否正确。

例5.例题

1.假设下面的定义是有效的,

bool Q1 = true;

bool Q2 = true;

bool Q3 = false;

那么,下面表达式的值是什么?

(Q1 && Q2) || Q3

解:

(1). 把变量的值代入逻辑表达式,得到( true && true ) || false。

(2). 括号内的表达式先执行,得到true || false。

(3). 所以运算结果为true。

2. 假设下面的定义是有效的

bool Q1 = true;

bool Q2 = true;

bool Q3 = false;

那么,下面的表达式的值是什么?

( ! (Q1 && Q2) ) || Q3

解:

(1).代入布尔值,得 (!(true && true)) || false

(2). (!(true))||false

(3). false || false

(4). false

3. 假设下面的定义是有效的,

int i = 5;

int j = 10;

int k = 30;

那么,下面的表达式的值是什么?

( i > j ) && ( k > 10 )

解:

(1).代入变量的值,得 (5 > 10 ) && ( 30 > 10)

(2). false && true

(3). false

4. 逻辑运算符的优先级别

算术运算的先后顺序是先乘除后加减。逻辑运算符也有先后顺序,叫做逻辑运算符的优先级别。

例6.判断运算符的优先级别

设p, q, r为布尔类型变量。逻辑表达式p || q && r对应下面哪个开关图?

( p || q ) && r p || ( q && r )

正如四则运算时先算乘除再算加减,逻辑运算符也有优先级的先后顺序。也就是说“与”、“或”、“非”哪个先算,哪个后算。

解决优先级问题的思路是:首先写出表达式( p || q ) && r和p || ( q && r )的真值表,然后编写程序输出表达式p ||q && r的值。最后把程序输出的值与真值表比较,找到等价表达式就能确定优先级。

第1步. 为判断“与”、“或”的优先级,我们首先找出p, q, r的所有组合,然后分别计算( p || q ) && r和p || ( q && r )的真值表。

第2步. 把真值表内的值依次赋给p, q, r,输出表达式p ||q && r的结果。

using System;

class Class1

{

static void Main()

{

bool p,q,r;

p=true;q=true;r=true;//真值表的第一行

Console.Write(p||q&&r);

}

}

第3步. 把程序的输出结果和真值表做比较,发现p || q && r和p || ( q && r )的真值序列相同。因此根据等价定理得知,“与”的优先级高于“或”的优先级。

* 更简便的办法是仅测试真值表第5或第7行的值,就能得知运算符的优先顺序。

自测练习:

1.逻辑运算符“非”和“与”相比,哪个优先级别高?

2.假设下面的定义是有效的

int i = -3;

int j = 10;

int k = 30;

那么,下面表达式的值是什么?

( i != j ) && (( i < 5 ) || ( j <10 ) || ( k >= 30 ))

True

3. 假设下面的定义是有效的

int i = 3;

int j = 13;

int k = 30;

bool B1 = true;

那么,下面的表达式的值是什么?

( i == j ) && ((( i > 5 ) || ( j < 10 )) && B1 )

False

活动:根据逻辑表达式画开关图

活动分析:逻辑表达式和开关图可以互相转换。把逻辑表达式转换为形象的开关图可以帮助掌握逻辑运算的规则。

材料:白纸、笔

要求:根据表格中的逻辑表达式和变量的值画出开关图。

相关主题
相关文档
最新文档