在程序设计中,流程控制是指导程序如何按照预定逻辑执行
的关键机制,它决定了程序中各个语句或代码块的执行顺序。流程
控制语句是用来实现流程控制的编程语言构造。控制结构则是这些
语句所组成的逻辑框架,它们定义了程序执行的基本模式。C++语
言提供了3种基本的控制结构:顺序结构、分支结构(或称选择结构)
和循环结构。本章将对实现C++程序基本控制结构的各种相关语
句进行详细介绍。本章涉及的知识点如下: 

70 
循序渐进C++案例教程(微课视频版) 


3.程序流程的描述
1 


3.1 
程序流程的描述方式
1.
在C++语言中有五种常用的程序流程描述方式:自然语言、传统流程图、N-S流程图、
伪代码和程序设计语言。

1. 
自然语言
计算机程序是为了完成某项任务、解决某个问题而要求计算机执行的一系列指令(步
骤)。如果操作步骤都是顺序执行的,那么用自然语言描述比较直观且容易理解。比如案例
3中计算泳池栏杆造价用自然语言描述为:先输入泳池的半径,计算泳池的周长,然后用栏
杆单价乘以泳池的周长,计算出泳池周围栏杆的造价,最后输出计算结果。显然,自然语言
可以把操作步骤说明得很清晰。但是,如果程序中包含了分支结构和循环结构,并且执行步
骤较多,使用自然语言描述就会显得不那么清晰明了。

2. 
传统流程图
1所示)、
执行步骤,控制语句的执行顺序,是程序分析和过程描述的基本方式。这种方法能够克服复
杂程序用自然语言描述不直观的缺点。

传统流程图是用一系列特定图形符号(如表3.流向线和文字说明描述程序的

表3.传统流程图常用的特定图形符号

1 

序号图形符号名称含义
1 起止框程序的开始或结束
2 处理框数据的各种处理和运算操作过程
3 输入/输出框数据的输入和结果的输出
4 注释框添加程序注释
5 流向线程序的执行路径
6 判断框根据条件的不同,选择不同的操作
7 连接点
转向流程图的其他位置或从其他位置
转入

三种基本程序流程结构为:顺序结构、分支结构(单分支、二分支、多分支)和循环结构。
循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序段称为循环体。
三种基本结构可以用传统流程图明晰地表达,如图3.6所示。

1~图3.


第3章流程控制语句71 


图3.顺序结构图3.单分支结构图3.二分支结构

12 3 


图3.多分支结构

4 


图3.当型循环结构图3.直到型循环结构

56 

当型循环结构是指若条件满足时执行循环体语句;若条件不满足时,退出循环,执行循
环体后面的语句。直到型循环结构是指先执行循环体语句块,如果条件满足,就继续执行循
环体语句块,直到条件不满足的时候退出循环。

3.N-S流程图
N-S流程图又叫盒图,是美国学者I.Nasi和B.Shneiderman提出的一种在流程图中


72 
循序渐进C++案例教程(微课视频版) 

完全去掉流向线的图,将全部程序写在一个矩形框内,从而避免在描述大型复杂算法时,图
中的流向线较多,影响用户对程序的阅读和理解。N-S流程图使用矩形框来表达各种处理
步骤。顺序结构、分支结构及循环结构的N-7~图3.

S流程图如图3.12 所示。


图3.顺序结构图3.单分支结构图3.二分支结构

78 9 


图3.多分支结构

10 


图3.当型循环结构图3.直到型循环结构

11 
12 

4. 
伪代码
伪代码是在更简洁的自然语言描述中,用程序设计语言的流程控制结构来表示处理步
骤的执行流程,用自然语言和各种符号来表示所进行的各种处理及所涉及的数据。它是介
于程序代码和自然语言之间的一种描述方法。这样描述的程序书写紧凑、自由,在表达分支
结构和循环结构时易于理解,同时也更有利于流程向程序的转换。顺序结构、分支结构及循
环结构的伪代码描述形式如图3.~图3.

1318 所示。


图3.顺序结构图3.单分支结构图3.二分支结构

13 
14 
15 


第3章流程控制语句73 


图3.多分支结构图3.当型循环结构图3.直到型循环结构

16 
17 
18 

5. 
程序设计语言
程序最终是需要在计算机上运行的,因此程序设计语言是程序的最终描述形式。无论
用何种方法描述,都是为了将其更方便地转化为计算机程序。

3.2 
判断素数的程序流程描述
1.
1. 
素数的定义
素数也称为质数,指的是在大于数字1的自然数中,除了可以被数字1以及该数字本身
整除之外,再也不能够被其他任何自然数整除的数。如果还可以被其他自然数整除,则称该
自然数为合数。

2. 
自然语言描述
【例3.给定任务:判断一个自然数n是否是素数(

1】n>=2)。试用不同的程序流程

描述方式进行描述。
步骤1:输入n的值。
步骤2:设置变量i的值为2。
步骤3:求解r=n%i;若r=0则转向步骤6,否则执行步骤4。
步骤4:变量i的值自加1。
步骤5:判断i<n 是否成立;若为真则转向步骤3,否则执行步骤6。
步骤6:判断i<n 是否成立;若为真则输出“合数”,否则输出“素数”。

3. 
用传统流程图描述
判断一个数n是否是素数(n>=2), 如图3.

19 所示。

4. 
用N-S流程图描述
判断一个数n是否是素数(n>=2), 如图3.

20 所示。



循序渐进C++案例教程(微课视74 频版) 
图3.19 判断素数的传统流程图 
图3.20 判断素数N-S流程图
5.用伪代码描述
判断自然数n是否为素数的伪代码描述如下: 
input n; 
i 置为2; 
while(i<n) 
{ 
r=n/i 的余数; 
if(r=0) 
break; 
else 
i= i+1; 
}i
f(i<n) 
output "n 是合数"; 
else 
output "n 是素数"; 
6.C++语言写出程序
判断自然数n是否为素数的C++语言代码描述如下: 
#include<iostream> 
using namespace std; 
int main()

第3章 流程控制语句7 5 
{ 
int n,i,r; 
cout<<"输入大于或等于2 的自然数n:"; 
cin>>n; //输入n 
i=2; 
while(i<n) 
{ 
r=n%i; 
if(r==0) 
break; 
else 
i++; 
} 
if(i<n) 
cout<<n<<"是合数"<<endl; / /输出n 是合数 
else 
cout<<n<<"是素数"<<endl; / /输出n 是素数
}
【思考与练习】
1.简答题 
(1)写出传统流程图中常用的特定图形符号,并说明其意义。
(2)分别用自然语言、传统流程图、N-S流程图、伪代码描述下面程序的执行过程: 
输出1000以内的完全平方数,并要求每行输出6个数。完全平方数指的是一个整数可以
等于另一个整数的平方。例如1=1×1,4=2×2,9=3×3等,以此类推。若一个数能表示成
某个整数的平方的形式,则称这个数为完全平方数,那么1、4、9、16、……就是完全平方数。
2.写程序功能
(1)图3.21为一个程序的传统流程图,写出它所表示的函数。
(2)图3.22为一个程序的传统流程图,写出程序的功能。
图3.21 程序的传统流程图(一) 图3.22 程序的传统流程图(二)

循序渐进C++案例教程(微课视76 频版) 
3.2 案例7———阶梯水价
3.2.1 问题描述及程序代码
1.问题描述 
“阶梯水价”是对自来水用户实行分类计量收费和超定额后累进加价制的俗称。“阶梯
水价”充分发挥了市场、价格因素在水资源配置、水需求调节等方面的作用。2020年唐山居
民生活年用水量价格标准如下。
第一阶梯:0~120(含)m3,水价为5元/m3(其中,水费为3.5元/m3,污水处理费为1.5 
元/m3)。
第二阶梯:120~180(含)m3,水价为6.75元/m3(其中,水费为5.25元/m3,污水处理费为
1.5元/m3)。
第三阶梯:180m3 以上,水价为12元/m3(其中,水费为10.5元/m3,污水处理费为1.5元/ 
m3)。题目要求编写程序,输入某居民用户2020年的用水量,输出该用户本年度应缴费
金额。
2.程序代码 
#include<iostream> 
using namespace std; 
int main() 
{ 
const float price1=5.0; //第一阶梯单价 
const float price2=6.75; //第二阶梯单价 
const float price3=12; //第三阶梯单价 
float bound1=120*price1; //第二阶梯用水量的基数 
float bound2=120*price1+(180-120) *price2; //第三阶梯用水量的基数 
float cons; //年度用水量 
float total; //缴费金额 
cout<<"请输入本年度用水量: "; 
cin>>cons; 
if(cons<=120) //如果小于或等于120 立方米 
total=price1*cons; //第一阶梯单价×用水量 
//120 立方米以内的单价属于第一阶梯单价,超出部分为第二阶梯单价 
else if(cons<=180) //用水量在第二阶梯 
total=bound1+(cons-120)*price2; 
//120 立方米以内的单价属于第一阶梯单价,120~180 立方米的单价属于第二阶梯单价 
//超出180 立方米的属于第三阶梯单价 
else total=bound2+(cons-180)*price3; 
cout<<"您本年度需要缴费: "<<total<<"元"<<endl; // 输 出计算结果
}

第3章 流程控制语句7 7 
3.程序分析及运行结果
本程序根据输入用水量的多少计算缴费金额,因为用水量不同,水的单价也不一样,所
以程序采用分支结构,使用条件语句完成。在C++语言中分支结构的语句有两种,一种是
条件语句,即if语句;另一种是开关语句,即switch语句。它们都可以用来实现多分支结
构。分支结构具有一定的语句控制能力,可以根据输入的数据和给定的条件来决定执行哪
些语句,不执行哪些语句。就像本案例一样,给定了三个条件,输入的数据满足不同的条件, 
就用到不同的计算公式。
3.2.2 条件语句
1.条件语句的语法格式 
条件语句的一般格式如下: 
if(条件1) 
语句块1; 
else if(条件2) 
语句块2; 
else if(条件3) 
语句块3; 
…… 
else if(条件n) 
语句块n; 
else 
语句块n+1; 
if、elseif和else是关键字,条件1、条件2、条件3、……、条件n是表达式,既可以是关系
表达式、逻辑表达式,也可以是其他表达式。语句块1、语句块2、语句块3、……、语句块n、语
句块n+1,每个语句块既可以是一条语句,也可以是用花括号“{}”括起来的多条语句。用
花括号“{}”括起来的多条语句也叫复合语句,复合语句在语法上相当于一条语句,执行的时
候会把复合语句每一条语句都执行完成。复合语句内可以有声明语句,有声明语句的复合
语句叫分程序或语句块。语句块通常可以作为if体、else体或循环体语句。
在条件语句中,至少有一个if条件,elseif可以有零个、一个或多个,else可以有零个或
一个。如果elseif和else都省略,那么这种条件语句就是单分支语句。
2.单分支
单分支的语句形式: 
if(条件表达式) 语句块1; 
其传统流程图如图3.2所示。
【例3.2】 编写程序完成输入一个正整数n,输出n的所有因数(当整数a除以整数b(b 
≠0)的商为c,c正好是整数,余数为0时,就说b是a的因数)。比如数据n的值是30,那么

循序渐进C++案例教程(微课视78 频版) 
1、2、3、5、6、10、15和30都是30的因数,本案例用单分支结构完成。直观地理解,若是因数
的时候输出因数,否则就不需要处理,流程图描述如图3.23所示。
图3.23 输出正整数n的因数流程图
程序代码如下: 
#include<iostream> 
using namespace std; 
int main() 
{ 
int n; 
cout<<"请输入一个整数:"; 
cin>>n; 
for(int i=1;i<=n;i++) 
if(n%i==0) 
cout<<i<<"\t"; 
cout<<endl; 
return 0; 
} 
3.二分支
二分支的语句形式: 
if(条件表达式) 
语句块1; 
else 
语句块2; 
其传统流程图如图3.3所示。

第3章 流程控制语句7 9 
【例3.3】 当学生用户登录学生基本信息管理系统时,需要验证用户名和登录密码。如
果用户名和密码都正确,进入系统,显示“登录成功!”提示信息。若两者有一个不正确,则不
能进入系统,且显示器上提示“用户名或密码错误!”。
说明:本案例属于二分支结构程序。假设用户名是“Feng”,密码是“PPNN13mod”(网
上看到的一个很文艺的密码PPNN13moddkstFeb1,这一大串字符看似很晕,实际是杜牧的
一句诗,“娉娉袅袅十三余,豆蔻梢头二月初。”这个程序员是不是很有诗情画意? 暂且借用
这个密码)。
本程序定义字符串使用字符数组,对于字符串的比较使用strcmp函数,判断用户名正
确且密码正确,使用逻辑与运算符。程序代码如下: 
#include<iostream> 
#include <string.h> 
using namespace std; 
int main() 
{ 
char userName[30]; //用户名 
char pass[30]; //密码 
cout<<"请输入用户名: "; 
cin>>userName; //输入用户名 
cout<<"请输入密码: "; 
cin>>pass; //输入密码 
//下面判断如果用户名是"Feng"并且密码是"PPNN13mod" 
if(!strcmp(userName,"Feng")&&!strcmp(pass,"PPNN13mod")) 
cout<<"登录成功!"; 
else //任何一个不正确 
cout<<"用户名或密码错误!"; 
return 0; 
}
因为根据上面程序的条件不能确切知道到底是用户名错误还是密码错误,现在对该代
码进行修改。在二分支语句中嵌套了二分支语句,首先判断用户名是否正确,如果用户名正
确,再看密码是否正确,只有二者都正确的情况下,才会提示“登录成功!”。 
if(!strcmp(userName,"Feng")) //用户名正确 
if(!strcmp(pass,"PPNN13mod")) //密码正确 
cout<<"登录成功!"; 
else //密码不正确 
cout<<"用户密码错误!"; 
else //用户名不正确 
cout<<"用户名错误!"; 
分支嵌套说明:在分支嵌套中需要注意else子句如何与if子句的匹配问题。
【例3.4】 if子句和else子句的匹配问题。 
if(x>0) 
if(x < 50) 
cout<<"OK!\n"; 
else 
cout<<"NOT OK!\n";

循序渐进C++案例教程(微课视80 频版) 
阅读本段代码,else子句前面有两个if子句,这种情况下,else子句到底与哪个if子句
匹配呢? 记住else子句从属于最近的if子句,本案例中else子句和第二个if子句匹配。如
果想让else子句与第一个if子句匹配,应用加花括号{}来实现,修改如下: 
if(x>0) 
{ 
if(x < 50) 
cout<<" x is OK\n"; 
}e
lse 
cout<<" x is not OK\n"; 
4.多分支
多分支结构的传统流程图如图3.4所示。多分支语句里至少有一个elseif关键字,是
在同一个表达式可能有多个选择的情况下,根据条件选择执行不同的语句块。案例7就是
根据用水量的多少,有三种计算缴费的标准,所以这是三分支语句,有时候可能有更多的
分支。
【例3.5】 输入一个百分制的学生成绩score,请把百分制成绩转换成五分制的字符,转
换规则如下: 
如果输入的成绩不是0~100分,则输出“成绩无效”;否则,若成绩在60分以下则输出
“E”;若成绩大于或等于60分且小于70分则输出“D”;若成绩大于或等于70分且小于80 
分则输出“C”;若成绩大于或等于80分且小于90分则输出“B”;若成绩大于或等于90分且
小于或等于100分则输出“A”。程序传统流程图如图3.24所示。
图3.24 百分制转换五分制流程图
根据画好的传统流程图,再写程序代码就会感觉简单多了,代码如下: 
#include<iostream> 
using namespace std; 
int main() 
{

第3章 流程控制语句8 1 
int score; //声明成绩变量 
cout<<"请输入学生成绩[0~100]"; //提示信息 
cin>>score; //输入语句 
if(score<0||score>100) 
cout<<"成绩无效! \n"; 
else if(score<60) 
cout<<"E\n"; 
else if(score<70) 
cout<<"D\n"; 
else if(score<80) 
cout<<"C\n"; 
else if(score<90) 
cout<<"B\n"; 
else 
cout<<"A\n"; 
return 0; 
}
多分支语句中含有多个elseif子句,从代码上看程序的可读性较差,通常多分支语句可
以转换成开关语句,即用switch语句完成。
【思考与练习】
1.简答题 
(1)else子句如何与if子句相匹配? 
(2)分别用单分支结构、二分支结构和多分支结构写一个程序。
2.单选题
(1)有语句
int a=1,b=2,c=3; 
if(a>c) 
b=a; a=c; c=b; 
则c的值为( )。
A.1 B.2 C.3 D.不一定
(2)条件语句的格式: 
if(条件表达式) 语句块1; 
else 语句块2; 
其中“条件表达式”( )。
A.是关系表达式 B.必须是逻辑表达式
C.必须是关系表达式或逻辑表达式 D.可以是任何合法的表达式

循序渐进C++案例教程(微课视82 频版) 
3.程序分析
(1)写出运行结果。 
int a=4,b=3,c=5,t=0; 
if(a<b)t=a;a=b;b=t; 
if(a<c)t=a;a=c;c=t; 
cout<<a<<b<<c; 
(2)写出运行结果。 
int a=4,b=3,c=5,t=0; 
if(a<b){t=a;a=b;b=t;} 
if(a<c){t=a;a=c;c=t;} 
cout<<a<<b<<c; 
3.3 案例8———车牌查询
3.3.1 问题描述及程序代码
1.问题描述 
车牌是标识车辆身份的号牌,车的车牌号就像人的身份证号一样,其主要作用是通过车
牌号可以知道该车辆的所属地区。车牌号的第一个字符是汉字表示省或直辖市,比如河北
省是冀、河南省是豫、北京市是京等。汉字后面第一个字母表示本省的省辖市,河北省车牌
号的第一个字母代表的城市如下:A—石家庄市,B—唐山市,C—秦皇岛市,D—邯郸市, 
E—邢台市,F—保定市,G—张家口市,H—承德市,J—沧州市,R—廊坊市,T—衡水市。现
在输入河北省的车牌号,输出该车辆所属的城市。
2.程序代码 
#include <iostream> 
using namespace std; 
int main() 
{ 
char vlpn[10]; //车牌号码 
cout<<"请输入车牌号码:"; //提示信息 
cin>>vlpn; 
char letter; //第一个字母 
letter=vlpn[0]; 
switch(letter) 
{ 
case 'A': cout<<"石家庄市\n"; break; 
case 'B': cout<<"唐山市\n"; break; 
case 'C': cout<<"秦皇岛市\n"; break;

第3章 流程控制语句8 3 
case 'D': cout<<"邯郸市\n"; break; 
case 'E': cout<<"邢台市\n"; break; 
case 'F': cout<<"保定市\n"; break; 
case 'G': cout<<"张家口市\n"; break; 
case 'H': cout<<"承德市\n"; break; 
case 'J': cout<<"沧州市\n"; break; 
case 'R': cout<<"廊坊市\n"; break; 
case 'T': cout<<"衡水市\n"; break; 
default: cout<<"不是河北省的车辆! \n"; 
} 
return 0; 
} 
3.程序分析及运行结果
本程序案例仍然使用了多分支结构,是根据车牌号码首字母的不同,执行不同的输出语
句。如果使用条件语句,也完全能够实现此功能,但是会有很多项elseif子句,程序的可读
性较差,这里使用了开关语句,即switch语句,程序代码就很清晰,一目了然。下面介绍开
关语句的语法格式及注意事项。
3.3.2 开关语句
1.开关语句的语法格式 
开关语句具有如下一般格式: 
switch(整数表达式) 
{ 
case 整常量表达式1: 语句序列1; break; 
case 整常量表达式2: 语句序列2; break; 
case 整常量表达式3: 语句序列3; break; 
…… 
case 整常量表达式n: 语句序列n; break; 
default: 语句序列n+1; 
} 
等价于条件语句: 
if(整数表达式==整常量表达式1) 
语句序列1; 
else if(整数表达式==整常量表达式2) 
语句序列2; 
else if(整数表达式==整常量表达式3) 
语句序列3; 
…… 
else if(整数表达式==整常量表达式n) 
语句序列n; 
else 
语句序列n+1;

循序渐进C++案例教程(微课视84 频版) 
开关语句的流程图如图3.25所示。
图3.25 switch语句流程图
根据本案例的问题描述和switch语句的流程图,画出本案例流程图如图3.26所示。
图3.26 车牌查询程序流程图
2.开关语句的几点说明
● switch后面的表达式是整型表达式,一定要含有变量,而case后面的表达式必须是
整型常量表达式,不允许出现变量,字符常量也是整型常量,因为字符类型是整型的
子集。
● 开关语句可以嵌套使用。
● break是转向语句,在case子句中既可以使用break语句跳出switch语句,也可以没
有break语句。如果有break就结束switch语句;如果没有break语句就接着执行
下一个case子句。
● default子句既可以有,也可以没有,并且可以放在switch语句的任何位置。
3.开关语句的应用案例
【例3.6】 使用开关语句编程实现输入年、月、日,输出这一天是本年度的第多少天。 
#include <iostream> 
using namespace std; 
int main() 
{ 
int year,month,day; //年、月、日 
int sumdays; //本月前过了多少天 
int days; //本年度的第多少天 
cout<<"输入年月日: "; //提示信息

第3章 流程控制语句8 5 
cin>>year>>month>>day; //输入年月日 
if(year<0||month<1||month>12||day<0||day>31) //判断日期的有效性 
{ 
cout<<"无效日期! \n"; 
return 0; 
} 
else 
switch(month) 
{ 
case 1:sumdays=0; break; //输入的月份是1 月 
case 2:sumdays=31; break; //2 月 
case 3:sumdays=59; break; //3 月,先按平年计算 
case 4:sumdays=90; break; //4 月 
case 5:sumdays=120; break; //5 月 
case 6:sumdays=151; break; //6 月 
case 7:sumdays=181; break; //7 月 
case 8:sumdays=212; break; //8 月 
case 9:sumdays=243; break; //9 月 
case 10:sumdays=273; break; //10 月 
case 11:sumdays=304; break; //11 月 
case 12:sumdays=334; //12 月最后一个语句不需要break; 
} 
//本月前的天数+日期的日 
days=sumdays+day; 
//下面判断是否闰年,月份是否在3 月以后, 
//如果是闰年并且月份在3 月以后,总天数加1 
//闰年条件: 400 的整数倍或不是整百的数时是4 的整数倍 
if(year%400==0||(year%100!=0&&year%4==0)) //如果是闰年 
if(month>2) //如果月份是2 月以后日期 
days++; //天数加1 
cout<<year<<"年"<<month<<"月"<<day<<"日是本年度的第"<<days<<"天。\n"; 
return 0; 
}
运行程序: 
输入年月日: 2020 12 31 
输出结果: 
2020 年12 月31 日是本年度的第366 天
【思考与练习】
1.单选题 
(1)下列关于开关语句的描述中,( )是正确的。

循序渐进C++案例教程(微课视86 频版) 
A.开关语句中default子句既可以没有,也可以有一个
B.开关语句中的每个语句序列中必须有break语句
C.开关语句中default子句只能放在后面
D.开关语句中case子句后面的表达式是整型表达式
(2)下面有关break语句的描述中,( )是错误的。
A.break语句可用于循环体内,它将退出本重循环
B.break语句可用于开关语句中,它将退出本开关语句
C.break语句可用于if体内,它将退出if语句
D.break语句在一个循环体内可以出现多次
(3)执行以下代码的结果是( )。
int i(5); 
switch(i) 
{ 
case 0: cout<<"0"<<' '; 
default: cout<<"default"<<' '; 
case 1: cout<<"1"<<' '; 
} 
A.屏幕无任何显示 B.default1 
C.default D.0default1 
2.程序分析
分析程序的执行结果。 
#include <iostream> 
using namespace std; 
int main() 
{ 
int a(1),b(6),c(4),d(2); 
switch(a++) 
{ 
case 1:c++;d++; 
case 2:switch(++b) 
{ 
case 7:c++; 
case 8:d++; 
} 
case 3:c++;d++; 
break; 
case 4:c++;d++; 
} 
cout<<c<<','<<endl; 
return 0; 
}

第3章 流程控制语句8 7 
3.4 案例9———猜数小游戏
3.4.1 问题描述及程序代码
1.问题描述 
系统自动生成一个1~20的随机数,游戏玩家猜数,程序根据玩家猜数给出相应的提
示,如果猜的数比生成的随机数大,提示“您猜大了!”;如果猜的数比随机数小,提示“您猜小
了!”;如果猜的数正好是随机数,提示“恭喜您猜对了!”。然后根据所猜次数,程序给出评
价,如果次数少于4次,显示器上提示“太棒了! 只用了x次”;如果次数大于或等于4次小
于8次,程序会提示“加油哦! 用了x次”;如果需要猜测8次以上,提示“运气较差呀! 用了
x次”,x表示实际猜测的次数,直到猜中后游戏结束。
根据问题描述,首先画出传统流程图,如图3.27所示。接着依据流程图转换成程序
代码。
图3.27 猜数小游戏流程图
从流程图中看,程序包含二分支结构和循环结构,可见多种结构之间是可以互相嵌套的。
2.程序代码 
#include <iostream> 
#include <stdlib.h>

循序渐进C++案例教程(微课视88 频版) 
#include <time.h> 
using namespace std; 
int main() 
{ 
srand(time(0)); //设置随机种子 
//生成一个随机数 
int n=rand()%20+1; //闭区间[1,20] 
int m; //声明猜数变量 
int count=1; //计数器 
cout<<"输入一个1~20 的整数:"; 
cin>>m; //输入数据 
while(m!=n) //猜数不正确 
{ //花括号里是循环体 
if(m<n) //猜数小于随机数 
cout<<"您猜小了!"<<endl; 
else //猜数大于随机数 
cout<<"您猜大了!"<<endl; 
cout<<"输入一个[1,20]区间的整数:"; // 提示输入 
cin>>m; //接着猜数 
count++; //计数器增1 
} 
if(count<4) //所猜次数少于4 次 
cout<<"太棒了! 只用了"<<count<<"次就猜对了!"<<endl; 
else if(count<8) //所猜次数大于或等于4 次且小于8 次 
cout<<"加油啊! 用了"<<count<<"次!"<<endl; 
else //所猜次数大于或等于8 次 
cout<<"运气较差呀! 用了"<<count<<"次"<<endl; 
return 0; 
} 
3.程序分析及运行结果
在本程序中,有两个新的知识点。首先介绍如何让系统生成一个随机数,本案例是通过
图3.28 程序执行结果
调用随机数生成函数完成的。其次,输入数据并与系统
生成的随机数进行比较的操作会重复执行,把这些具有
规律性的重复操作的语句称为循环体,能否继续重复, 
取决于循环的终止条件,本案例中循环终止的条件是输
入数据和系统生成的随机数相等。程序测试如图3.28 
所示。
3.4.2 生成随机数
1.生成伪随机数 
C++语言里的rand()函数能够生成伪随机数,此函数不需要参数,其返回值是一个0 
至最大整数之间的任意整数。之所以称为伪随机数,因为默认是以1为随机种子(即起始