C++程序设计课本翻译programming - in - C++-紧缩版(9)

2019-08-01 23:13

况,不做任何事情”,换句话说,如果某一条件不满足,你想要计算机跳过一系列指令。你可以让else分支空着来做到这点,即仅使用空语句: if ( a < b ) c = 20 ; else ;

然而,最好你可以简单地去掉else部分。导致的语句是:If语句的If-Then形式。这是它的模板 If 语句 ( if – then 形式) If (表达式) 语句

这里是 If – Then的一个例子,注意下列If –Then语句的缩排形式和位置。 If ( age < 18 )

cout << “Not an eligible” ; cout << “voter .” <

这条语句意味着,如果age小于18,首先打印 “Not an eligible” ,然后打印机“voter.”。 如果age 不小于18。跳过第一条输出语句并直接打印“voter”。

像在If –Then-Else 中一样,If –Then中的分支可以是一个块,例如,让我们说,你正在写一个计算所得税的程序。有关税形式其中之一解释为“ 从 line 17 减去 line 23。并且得到结果在line 24中;如果结果小于零,结果为0,并且显示 check box 24 A”。你可以在C++中使用一个If-Then来做到这点。 result = line 17 – line 23 ; if ( result < 0.0 ) {

cout < <”check box 24A “ <

line 24 = result ;

这个代码确切地做了它应做的税收形式,它计算了从line 17 减去 line 23结果,然后它查看结果result是否小于0,如果是小于0,这个代码段打印一条告诉用户检查24A盒的信息,然后设置结果result为0,最后,计算结果(或0,如果结果小于0的话)存储到名为 line 24的变量中。 如果我们去掉上面代码段中的左和右花括弧会发生什么情况?让我们看看: result = line 17 – line23 //不正确的版本 if ( result < 0.0)

cout < <”check box 24 A”<

尽管我们按照缩排代码的方法,编译器取一条语句——输出语句为then的从句。如果结果result小于0,计算机执行输出语句,然后设置结果result为0,然后存储结果result到line 24中,到目前这些语句是对的。但是如果结果result开始就大于或等于0,计算机跳过then 从句并且处理if 语句下面的语句——设置结果result为0的赋值语句。后果是result的最终值是0,而不考虑它的初始值是什么。这里教训是不能仅依靠缩排,你不能愚弄编译器,如果你希望then或else从句用复合语句,你必须包括左和右花括号。 常见错误

较早我们警告过不要混淆 = 操作符与 = = 操作符,这里是一个错误的例子,对于每个C++编程者在他

的职业中肯定至少有过一次这样的错误: cin >> n ; if (n =3) // 错误 cout << \else

cout << \不管n输入什么值,这个代码段总是打印 n euqal 3

这个错误原因是:我们在if 测试中使用了错误的操作符,表达式 n= 3不是一个逻辑表达式;它被称为赋值表达式,一个赋值表达式有一个值(上面的表达式的值是3)和一个副效应(存储3到n中),在我们例子中的if 语句,计算机找到被测表达式的值是3,由于3是一个非零值,因而被强制为true,不管n的值是什么then从句被执行。目前的错误是,赋值表达式的副效应是存储3到n中,损坏了那里所要做的判断。

5.4 If语句的嵌套

在If语句中,语句是什么没有限制,因此,一个If语句内有If语句可以的,事实上,一个If语句在一个If语句中然后再在一个If语句中是合法的。这里仅有的限制是,人们不能允许一个太多包含的结构,由于可读性是好程序的标志之一。

当我们设置一个If语句在另一个If语句内时,我们正建立一个嵌套控制结构,控制结构嵌套非常像嵌在一起的钵,较小的钵嵌在较大的钵内,这里是一个例子以伪代码写:

通常,任何包含多分支 (多于两个可选择的活动情况) 问题,可以使用嵌套If语句编码,例如,给出月份数字,打印出月份的名字,我们可以使用一系列If语句(非嵌套): if ( month ==1 ) cout << ”January ” ; if ( month ==2 )

cout << ” February ” ; if ( month ==3 ) cout << ” march ” ; ?

if ( month ==12 ) cout << ” December ” ; 但是等价嵌套If结构 if ( month ==1) cout << ”January ” ; else

if (month ==2) //嵌套If cout << ” February ” ; else

if ( month == 3 ) //嵌套If cout << ” march” ; else

if ( month == 4 ) //嵌套If ??

是更有效的,因为它使得语句有更少的比较,第1种版本――独立的If语句序列――总是测试每个条件(所有12个数字),即使第一个比较就满足,也是如此。相反,嵌套If语句的解决方法是在一个选项被选择后,跳过所有剩下的比较。

在后一个例子中,注意then和else从句的缩排,是怎样使语句连续右移。我们能够取代地使用具有深度嵌套的If –Then-Else语句的一种指定的缩排风格来指示复杂结构,这种复杂结构仅选择一套选项中的一个,这种通常的多分支方法被称为If –Then- Else-If 控制结构 if ( month ==1 ) cout << ”January ” ;

else if ( month ==2 ) //嵌套If cout << ”February ” ;

else if ( month == 3 ) //嵌套If cout << ” march ” ;

else if ( month == 4 ) //嵌套If : else

cout << “ December ” ;

这种风格防止进行连续右移的缩排,但是,更重要的是,它视觉上传达了这样的思想,我们正使用基于变量month的12种方法的分支。

注意If语句序列和嵌套If之间的不同是重要的:多于一个的选项可以采取序列If语句,而嵌套If只能选择一个。为了看看这点为什么是重要的,考虑分析填写调查表,有些问题像一系列If语句,要求你在提供给你的一张表(例如所有你的爱好表)中,圈出所有项目。另一些问题要求你在一个表(例如,你的年龄组)中只圈出一个项目,因而像一个嵌套If语句结构,两种问题都会出现在编程问题中,为了能够识别哪种类型的问题被要求,允许你立即选择适合的控制结构。

另一种特殊的有帮助的嵌套If的使用是当你想要从一系列连续值的范围进行选择时。例如,假设我们想根据室外的温度打印出合适的活动,给出下列表:

首先看一下,你也许试图为每个温度范围写一个分立If语句,可是进一步检查,就会清楚看到,这些If条件是相互依赖的,即,如果语句中其中之一被执行其它的语句就不执行,我们确实是从一套可能性中选择一种选项――在这种情况下,我们可以使用一个嵌套If结构作为一种多分支方法。这个问题和前面根据数字来打印月份名的例子之间的仅有的差别是,我们必须在If分支表达式中选择数字的范围。

当范围是连续时,我们可以利用这种方法来使得我们的代码更有效。我们按照范围连续的次序来安排分支,然后,如果到达一个指定的分支,我们知道,先前的范围被从考虑的范围中除去,然而,If表达式必须只对每个范围最低值比较温度。

cout <<”The recommended activity is” if ( temperature > 85 )

cout << ” swimming.” << endl ; else if ( temperature >70 ) cout << ” tennis.” << endl ; else if ( temperature >32 ) cout << ”golf.” << endl ; else if ( temperation > 0 )

cout << ” string.” << endl ; else cout << ”dancing .” << endl ; 悬浮的else

当If语句是嵌套式时,你也许发现你可能会把If-else配对混淆。即,哪一个If是else所属?例如,假设如果一个学生的平均分低于60,我们希望打印出 ” Failing ” ;如果平均分至少是60但小于70,我们想打印出 ”Passing but marginal ” ;如果是70或更大,我们不想打印出任何信息。 我们在一个If-Then内,对这个信息用一个If-Then-Else嵌套编代码: if ( average < 70.0 ) if ( average < 60.0 ) cout << ” Failing ” ; else

cout << ” Passing but marginal ” ;

我们如何知道哪一个If是else所属的?这里是C++编译器遵循的规则:在缺少花括弧中,一个else总是与它前面最近的还没有与一个else配对的If配对,我们缩排代码来反映这种配对关系。 假如我们写代码段像这样:

if ( average >= 60.0 ) //不正确的版本 if ( average < 70.0 )

cout << “ passing but marginal ” ; else

cout << ” Failing ” ;

这里,我们希望else分支附到外面的If语句,而不是内部的If,所以,我们缩排代码正如你看到的那样,但是缩排不影响代码的执行,虽然else与第一个If排在一列,但是编译器还是把else与第二个If配对。一个else跟在一个嵌套If-Then后面被称为悬浮的else。悬浮的else在逻辑上与嵌套If无关,但是编译器会把else附到If上去。

为了把else附到第一个If上,而不是第二个If上,你可以把外面的Then从句转成一个块: if ( average >= 60.0 ) //正确的版本 {

if ( average < 70.0 )

cout << “ passing but marginal” ; } else

cout << ” Failing ” ;

双花括号{}指出内部的if语句是完整的,所以else必须属于外面的if。

5.5 测试 I/O流的状态

在第4章中,我们谈了C++中有关输入和输出流的概念,我们介绍了类istream,ostream,ifstream和ofstream。我们所说的下列任何一种情况都会引起输入流进入失败状态: ? 无效的输入数据

? 试图在文件结尾以外读数据 ? 试图打开一个不存在的文件作为输入

C++提供了一种检查一个流是否是处在失败状态的方法。在一个逻辑表达式中,你只要使用流对象(如cin)名,把它当作是一个布尔变量。 if( cin ) ?

if ( !infile ) ?

当你这样做时,就是说你正测试流状态,测试的结果是true (意味着在那个流上的最终的I/O操作是成功的) 或false (意味着最终的I/O操作是失败的)。

概念上,你希望在逻辑表达式中,把一个流对象认为是一个具有值true (流状态是OK)或false ( 流状态非OK ) 的一个布尔变量。

注意,在上面的第二个if语句中,我们在表达式!infile周围打印出空格,C++中空格不是必须的,只是为了可读性,没有空格,比较难看出感叹号!标记: if ( !infile)。

在一个If语句中,你表述逻辑表达式的方法取决于你希望Then从句要做什么。如果对于inFile的最终I/O 操作是成功的,语句 if (inFile) ?

执行then从句是。如果infile是在失败状态,语句 if( !infile ) ?

执行then从句。(记住一旦一个流是处在失败状态,它就保持这种状态,任何进一步的对那个流的I/O操作是无效的操作 )。

这里是一个例子,显示如何检查一个输入文件是否成功打开: #include

#include //为了文件I/O using namespace std ; int main() {

int height ; int width ; ifstream inFile;

inFile.open(\试图打开输入文件 if ( !inFile ) // 输入文件打开否 ? {

cout << \没打开 – 打印信息 return 1; // 中断程序 }

inFile >> height >> width; : return 0; }

在这个程序中,我们开始试图打开磁盘文件mydata.dat作为输入,我们马上检查看看这个打开文件的试图是否成功。如果是成功的,If语句中表达式!infile的值是false并且then从句被跳过,程序从文件中进行读数据。


C++程序设计课本翻译programming - in - C++-紧缩版(9).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:住房公积金 - 专办员试题与答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: