您的位置:首页 > 编程语言 > C语言/C++

C++学习日记--分支结构(if语句)

2014-02-18 22:38 387 查看
if语句

对于可能发生的事情,我们平时经常会说“如果……,那么……”。语文里,我们叫他条件复句、“如果”之后的内容我们称之为条件,当条件满足时,就会发生“那么”之后的事件。我们来看这样语句英语:if mark>90,cout<<”GOOD!”<<endl.把它翻译成中文就是:如果分数大于90,则输出GOOD。

其实在程序设计中,也是用“如果”来描述可能发生的情况的。他和刚才的那句英语很相似,具体的语法格式是:



我们把若干句语句放在一个大括号中,称为语句块。运行到该if语句,当条件满足时,就会执行语句块内的内容。我们也可以用流程图(图4.1.1)来表示if语句。请注意,if语句的结束是没有分号的,分号只属于语句块中的语句。



一、条件—关系运算

当我们判断一个条件的时候,依赖于这个条件是真是假。说到真和假,我们不难想到布尔型数据,因为他就是分别用0和1来表示真和假。显然条件的位置上应该放置一个布尔型的数据。然而,光靠死板的0和1两个数仍然无法描述可能发生着变化的各种情况。那么我们如何让电脑来根据实际情况作出判断呢?

这里我们要引入关系运算。之前的加减乘除和取余数之类的操作,结果都是整数或实型数据。而关系运算的结果则是布尔型数据,也就是说他们的结果只有两种—真或假。

所谓关系运算,是判断操作符两边数据的关系。这些关系一共有六种,分别是:等于、大于、小于、大于等于、小于等于、不等于。如下表所示:



当操作符两边的数据符合操作符对应的关系时,运算结果为真,否则为假。比如5>1的结果是1(真),’a’==’a’的结果也是1(真);而3<=2的结果为0(假)等等。特别要注意,==和=是两个不同的操作符,前者是判断操作符两边数据的关系,后者是把右边的表达式的结果赋值给左边。

下面我们来看一段程序:

Int main()

{

Int a,b;

Cout<<”请输入两个数:”;

Cin>>a>>b;

If(a>b)//如果a比b大,则将两个数交换

{

Inttemp;//创建一个临时变量

Temp= a;

A=b;

B=temp;

}

Cout<<a<<””<<b<<endl;//将两个数从小到大输出

Return 0;

}

第一次运行结果:

请输入两个数:1 5

1 5

第二次运行结果:

请输入两个数:3 2

2 3

算法时间:交换

交换是程序设计中最基础最常用的一种操作。它的算法在现实生活中也有着形象的操作。交换两个变量里的数据就好像交换ab两个碗中的水。我们必须再拿一个碗来(临时变量)将A碗里面的水先倒到这个临时的碗里,再将B碗的水倒到空的A碗里,最后把临时碗里的水再倒回B碗,那么就完成了这个工作。对照着这个过程去阅读代码是不是有些理解了?至于这个算法的代码,也是非常好记的。记住把临时变量放在首位,然后把任一变量放在等号的右边,下一句语句开头的必须也是这个变量。简单地记就是首尾相连。这个程序完成的工作是将两个无序的整数从小到大的输出。即如果第一个数比第二个数大,先交换在输出,否则直接输出。

二、条件—逻辑运算

学校评三好学生,候选人必须要德智体全面发展才能够评上;学校开运动会,运动员只要在某一个项目上是全校第一就能够获得冠军。现实生活中,有些条件会很严格,要数项同时满足才算符合条件;而有些条件又会很松,只要符合其中某一项就算符合条件了。在程序设计中,我们也会遇到这样的问题。

平时,我们往往是用“并且”和“或”两个词来描述这些情况的。而在程序设计中,我们用逻辑运算来描述。我们平时称他们“与”(相当于并且)、“或”、“非”。“逻辑与”的操作符是&&,“逻辑或”的操作符是||,“非”的操作符是!。下面三个真值表说明了各逻辑运算的结果。



上面两表的第一行和第一列分别是逻辑操作符两侧的值,右下角带有灰色底纹的四个是经过运算后的结果。



如果我们用集合A和集合B分别来描述两个不相同的条件A和B,那么A&&B表示要满足集合A与集合B的交集;A||B表示要满足集合A与集合B的并集;!A表示要满足集合A的补集。

在程序设计中,我们把表达式中运算的次序称作操作符(Operator)的优先级。那么,关系操作符和逻辑操作符的优先级是怎样的呢?

和简单表达是一样,括号的优先级仍然是最高的。无论什么情况都应该先从左到右地计算括号内的结果。当算术操作符、关系操作符和逻辑操作符处于同一级的括号中时,则分别从左向右地依次进行逻辑非运算、算术运算(遵循算术运算的优先级)、关系运算、逻辑与运算和逻辑或运算。(记作“不算关羽活”)。

看程序:

#include “iostream.h”

Int main()

{

Int mark;

Cout<<”请输入成绩(0~100):”;

Cin>>mark;

If(mark>=80&& mark<=100)

{

Cout<<”Good!”<<endl;

}

If(mark>=60 && mark <80)

{

Cout<<”So so”<<endl;

}

If(mark>=0 && mark < 60)

{

Cout<<”Pleasework harder!”<<endl;

}

If(mark<0||mark>100)

{

Cout<<”ERROR!”<<endl;

}

Return 0;

}

第一次运行结果:

请输入成绩(0~100):100

Good!

第二次运行结果:

请输入成绩(0~100):75

So so

第三次运行结果:

请输入成绩(0~100):59

Please work harder!

第四次运行结果:

请输入成绩(0~100):105

我们可以看到,将关系运算和逻辑运算配合使用,可以将数值有效的分段。以上这段程序的功能就是按照不同段的数值输出不同的结果,如果输入的数值超出正常的取值范围,则输出出错信息。

算法时间:纠错

熟悉电脑软件的同学都知道,不少软件或程序有时候会有漏洞(Bug),使得程序的安全性或稳定性受到影响。而产生这些漏洞的部分原因就是程序员在设计程序时有所疏漏,忘记了去考虑一些可能引起错误的特殊情况。我们把这些可能引起程序异常的情况称为临界情况。比如在a/b中,b=0就是一种临界情况。如果不考虑到这种情况,则有可能导致除数为零而是整个程序崩溃。我们学会了if语句以后既能够从一定程度上避免一些可以预知的错误,把那些临界情况引入纠错程序。(比如输出出错信息,或及时中止程序)

三、&&和||的妙用

有时候我们做数学题会遇到这样的问题--(1+5*8)/6*0/(5/6+2),当我们发现整个式子是乘式,并且有一个乘数为0的时候,则会不再做更多的计算,把结果脱口而出。因为无论后面的乘数的什么,都无法改变结果了。

根据真值表我们知道,在逻辑与中,只要有一个假则整个表达式的结果为假;在逻辑或中,只要有一个是真则整个表达式的结果为真。我们发现逻辑与、逻辑或和上面所说的例子有着相似之处,那么电脑会不会像我们一样,不再做更多无谓的计算呢?

答案是肯定的。即在一个或多个连续的逻辑与中,一旦出现一个假,则结果为假,处于该位置以后的条件不再做更多判断;在一个或多个连续的逻辑或中,一旦出现一个真,则结果为真,处于该位置后的条件也不再做更多判断。

比如:

if(m!=0 && n/m<1)

{

Cout<<”OK”<<endl;

}

当m=0时,电脑不会去尝试用n/m了,而是直接跳过证据语句。这样,我们就能避免除数为零的错误了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: