程序控制结构

第3章

本章要点

.顺序控制。
.选择控制及其嵌套。
.多路选择控制。
.循环控制及循环嵌套。
.输入信息控制循环。
在学习了C+
+ 
的数据类型、表达式和简单的输入/输出控制之后,就能够编写一些可以
完成一定功能的程序了。在程序设计中,算法的实现都是由一系列控制结构完成的。在经
典的结构化程序设计中,最基本的控制结构有顺序、选择和循环,它们是构成复杂算法的
基础。

3.顺序控制结构
1 

C+
+ 
程序由若干语句构成,程序中的大部分语句都是按顺序执行的。顺序控制结构是
系统预置的,除非特别指定,计算机总是按指令编写的顺序一条一条地执行,顺序控制的流
程如图3-1所示。

从图3-1可以看出,在顺序控制结构中,语句按先后顺序依次执
行语句1,语句2,…, 语句n。
例如,下面的程序代码将一个三位整数n的百位数、十位数和
个位数分别取出,并分别赋值给变量i、j和k。

intnijk 声明四个整型变量n、i、j和k 
cout"输入一个三位整数" 屏幕显示输入提示信息
cin n 键盘输入数据并存入n中
i=n100 获取n的百位数并赋值给i 
j=n10%10 获取n的十位数并赋值给j 
k=n%10 获取n的个位数并赋值给k 图3-1 顺序控制的流程

这段程序代码是典型的顺序控制。假设输入n的值为567,则
n/100 的结果为整数5,所以i=5;这时n只是被使用,并没有被重新赋值,因此n仍为567, 
则n/10 为56,56%10 的结果为6,所以j=6;因为n仍为567,n%10 的结果为7,所以k=7。



52
C+
+ 
程序设计基础(第2版) 

3.选择控制结构
2 

设计程序的关键是使程序具有决策能力,C+
+ 
提供了多种选择控制语句来支持程序选
择决策,这些选择控制语句构成了适合不同情况下使用的选择控制结构。例如,当某一条件
满足时,程序执行某一操作;条件不满足时,则执行另一个操作。又例如,如何根据用户选
择的菜单项执行特定的程序代码等。

下面就从最简单的if…else语句开始,看看C+
+ 
如何使用各种不同的选择控制语句进
行选择操作。

3.2.1 
选择控制语句if…else 
使用if…else语句可以让程序根据测试表达式的值决定执行两条语句中的哪一条。这
种语句对于二者选择其中之一很好用,其语法形式为: 

if测试表达式语句
1
else 语句
2


if…else语句的执行顺序是:首先计算测试表达式的值,若测试表达式的值为true,则执行
语句1;否则执行语句2,执行流程如图3-2(a)所示。


图3-2if…else语句控制流程

例如,如下的if…else语句可以根据x的值是否大于或等于0,实现分别给y赋值为1 
或-1的功能。

ifx =0 

y=1 语句1 

else 

y=-1 语句2 

在使用if…else选择控制语句时,应注意以下两点。

(1)其中的语句1和语句2可以是一条语句,也可以是由花括号({}) 括起来的语句序
列,称为复合语句或语句块。
(2)当语句2为空时,else可以省略,构成if简单选择控制语句,其语法形式如下: 
if测试表达式语句

if简单选择控制语句的执行顺序与if…else语句基本相同,只是当测试达式的值为


false 
时,不执行任何语句,直接结束选择控制,如图3-2(b)所示。
例如,以下的if简单选择控制语句可以判断变量x的值是否为偶数: 

ifx%2==
0
cout "x是偶数
"


【例3-1】在两个数中找较大值。
问题分析:使用if…else语句可以很容易地实现在两个数中找较大值。假设有两个数
a和b,则测试表达式为a>b,程序代码如下: 

#includeiostream
usingnamespacestd
intmain



intabmax
cout "Inputab"
cin a 
b
ifa 
b


max=
a
else


max=
b
cout "Themaxis" max endl
return0


程序运行结果: 

Inputab4 
5
Themaxis5


3.2.2 
条件运算符(?:)代替if…else语句
C+
+ 
中常用条件运算符(?:)代替if…else语句来实现选择控制。例如,用语句

max=abab 

替换例3-1中的ifelse语句,即

ifa 
b
max=
a
else
max=
b


程序运行后,结果是相同的。
例3-1是在两个数中找较大值,如果是在三个数中找最大值,程序又应如何实现呢? 程
序代码如下: 

#includeiostream
usingnamespacestd
intmain



53
第
章

程序控制结构


54
C+
+ 
程序设计基础(第2版) 

intabcmax
cout "Inputabc"
cin a b 
c


*ifa b max=
a
else max=
b
ifc max max=
c


* max=abab cabab c 用运算符实
现
cout "Themaxis" max endl
return0
请读者注意程序中用条件运算符(?:)实现的语句: 

max=abab cabab c 

与if…else语句相比,条件运算符“?:”更简洁,但对初学者来说并不容易理解。虽然, 
一般情况下条件运算符“?:”都可以代替if…else语句,但这两种方法之间也有区别。条件
运算符“?:”生成一个表达式,因此是一个值,可以将其放入另一个更大的表达式中或将其赋
给变量,在三个数中找最大值的程序中就将条件表达式a>b?a:b放入另一个更大的表达式
中,并将更大的条件表达式(a>b?a:b)>c?(a>b?a:c的值赋给了变量ma

b):x。
注意:上述程序的if…else语句采用了紧凑格式。使用C+
+ 
语言的紧凑格式虽然可以
简洁、灵活、方便地编写程序,但是使用紧凑格式要有度。例如: 

ifa bmax=
a
else max=
b
ifc max max=
c


或

cout "Themaxis" 

都是允许的。但以下代码是不允许的: 

cout "Themax
is" max endl
cout "Themaxis" max endl


初学者最好使用规范的格式书写程序,因为程序的可读性是非常重要的,真正的商业程
序是绝对规范的。张三写的程序和李四写的程序格式应大致相同,各种标识符的命名规则
一致,否则大家都看不懂其他人编写的程序。

规范的格式应包括长标识符命名、代码缩进和一对大括号范围不超过一屏幕等。

3.3 
i…else语句的嵌套
2.f
在编程中,有许多问题是一次简单的判断所解决不了的,需要进行多次判断。这时需要
嵌套的if语句,其形式有以下两种。
形式1: 

if测试表达式
1
if测试表达式2 语句
1



else 语句2 
else 
if测试表达式3 语句3 
else 语句4 
形式2: 
if测试表达式1 语句1 
elseif测试表达式2 语句2 
.. 
elseif测试表达式n 语句n 
else 语句n+1 

可以看出,形式1的嵌套分别发生在if和else之后的再选择,形式2的嵌套则仅发生在
else后的再选择。形式2的if…elseif语句的执行流程如图3-3所示,读者可以依此试着画
出形式1的if…else的执行流程图。


图3-3if…elseif语句的执行流程

无论是何种形式,应当注意的是if与else的配对关系,else总是与它上面最近的if配
lsils

对,如果省略了某个ee,f与ee的数目就不一样了,这时为实现程序设计者的意图,有必
要用花括号“{}”括起该层的if语句,以确定层次关系。例如: 

if 

if 语句
1
else 语句
2


其中,花括号({}) 限定了内嵌if语句的范围,因此,这里的else与第一个if配对。
另外,在多层if嵌套中简化逻辑关系是非常重要的。
【例3-2】考试成绩分级。
问题分析:首先输入一个考试成绩(整数), 通过“处理”输出相应的五分制成绩。设90 

分以上为A,80~89 分为B,70~79 分为C,60~69 分为D,60 分以下为E。程序代码如下: 

程序控制结构

55
第
章


C++ 程序设计基础(第2 版) 
5 6 
#include iostream 
usingnamespacestd 
intmain 
intscore 
charresult 
cout "请输入学生百分制成绩 0~100 " 
cin score 
if score =90 
result= 'A' 
else 
if score =80 
result= 'B' 
else 
if score =70 
result= 'C' 
else 
if score =60 
result= 'D' 
else 
result= 'E' 
cout "百分制成绩" score "对应的成绩等级为 " result endl 
return0 
程序运行结果: 
请输入学生百分制成绩 0~100 87. 
百分制成绩87对应的成绩等级为 B 
上述程序是从90分以上为A 开始向下筛选,直到60分以下为E为止。也可以从60 
分以下为E开始向上筛选,直到90分以上为A 为止。相应的程序代码如下: 
.. 
if score 60 
result= 'E' else 
if score 70 
result= 'D' 
else 
if score 80 
result= 'C' 
else 
if score 90 
result= 'B' 
else 
result= 'A' 
..

5 7 
第3章
程序控制结构
3.2.4 多路选择控制语句switch 
如果在算法中需要进行多次判断选择,但都是判断同一个表达式的值,这时就没有必要
在每个嵌套的if语句中都计算一次表达式的值。为此,C++ 中的switch语句专门来解决这
类问题。switch语句的语法形式如下: 
switch 测试表达式 
case 常量表达式1 语句1 
case 常量表达式2 语句2 
.. 
case 常量表达式n 语句n 
default 语句n+1 
switch语句的执行顺序是:首先计算switch语句中的测试表达式的值,然后在case语
句中寻找值相等的常量表达式,并以此为入口标号,开始顺序执行。如果没有找到相等的常
量表达式,则从“default ”开始执行。
使用switch语句时应注意下列问题。
(1)switch后面括号内的“测试表达式”的值只能是整型、字符型、枚举型。例如: 
floatf=4 0 
switch f 错误 测试表达式f的值应该为整型 
.. 
代码中错误地用浮点型作为switch的表达式,将会引起编译错误。
(2)各常量表达式的值不能相同,且次序不影响执行结果。例如,下面的代码中出现相
同的常量值: 
case 'A' cout "thisisA\n" 
case65 cout "thisis65\n" 错误 'A'等值于65 
(3)每条case语句只是一个入口标号,通常只需执行一个case后的语句,因此,每个
case选择的最后应该加break语句,用来结束整个switch结构。否则,将会从入口点开始
一直执行到switch结构的结束点。
(4)当若干选择需要执行相同操作时,可以使多个case选择共用一组语句。
现在用switch语句重做例3-2。程序代码如下: 
#include iostream 
usingnamespacestd 
intmain 
intscore 
charresult 
cout "请输入学生百分制成绩 0~100 " 
cin score 

C++ 程序设计基础(第2 版) 
5 8 
switch score 10 
case10 
result= 'A' 
case9 
result= 'A' 
break 
case8 
result= 'B' 
break 
case7 
result= 'C' 
break 
case6 
result= 'D' 
break 
default 
result= 'E' 
cout "百分制成绩" score "对应的成绩等级为 " result endl 
return0 
程序运行结果: 
请输入学生百分制成绩 0~100 95. 
百分制成绩95对应的成绩等级为 A 
上述程序中,用score/10作为switch语句的测试表达式,score是整型,所以score/10 
的结果默认取整。例如,当成绩score为95时,score/10=9,与case9相匹配,因此,执行其
后的顺序语句系列“result= 'A';”和“break;”,之后跳出switch语句,输出结果。从这段程
序可以看出,使用多路选择控制语句switch进行编程,逻辑关系更加清晰,程序可读性也
更强。
3.3 循环控制结构
循环控制结构是C++ 提供的另一种决策方式,它支持程序中需要重复执行的操作。
循环一般分有限次循环和无限循环。有限次循环是指循环次数确定的循环;无限循环
则是指循环次数未知的循环,无限循环的极致就是死循环。死循环是指程序的控制流程一
直在重复运行某一段代码,并且无法退出的情形,在程序设计中要尽量避免死循环的发生。
C++ 中有三种循环控制语句:while,do…while和for语句。下面将一一讨论这些语句
及其使用方法。
3.3.1 while语句
while语句中没有初始化和循环控制变量的更新,只有测试条件和循环体。while语句

的语法形式如下: 

while测试表达式循环体

其中,循环体是一条语句或由花括号({}) 括起来的复合语句。
while语句的执行流程如图3-4所示,具体执行顺序如下。

(1)首先判断测试表达式的值是否为true,以此决定是否
应当进入和执行循环体。
(2)如果测试表达式的值为fe,结束循环;如果测试表
达式的值为true,则执行循环体。
als
(3)返回(1), 对测试表达式进行重新计算和评估,以决定
是否继续循环。图3-4 while语句的执行流程
应用while语句构成循环时应特别注意:如果希望循环
最终可以结束,循环体中的代码必须完成某种可以影响测试
表达式取值为false的操作,否则便会造成死循环。
【例3-3】求自然数1~100 之和。
问题分析:本例题需要用累加操作,累加操作是一个典型的循环过程,可以用while语
句实现。程序代码如下: 

#includeiostream
usingnamespacestd
intmain



inti=1sum=
0
whilei =100


sum+=
i
i+
+


cout "sum=" sum endl
return0


程序运行结果: 

sum=5050 

上述程序中,累加操作被控制执行100 次。这里变量i是关键,它控制了循环的次数, 
因此i被称为循环控制变量。循环控制变量一般在while语句之前定义且赋初值,本例题为
循环控制变量i赋初值1,循环的测试表达式为i=100,循环体中包含了i+
+ 
,这样每执行
一次循环体,循环控制变量i的值都加1,以此影响循环测试表达式的值。在循环100 次之
前(包括第100 次),但测试表达式i=100 的值一直为true,循环继续;当循

i虽然每次加1,
i值加1后变为101,


环100 次之后,这时测试表达式i=100 的值变为false,循环结束。
上述程序中的代码段: 

59
第

whilei =100 

3 

章

程序控制结构


C+
+ 
程序设计基础(第2版) 

sum+=i 
i+
+ 

还可以用以下更简洁的代码替代:

60
whilei =100
sum+=i+
+


控制循环次数是实现有限次循环,是初学者必须掌握的编程技巧。读者可以想想,例3-3 
中,同样是实现循环100 次,程序代码还可以怎样编写? 

3.2 
d…while语句
3.o
do…while语句结构使循环至少执行一次。do…while语句的语法形式如下: 

do 循环
体
while测试表达
式


do…while语句的执行流程如图3-5所示,其具体的执行顺序为:当程序流程执行到do 
时,立即执行循环体,与while语句一样,循环体由一条语句或花括号({}) 定义的语句块组
成,然后判断测试表达式的值。当测试表达式的值为true时,继续执行循环体;当测试表达
式的值为false时,结束循环。

现在用do…while重做例3-3,程序代码如下: 

#includeiostream
usingnamespacestd
intmain



inti=1sum=0 

do
sum+=
i
i+
+


whilei =100
cout "sum=" sum endl
return0


同while语句一样,一般在do…while语句之前也需要定义一个循环控制变量且赋初
值(如上述程序中的变量i), 且在循环的测试表达式中包含该循环控制变量,并配合在循环
体中包含类似i+
+ 
这样的操作更新循环控制变量的值,以此影响循环测试表达式的值,用于
决定循环是否结束。

do…while与while语句都可以实现循环控制结构,两者的区别是:while语句先判断
测试表达式的值,值为true时,再执行循环体;而do…while语句是先执行循环体,再判断
测试表达式的值。在大多数情况下,如果循环控制条件和循环体中的语句都相同,while语
句和do…while语句的结果是相同的。但是如果开始时循环测试表达式的值就为false,那
么这两种循环的执行结果就不同了,do…while语句至少执行一次循环体,while语句却一
次都不执行。

图3-5 do…while语句
执行流程

图3-6 for语句的执行流程
在例3-i1i 100i+
+ 
三者联合
, 
i0i100 

3中,=
i+
+ 
也可以实现循环100 次
=
。同理,=
实现了循环100 
=
次。
i
其实,=

i100i 0i--和i=99i 0;--都可以实现循环
100 次。

由此可见,循环控制的实现与程序中循环控制变量初始化、循环结束条件和循环控制
变
量更新三者紧密相关,它们是控制有限次循环的关键。因此,循环控制变量初始化、循环
结
束条件和循环控制变量更新被称为有限次循环的三要素
。


3.3 
fr语句
3.o
for语句的使用最为灵活,它将有限次循环的三要素,即循环控制变量初始化、循环结束
条件和循环控制变量更新集中描述,使得程序既精炼又可读。for语句的语法形式如下: 

for 
初始化表达式测试表达式更新表达
式
循环
体


for语句的执行流程如图3-6所示,其具体的执行顺序

如下
(
。
1)求解初始化表达式的值。

(2)计算测试表达式的值,并判断是否为true,以此决
定
是否进入和执行循环体
。
(3)如果测试表达式的值为false,则退出循环;如果测试
表达式的值为true,则执行一次循环体。
(4)求解更新表达式的值。
循环
(
。
5)转回(2), 判断测试表达式,以决定是否继续执行
现在用for语句重做例3-3,程序代码如下: 

#includeiostream
usingnamespacestd
intmain



intisum=
0
fori=1i =100i+
+


sum+=i 

cout "sum=" sum endl
return0


关于for语句有以下几点需要特别说明。

(1)更新表达式用于改变循环控制条件,为了遍历数据,一般设置本次循环与下次循环
间的步长为1,如i+
+ 
。步长也可以根据需要设定为大于1的整数,如i=i+2 和i=i+10 分
别表示步长为2和10 。
(2)for语句中,测试表达式是循环控制条件,所以一般不能省略。如果省略,将会出现

程序控制结构

61
第
章


62
C+
+ 
程序设计基础(第2版) 

死循环。

(3)初始化表达式和更新表达式在一定条件下可以省略,并可以是任何表达式。例如, 
可以将上述程序中有关循环的代码缩写成如下形式: 
forsum=0i=1i =100 sum+=i+
+ 

这里的for语句中省略了更新表达式,但前面的分号(;) 不能随之省略,另外初始化表达式
为逗号表达式,除了给循环变量初始化为1之外,还为存取求和结果的变量sum 进行清零。
没有最好,只有更好,不断地优化、精简程序可以提高编程水平,相信有一天,你会突然
发现自己编写的程序越来越专业了。

3.4 
循环嵌套
3.
如果程序要解决更大的问题,实现更复杂的算法,单循环是远远不够的。在很多情况下
需要循环嵌套,即一个循环体内包含另一个完整的循环结构,构成多重循环。while、for和
do…while三种循环语句可以自己嵌套或互相嵌套,但要求内循环必须被完全包含在外循
环的循环体中。

【例3-4】输出九九乘法表。

×123456789 

1123456789 
2 2 4 6 8 1012141618 
3 3 6 9 121518212427 
4 4 8 12162024243236 
5 5 1015202530354045 
6 6 1218243036424854 
7 7 1421283542495663 
8 8 1624324048566472 
9 9 1827364554637281 

问题分析:九九乘法表是一个二维表,在屏幕上输出九九乘法表相当于从上到下、从左

到右,如扫描一般输出内容。其中,从上到下是输出每一行,从左到右是输出一行中的每一

列。因此,需要构成双重循环,外循环控制行,内循环控制列。程序代码如下: 

#includeiostream 


usingnamespacestd 

intmain 

intij 

cout "*\t"
fori=1i =9i+
+
cout i"\t"


cout "\n---------------------------------" 
"------------------------------------------\n(") 


fori=1i =9i+
+ 

cout i"\t"
forj=1j=9j+
+
cout i*j"\t"
cout endl


return0 

上述程序中
j,fori=1i 


=9;i+
+ 
{…} 是外循环,从第1行开始“遍历”每一行; 
forj=1j=9;+
+ 
{…} 是内循环,被完全包含在外循环体中,它是外循环体的一部分,对
第i行,从第1列开始“遍历”每一列。
如果想输出如下所示的九九乘法表,上述程序需要怎样修改呢? 

×123456789 

1 1 
2 2 4 
3 3 6 9 
4 4 8 12 16 

55 10152025 
66 1218243036 
77 142128354249 
88 16243240485664 
99 1827364554637281 

这时,上述程序基本保持不变,只需将程序中内循环用如下代码替换即可: 

forj=1j=ij+
+ 
cout i*j"\t" 

3.程序控制进阶
4 

在比较复杂的程序设计中,顺序、选择和循环通常是混合应用的,三种控制结构中,比较
难掌握的是循环控制。

下面首先介绍在选择和循环中常用的三个控制语句,之后再讲解如何通过输入信息控

制循环。

3.1 
其他控制语句
4.
1.break语句
break语句只用于switch语句或循环体中,其作用是使程序从switch语句内跳出或结
束循环,继续执行逻辑上的下一条语句。

2.continue语句
continue语句仅用于循环体中,其作用是结束本次循环,接着开始判断循环条件,决定


63
第
章

程序控制结构


C++ 程序设计基础(第2 版) 
6 4 
是否继续执行下一次循环。
在实际的程序设计中,break和continue语句应用得比较多,为了更好地理解break和
continue语句在控制循环中的作用和区别,我们将循环比作在操场上跑圈,循环10次就
是跑10圈,每跑完一圈计数器加1。假如你现在跑到第5圈的一半,此时因为某种原因, 
触发了执行break语句的条件,这时意味着剩下的4圈半你不需要再跑了;如果触发的是
执行continue的条件,则意味着第5圈剩下的半圈不用跑,但你还需要从第6圈开始继
续跑。
灵活运用break和continue语句可以实现一些特殊功能,使程序运行时更“智能”。
下面对考试成绩分级程序进行修改,使之可以多次输入成绩,并进行成绩分级处理,直
到输入-1时,结束程序。注意程序中while、break和continue语句的使用。程序代码
如下: 
#include iostream 
usingnamespacestd 
intmain 
intscore 
charresult 
while true 
cout "请输入学生百分制成绩 0~100 输入-1结束 " 
cin score 
if score==-1 
break 
if score 0||score 100 
cout "输入学生百分制成绩有错 请重新输入 " endl 
continue 
switch score 10 
case10 
case9 
result= 'A' 
break 
case8 
result= 'B' 
break 
case7 
result= 'C' 
break 
case6 
result= 'D' 
break 
default 
result= 'E' 
cout "百分制成绩" score "对应的成绩等级为 "

result endl 
return0 

上述程序用whe(e){} 构建一个无限循环,在此循环内,首先用if简单语句判断输
入的成绩score是否等于-1,如果等于-1,则执行break语句结束循环。之所以用-1,是
因为-1不可能是一个成绩的值。之后,通过另一个if简单语句判断输入的成绩是否为0~ 
100,如果不是,则显示“输入学生百分制成绩有错请重新输入!”,并执行continue语句退
出本次循环,并开始下一次循环。重新输入成绩,如果输入的成绩为0~100,则继续执行下
面的switch语句,对成绩进行多分支处理。运行这段程序可实现多次输入成绩,并完成成
绩分级,直到输入-1,结束程序。

iltru

3.goto语句
goto语句的作用是使程序的执行流程跳转到语句标号所指定的语句。goto的语法形式
如下: 


语句标号
goto 


其中,“语句标号”是用来表示语句的标识符,放在语句的最前面,并用冒号“” 与语句分开。
例如,上述程序中的continue语句就可以用goto语句替代,程序代码如下: 

..
whiletrue


a1 

cout "请输入学生百分制成绩0~100输入-1结束" 

cin score 

ifscore==-1 

break 

ifscore0||score100 

cout"输入学生百分制成绩有错请重新输入" endl
gotoa1


.. 

.. 

程序段中的a1为标识符,1表示转至a

输入-1结束)"处。
gotoa1cout"请输入学生百分制成绩(0~100 

【例3-5】一元二次方程求解。
问题分析:对于一元二次方程a系数a不能为0,否则需要重新输入系
数。程序代码如下: 
x2+bx+c=0, 

#include iostream 
#include mathh 第
usingnamespacestd 
3 
intmain 章

程序控制结构


66
C+
+ 
程序设计基础(第2版) 

doubleabcdx1x2
cout "一元二次方程ax*x+bx+c=0\n请输入系数abc"
n1cin a b 
c
ifa==
0


cout "请重新输入系数abc"
goton1


else 

d=b*b-4*a*
c
ifd =
0


x1= -b+sqrtd 2*
a
x2= -b-sqrtd 2*
a
cout "x1=" x1 endl
cout "x2=" x2 endl


else
cout"此方程无解\n"


return0 

程序运行结果1: 

一元二次方程ax*x+bx+c=
0
请输入系数abc156
X1=-
2
X2=-
3


程序运行结果2: 

一元二次方程ax*x+bx+c=
0
请输入系数abc123
此方程无
解


注意:goto语句的使用会破坏程序的结构,应该少使用或不用。

3.2 
输入信息控制循环
4.
输入信息控制循环通常控制的是无限循环,无限循环是循环次数不确定的循环。当遇
到利用条件反复判断确定何时结束任务的时候,借助构建无限循环和跳出循环的方法,可以
有效地避免死循环,这样做的好处是比传统的解决方法编写的代码精简且容易理解。

通常采用while或do…while语句构建无限循环,在循环体内输入信息,并通过循环控
制语句的测试表达式确定是否跳出循环,以实现输入信息控制循环的目的。
【例3-6】统计输入的字符数。

#includeiostream
usingnamespacestd




6 7 
第3章
程序控制结构
intmain 
charch 
intcount=0 
cout "输入字符串 以#结束 " 
while true 
cin ch 
if ch== '# ' 
break 
count++ 
cout "共输入" count "个字符。" endl 
return0 
程序运行结果: 
输入字符串 以#结束 abcdefg# 
共输入7个字符。
上述程序中,while语句的测试表达式为true,也就是循环条件始终满足,如果没有其他
干预,循环将不停地继续,不会自动结束。所以在循环体中,用cin输入的单字符ch控制循
环是否结束。当输入非'# '字符时,选择语句if的测试表达式ch== ' # ' 的值为false,计数
变量count加1,并继续循环。再次输入单字符,直到输入'# '字符,选择语句if的测试表达
式ch== '# '的值变为true,这时执行break语句,跳出循环。
以下的程序代码同样可以实现统计输入字符数的功能,注意观察与前者的区别。 
#include iostream 
usingnamespacestd 
intmain 
charch 
intcount=0 
cout "输入字符串 以#结束 " 
cin ch 循环外输入 
while ch = '# ' 以ch = '# '作为循环结束条件 
count++ 
cin ch 
cout "共输入" count "个字符 " endl 
return0 
这段程序中,巧妙地用ch!= '# '作为while语句的测试表达式。在while之前首先用
cin输入单字符,当输入非'# '字符时,测试表达式ch!= ' # ' 的值为true,进入循环体,计数
变量count加1,再次输入单字符,并继续循环,直到输入'# '字符,测试表达式ch!= ' # ' 的
值变为false,结束循环。

68
C+
+ 
程序设计基础(第2版) 

3.程序控制综合编程案例
5 

【例3-7】输入一个年份,判断是否为闰年。

问题分析:闰年的年份可以被4整除而不能被100 整除,或者能被400 整除。因此,首
先输入年份存放到变量year中,如果表达式year%4==0&&year%100=0‖ year%400 
==0)) 的值为true,则为闰年,否则就不是闰年。程序代码如下: 

#includeiostream
usingnamespacestd
intmain



intyear
boolIsLeapYear
cout "Inputayear"
cin year
IsLeapYear= year%4==0&&year%100=0||year%400==
0
ifIsLeapYear


cout year "isleapyear" endl
else
cout year "isnotleapyear" endl
return0


程序运行结果: 

Inputayear2000
2000isaleapyear


【例3-8】计算相应图形的面积
。
问题分析:首先需要构造如下的菜单
。


图形类型
:
1-圆
形
2-长方
形
3-正方
形
请输入你的选择(1~3)
:


然后,通过cin键盘输入1~3中的任意整数作为选项,之后再通过多路选择控制语句
switch根据选项选择不同的图形,并计算相应图形的面积。程序代码如下: 

#includeiostream
usingnamespacestd
constdoublePI=31416
intmain



intiType 
doubleradiusabarea 
cout "图形类型\n1-圆形\n2-长方形\n3-正方形\n请输入你的选择1~3" 


cin iType
switchiType


case1 

cout "\n圆的半径为
"
cin radius
area=PI*radius*radius
cout"面积为" area endl


break 

case2
cout "\n矩形的长为
"
cin 
a
cout "矩形的宽为
"
cin 
b
area=a*
b
cout"面积为" area endl
break


case3 

cout "\n正方形的边长为
"
cin 
a
area=a*
a
cout"面积为" area endl


break
default
cout "\n不是合法的输入值" endl


return0 

程序运行结果: 

图形类
型
1-圆
形
2-长方
形
3-正方
形


请输入你的选择1~31 

圆的半径为
2
面积为125664


【例3-9】求水仙花数。如果一个三位整数的个位数、十位数和百位数的立方和等于
该数自身,则称该数为水仙花数。

问题分析:要求在100~999 内寻找水仙花数,所以必须对这个范围内所有的数据进行
一一检验,看是否符合水仙花数的条件。而判断一个三位整数是否为水仙花数的关键是得
到这个整数n的百位数、十位数和个位数,假设i为其百位数、j为其十位数、k为其个位
数,则: 

i=n100
j=n10%10
k=n%10


69
第
章

程序控制结构


C++ 程序设计基础(第2 版) 
7 0 
显然,这是一个确定循环次数的循环,故可以使用for语句。程序代码如下: 
#include iostream 
usingnamespacestd 
intmain 
intn i j k 
for n=100 n =999 n=n+1 
i=n 100 取出n的百位数 
j= n 10 %10 取出n的十位数 
k=n%10 取出n的个位数 
if n==i*i*i+j*j*j+k*k*k 
cout n "=" 
i "ù3+" 
j "ù3+" 
k "ù3\n" 
return0 
程序运行结果: 
153=1ù3+5ù3+3ù3 
370=3ù3+7ù3+0ù3 
371=3ù3+7ù3+1ù3 
407=4ù3+0ù3+7ù3 
【例3-10】 输出图形: 
A 
A A 
A B A 
A B B A 
A B B B A 
A B B A 
A B A 
A A 
A 
问题分析:在打印机和屏幕上输出二维图形,就像“扫描”一样,从左到右、从上到下输
出图形,所以一般都需要用到循环嵌套,外循环控制行,内循环控制列。程序代码如下: 
#include iostream 
#include iomanip 
usingnamespacestd 
constintN=4 
intmain 
intk n i j 
do