好文档 - 专业文书写作范文服务资料分享网站

信息学奥赛培训教程C++版

天下 分享 时间: 加入收藏 我要投稿 点赞

6.5 if/else选择结构

if选择结构只在条件为true时采取操作,条件为false时则忽略这个操作。利用if/else选择结构则可以在条件为true时和条件为false时采取不同操作。例如,下列伪代码:

if student's grade is greater than or equal to 60 print \ else

print \

在学生成绩大于或等于60时打印“Passed”,否则打印\。打印之后,都“执行”下一条伪代码语句。注意else的语句体也缩排。

上述伪代码if/else结构可以写成如下的C++代码: if(grade>=60)

cout<<\ else

cout<<\

C++提供条件运算符(?:),与if/else结构密切相关。条件运算符是C++中惟一的三元运算符(thrnary operator),即取三个操作数的运算符。操作数和条件运算符一起形成条件表达式(conditional expression)。第一个操作数是条件,第二个操作数是条件为true时整个条件表达式的值.第三个操作数是条件为false时整个条件表达式的值。例如,下列输出语句:

cout<<(grade>=60? \

包含的条件表达式在grade=60取值为true时,求值为字符串“Passed”;在grade>=60取值为false时,求值为字符串\。这样,带条件表达式的语句实际上与上述if/else语句相同。可以看出,条件运算符的优先级较低,因此上述表达式中的话号是必需的。

条件表达式酌值也可以是要执行的操作。例如.下列条件表达式: grade >=60? cout<<\

表示如果grade大于或等于60,则执行cout<<\,否则执行cout<<\。这与前面的if/else结构也是相似的。条件运算符可以在一些无法使用if/else语句的情况中使用。

嵌套if/else结构(nested if/else structure)测试多个选择,将一个if/else选择放在另一个if/else选择中。例如,下列伪代码语句在考试成绩大于或等于90分时打印A.在80到89分之间时打印B,在70到79分之间时打印C,在60到69分之间时打印D,否则打印F。

if studen's grade is greater than or equal to 90

print \ else

If student's grade is greater than or equal to 80 print \ else

If student's grade is greater than or equal to 70 print \ else

If student's grade is greater than or equal to 60

-76-

print \ else

print \

这个伪代码对应下列C++代码: if (grade>=90) cout<<\ else

if (grade>=80) cout<<\ else

if (grade>=70) cout<<\ else

if (grade>=60) cout<<\ else

cout<<\

如果考试成绩大于或等于90分,则前4个条件都为true,但只执行第一个测试之后的cout语句。执行这个cout语句之后,跳过外层if/else语句的else部分。许多C++程序员喜欢将上述if结构写成:

if (grade>=90) cout<<\ else if (grade>=80) cout<<\ else if (grade>=70) cout<<\ else if (grade>=60) cout<<\ else

cout<<\

两者形式是等价的。后者更常用,可以避免深层缩排便代码移到右端。深层缩排会使一行的空间太小,不长的行也要断行,从而影响可读性。

下例在if/else结构的else部分包括复合语句: if (grade>=60)

cout<<\ else{

cout<<\

cout<<\ }

如果grade小于60,则程序执行else程序体中的两条语句并打印: Failed.

You must take this course again.

-77-

注意else从句中的两条语句放在花括号中。这些花括号很重要,如果没有这些花括号,则下列语句:

cout<<\

在if语句else部分之外,不管成绩是否小于60都执行。

本节介绍了复合语句的符号。复合语句可以包含声明(例如,和main程序体中一样),如果这 ,则这个复合语句称为块(block)。块中的声明通常放在块中任何操作语句之前,但也可以和操作语句相混和。

6.6 while重复结构

重复结构(repetition strucure)使程序 员可以指定一定条件下可以重复的操作。下列伪代码语句:

While there are more items on my shopping list Purchase next item and cross it off my list

描述购物过程中发生的重复。条件\购物清单中还有更多项目)可真可假。如果条件为true.则执行操作\购买下一个项目并将其从清单中划去)。如果条件仍然为true,则这个操作重复执行。while重复结构中的语句构成while的结构体,该结构体可以是单句或复合句。最终,条件会变为false(购买清单中最后一个项目并将其从清单中划去时),这时重复终止,执行重复结构之后的第一条伪代码语句。

作为实际while的例子,假设程序要寻找2的第一个大于1000的指数值。假设整数变量product初始化为2,执行下列while重复结构之后,product即会包含所要值:

int product = 2;

while ( product <= 1000 ) product = 2 * product;

进入while结构时,product的值为2。变量product重复乘以2,连续取值4、8、16、32、64、128、256、512和1024。当product变为1024时,while结构条件product<=1000变为false,因此终止重复,product的最后值为1024。程序继续执行while后面的下一条语句。

6.7 构造算法:实例研究1(计数器控制重复)

要演示如何设计算法,我们要解决几个全班平均成绩的问题。考虑下列问题:

班里有10个学生参加测验,可以提供考试成绩(0到100的整数值),以确定全班平均成绩。 全班平均成绩等于全班成绩总和除以班里人数。计算机上解决这个问题的算法是辅人每人的成绩,进行平均计算,然后打印结果。

下面用伪代码列出要执行的操作,指定这些操作执行的顺序。我们用计数器控制重复(counter-conttrolled repetition)一次一个地输人每人的成绩。这种方法用计数器(counter)变量控制一组语句执行的次数。本例中,计数器超过10时,停止重复。本节介绍伪代码算法(如图6.6)和对

-78-

应程序(如图6.7)。下节介绍如何开发这个伪代码算法。计数器控制重复通常称为确定重复(definiterepetition),因为循环执行之前,已知重复次数。

注意算法中引用了总数(total)和计数器。总数变量用于累计一系列数值的和。计数器变量用于计数,这里计算输人的成绩数。存放总数的变量通常应先初始化为0之后再在程序中使用,否则总和会包括总数的内存地址中存放的原有数值。

Set total to zero

Set grade counter to one

While grade counter is less than or equal to ten Input the next grade

Add the grade i.to the total Add one to the grade counter

Set the class average to the total divided by ten Print the class average

图6.6 用计数器控制重复解决全班平均成绩问题的伪代码算法

1 // Fig. 2.7: fig0207.cpp

2 // Class average program with counter-controlled repetition 3 #include 4

5 int main() 6{

7 int total, // sum of grades

8 gradeCounter, // number of grades entered 9 grade, // one grade

10 average; // average of grades 11

12 // initialization phase

13 total = 0; // clear total

14 gradeCounter = 1; // prepare to loop 15

16 // processing phase

17 while ( gradeCounter <= 10 ) { // loop 10 times 18 cout << \ // prompt for input 19 cin >> grade; // input grade 20 total = total + grade; // add grade to total 21 gradeCounter = gradeCounter + 1; // increment counter 22 } 23

24 // termination phase

25 average - total / 10; // integer division 26 cout << \ 27

28 return 0; // indicate program ended successfully

-79-

29 }

输出结果: Enter grade: 98 Enter grade: 76 Enter grade: 71 Enter grade: 87 Enter grade: 83 Enter grade: 90 Enter grade: 57 Enter grade: 79 Enter grade: 82 Enter grade: 94 Class average is 81

图6.7 用计数器控制重复解决全班平均成绩问题的C++程序和示例输出

根据使用情况,计数器变量通常应先初始化为0或1(下面会分别举例说明)。未初始化变量会包含垃圾值“garbage”value),也称为未定义值(undefined value),为该变量保存内存地址中最后存放的值。

切记:一定要初始化计数器和总和变量。每个变量在单独一行中声明。

注意程序中的平均计算产生一个整数结果。实际上,本例中的成绩总和是81.7,除以10时应得到81.7,是个带小数点的数,下节将介绍如何处理这种值(称为浮点数)。

图6.7中,如果第21行用gradeCounter而不是10进行计算,则这个程序的输出显示数值74。

6.8 构造算法与自上而下逐步完善:实例研究2(标记控制重复)

下面将全班平均成绩问题一般化,考虑如下问题:

设计一个计算全班平均成绩的程序,在每次程序运行时处理任意个成绩数。

在第一个全班平均成绩例子中,成绩个数(10)是事先预置的。而本例中,则不知道要输入多少个成绩,程序要处理任意个成绩数。程序怎么确定何时停止输入成绩呢?何时计算和打印全班平均成绩呢?

一种办法是用一个特殊值作为标记值(sentinelvalue),也称信号值(signalvalue)、哑值(dummy value)或标志值(flag value),表示数据输入结束(“end of data entry”)用户输入成绩,直到输入所有合法成绩。然后用户输入一个标记值,表示最后一个成绩已经输入。标记控制重复(sentinel-controlled repetition)也称为不确定重复(indefinite repetition),因为执行循环之前无法事先知道重复次数。

显然,标记值不能与可接受的输入值混淆起来。由于考试成绩通常是非负整数,因此可以用-1作标记值。这样,全班平均成绩程序可以处理95、96、75、74、89和-l之类的输人流。程序计算并打印成绩95、96、75、74和89的全班平均成绩(不计入-1,因为它是标记值)。

我们用自上而下逐步完善(top-down,stepwise refinement)的方法开发计算全班平均成绩的程序,这是开发结构化程序的重要方法。我们首先生成上层伪代码表示:

-80-

信息学奥赛培训教程C++版

6.5if/else选择结构if选择结构只在条件为true时采取操作,条件为false时则忽略这个操作。利用if/else选择结构则可以在条件为true时和条件为false时采取不同操作。例如,下列伪代码:ifstudent'sgradeisgreaterthanorequalto60print\els
推荐度:
点击下载文档文档为doc格式
7147t1zw3j3ef8l93ts6
领取福利

微信扫码领取福利

微信扫码分享