【学习目标】
熟练掌握C++各种流程控制语句的用法,包括分支控制语句:if-else语句,多分支控制语句:switch语句,三种循环语句:for循环、while循环和do-while循环语句,会用流程控制语句构造程序。
【重点和难点】
各种流程控制语句的的嵌套使用,包括if-else语句的嵌套,循环语句的嵌套,以及分支语句与循环语句的嵌套等。循环语句和break, continue语句的组合使用。
【学习方法指导】
很少程序是顺序执行的,要改变程序的执行流程,就要用流程控制语句。一定要熟练掌握各种流程控制语句的应用。可以用各种流程控制语句编写一些小程序,并运行,仔细体会它们的用法与区别。
【知识点】
if语句;if-else语句;switch语句;while语句;do-while语句;for语句;break语句;continue语句
第一节 if语句
语句是构造程序最基本的单位,程序运行的过程就是执行程序语句的过程。程序语句执行的次序称之为流程控制(或控制流程)。我们前面介绍的实例程序中,程序语句都是顺序执行的。我们是否能够改变程序顺序执行的流程呢?例如,当满足某个条件时,执行某种运算或重复执行某种运算。答案是肯定的,流程控制语句就是用于修改程序的执行路径。
本章我们介绍的C++流程控制语句包括:
◇ if语句,也称为分支语句。
◇ switch语句,也称之为多分支语句。
◇ 循环语句。
◇ break和continue语句,这两个语句与switch语句或循环语句配合使用。
◇ goto语句。
现实生活中的流程是多种多样的,如汽车在道路上行驶,既要顺序地应道路前进,碰到交叉路口时,驾驶员就需要判断是转弯还是直走,在环路上是继续前进,还是需要从一个出口出去等等。又比如,在生产线上的零件的流动过程,应该顺序地从一个工序流向下一个工序,但当检测不合格时,就需要从这道工序中退出,或继续在这道工序中再加工直到检测通过为止。因此,现实生活中的流程可以概括为下面几个方面:
1. 流程分支,一个流程到达一定点时,需要分为两个或多个分支继续进行。
2. 流程循环,或者可以说是重复不停地进行同一工作。
为此,C++流程控制语句相应地设置了if语句、switch语句、循环语句、break和continue语句。
第二节 switch语句
.2 switch语句
switch语句的一般形式如下:
switch (表达式) {
case常量表达式1:
语句;
...
case常量表达式n:
语句;
default:
语句;
}
switch语句的执行过程是这样的:首先计算"表达式"的值,然后,其结果值依次与每一个常量表达式的值进行匹配(常量表达式的值的类型必须与"表达式"的值的类型相同)。如果匹配成功,则执行该常量表达式后的语句系列。当遇到break时,则立即结束switch语句的执行,否则,顺序执行到花括号中的最后一条语句。default情形是可选的,如果没有常量表达式的值与"表达式"的值匹配,则执行default后的语句系列。需要注意的是:"表达式"的值的类型必须是字符型或整型。
我们下面看一个分析双目算术运算的例子4-9。双目算术运算符存在字符型变量operator中,两个操作数分别存在变量operand1和operand2,switch语句执行相应的运算,并将结果存在变量result中。
例4-9 | |
switch (operator) { case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; default: cout << "unknown operator: " << ch << '\n'; break; } | |
![]() |
从上例我们可以看到:switch语句中的每一个case的结尾通常有一个break语句,它停止switch语句的继续执行,而转向该switch语句的下一个语句。但是,我们有时也有意不加break语句。例如,我们修改上面的例子,以允许x作为乘法运算符,则可将上面的程序修改为:
![]() | |
例4-10 | |
switch (operator) { case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case 'x': case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; default: cout << "unknown operator: " << ch << '\n'; break; } | |
![]() |
因为case 'x'没有break语句,所以case 'x'与case '*'执行相同的语句系列,也就是说,把'x'扩展成为乘法运算符了。
很显然,switch语句可以写成if-else语句的形式。例如,上面的语句,我们可以写为:
![]() | |
![]() | 例4-11 |
if (operator == '+') result = operand1 + operand2; else if (operator == '-') result = operand1 - operand2; else if (operator == 'x' || operator == '*') result = operand1 * operand2; else if (operator == '/') result = operand1 / operand2; else cout << "unknown operator: " << ch << '\n'; | |
![]() |
但是,使用switch语句比用if-else语句简洁得多,可读性也好得多。遇到多分支选择的情形,我们应当尽量选用switch语句,避免采用嵌套较深的if-else语句。
对于一条路线需要分为多个分支路线时,用前面的if 语句书写变得异常繁琐,而且不易阅读。为此,C++提供了另外一套语句形式--switch语句
下面我们通过一个具体例子来进一步加深对if-else控制结构的认识,程序的功能是:要求用户输入一个整数,整数范围为1~5之间,然后,计算机根据整数的值,发出鸣叫声。例如,输入数字1,则鸣叫一声,输入数字2,则鸣叫两声,…,如果是1~5之外的数,则没有叫声。程序中定义了一个宏BEEP,当程序中遇到BEEP,便用cout << "\a \n"替换,有关宏的内容在第9章详细介绍。\a是一个转义字符,它使计算机发出鸣叫声。
![]() | |
![]() | 例4-12 |
#include <iostream.h> #define BEEP cout << "\a \n" void main() { int num; cout << "Please enter a number: "; cin >> num; // Use multiple if statements to beep. if (num == 1){ BEEP; } else if (num == 2){ BEEP;BEEP; } else if (num == 3){ BEEP; BEEP; BEEP; } else if (num == 4){ BEEP; BEEP; BEEP; BEEP; } else if (num == 5){ BEEP; BEEP; BEEP; BEEP; BEEP; } } | |
![]() |
由于这个程序if嵌套的次数较多,不是很直观。其实,这个程序用可以处理多分支的switch语句,会更加清晰,可读性更好:
第三节 循环语言
我们主要使用三种形式的循环语句:while语句、do-while语句和for语句,下面分别介绍。
4.3.1 while语句
while语句的一般形式如下:
while (表达式)
语句;
while语句的执行过程如下:首先计算"表达式"(称之为循环条件)的值,如果其结果值非0,则执行"语句"(称之为循环体)。这个过程重复进行,称之为循环,直至"表达式"的值为0时,才结束循环。
例如,假定我们要计算整型数1~n的和,可以用while语句表示为:
int i = 1,sum = 0;
while (i <= n)
sum += i++;
如果我们把n设置为5,表4-1提供了上述循环语句的执行过程,该循环体被执行了5次。
![]() | ||||||||||||||||||||||||||||||||||||
![]() | 表4-1 while循环语句的执行过程 | |||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||
![]() |
循环体也可以是空的,例如:
while (n % 2 == 0 && n /= 2)
;
本语句的循环体实际上并不需要,循环条件不仅检测n是否为偶数,而且将n除以2,使得当n为0时,循环执行终止。
第四节 break和continue语句
在前面我们已经看到:break语句常和switch语句配合使用。break语句和continue语句也与循环语句配合使用,并对循环语句的执行起着重要的作用。且break语句只能用在switch语句和循环语句中,continue语句只能用在循环语句中。下面我们分别介绍break语句和continue语句。
根据程序的目的,有时需要程序在满足另一个特定条件时立即终止循环,程序继续执行循环体后面的语句,break语句可实现此功能continue语句实现的功能是,根据程序的目的,有时需要程序在满足另一个特定条件时跳出本次循环。
4.4.1 break语句
break语句用在循环语句的循环体内的作用是终止当前的循环语句。例如4-15:
![]() | 例4-15 |
// 无break语句 int sum = 0, number; cin >> number; while (number != 0) { sum += number; cin >> number; } // 有break语句 int sum = 0, number; while (1) { cin >> number; if (number == 0) break; sum += number; } | |
![]() |
这两段程序的产生的效果是一样的。需要注意的是:break语句只是跳出当前的循环语句,对于嵌套的循环语句,break语句的功能是从内层循环跳到外层循环。例如4-16:
![]() | |
![]() | 例4-16 |
int i = 0, j, sum = 0; while (i < 5) { for ( j = 0; j < 5; j++) { sum + = i + j; if ( j == i) break; } i++; } | |
![]() |
本例中break语句执行后,程序立即终止for循环语句,并转向for循环语句的下一个语句,即while循环体中的i++语句,继续执行while循环语句。
终止当前的循环语句意思是在多重循环中,break只能退出它所在的那重循环;只能退出内重循环到外重循环中,要退出外重循环还要在外重循环中使用break。
第五节 程序举例
编写一个程序,模拟具有加、减、乘、除四种功能的简单计算器,如左图4-10所示。 该程序具体要求如下: 1. 运行程序,显示当前值及命令提示command>。 2. 通过键入字符'+'、 '-'、'*'或 '/'(分别表示加、减、乘或除运算符)响应程序的提示command>,能够支持加、减、乘、除运算。 3. 当一个运算符输入后,程序便要求输入同当前值一起运算的第二个数。若给定了第二个数,程序便执行指定的运算,显示新的当前值。 4. 在程序提示command>后可接受字符'C'作为清除当前值的命令,即将当前值设置为0。 5. 在程序提示command>后可接受字符'Q'命令,终止程序的运行 |
图4-10 简单的计算器 | |
计数器流程图 | |
分析: 我们可以用选择和循环语句实现该程序的功能,它由以下几个部分组成: <> 初始化:设置当前值为0.0、显示当前值、提示用户输入命令字符及读当前值。 <> 循环。当'Q'命令键入时,循环终止。循环体内完成如下工作: i. 处理命令。如果要求输入数据,还要进行运算 ii. 显示运算结果 iii. 提示用户输入命令字符 iv. 读命令字符 本程序要处理的数据有三种: <> 当前显示的值:一个double型数,用变量displayed_value表示 <> 命令字符:一个字符,用变量command_character表示 <> 参与运算的另一个double型数,用变量new_entry表示 程序总的控制结构是一个循环,而对于不同的命令的处理,可用多分支控制的switch语句来完成,它嵌套在循环语句当中。 因为键入'Q'命令,循环终止,所以循环的控制结构如下: while (command_character != 'Q') { // switch语句 ... // 输入下一个命令 cout << "Value : " << displayed_value << endl; cout << "command>"; cin >> command_character; } 由于'Q'命令是循环语句处理的,所以,switch语句处理的命令包括: 'C'清除命令,设置当前值为0; '+'加,要求输入一个double型数,并作加法运算; '-'减,要求输入一个double型数,并作减法运算; '*'乘,要求输入一个double型数,并作乘法运算 '/'除,要求输入一个double型数,并作除法运算 如果用户输入了不合适的命令,例如,'M'命令,应该给出错误信息提示,这可由"default"情形来处理,在switch语句中: default: cout << "不可理解的输入!"; 当出现错误输入,应该清除掉不该读入的字符,即非法的命令。这可以使用cin.ignore(...)语句,在遇到识别字符(如换行符)之前,它会忽略所有的字符,但要求指定识别字符(如换行符'\n')和忽略字符的最大数目,例如: cin.ignore(100,'\n'); 上一句要求cin找到换行符时,最多可忽略100个字符,这个数字应该能够足以跳过任何无效的字符。所以,完整的switch语句应为: switch(command_character) { case 'C': displayed_value = 0.0; break; case '+': … default: cout << "不可理解的输入!"; cin.ignore(100,'\n'); } 因为default语句后,没有其它的情形要处理,所以不再需要break语句,但是,本switch语句中除default以外的其它情形(如"case '+':"),应有与之配套的break。 分析: 我们可以用选择和循环语句实现该程序的功能,它由以下几个部分组成: <> 初始化:设置当前值为0.0、显示当前值、提示用户输入命令字符及读当前值。 <> 循环。当'Q'命令键入时,循环终止。循环体内完成如下工作: i. 处理命令。如果要求输入数据,还要进行运算 ii. 显示运算结果 iii. 提示用户输入命令字符 iv. 读命令字符 本程序要处理的数据有三种: <> 当前显示的值:一个double型数,用变量displayed_value表示 <> 命令字符:一个字符,用变量command_character表示 <> 参与运算的另一个double型数,用变量new_entry表示 程序总的控制结构是一个循环,而对于不同的命令的处理,可用多分支控制的switch语句来完成,它嵌套在循环语句当中。 因为键入'Q'命令,循环终止,所以循环的控制结构如下: while (command_character != 'Q') { // switch语句 ... // 输入下一个命令 cout << "Value : " << displayed_value << endl; cout << "command>"; cin >> command_character; } 由于'Q'命令是循环语句处理的,所以,switch语句处理的命令包括: 'C'清除命令,设置当前值为0; '+'加,要求输入一个double型数,并作加法运算; '-'减,要求输入一个double型数,并作减法运算; '*'乘,要求输入一个double型数,并作乘法运算 '/'除,要求输入一个double型数,并作除法运算 如果用户输入了不合适的命令,例如,'M'命令,应该给出错误信息提示,这可由"default"情形来处理,在switch语句中: default: cout << "不可理解的输入!"; 当出现错误输入,应该清除掉不该读入的字符,即非法的命令。这可以使用cin.ignore(...)语句,在遇到识别字符(如换行符)之前,它会忽略所有的字符,但要求指定识别字符(如换行符'\n')和忽略字符的最大数目,例如: cin.ignore(100,'\n'); 上一句要求cin找到换行符时,最多可忽略100个字符,这个数字应该能够足以跳过任何无效的字符。所以,完整的switch语句应为: switch(command_character) { case 'C': displayed_value = 0.0; break; case '+': … default: cout << "不可理解的输入!"; cin.ignore(100,'\n'); } 因为default语句后,没有其它的情形要处理,所以不再需要break语句,但是,本switch语句中除default以外的其它情形(如"case '+':"),应有与之配套的break。 分析: 我们可以用选择和循环语句实现该程序的功能,它由以下几个部分组成: <> 初始化:设置当前值为0.0、显示当前值、提示用户输入命令字符及读当前值。 <> 循环。当'Q'命令键入时,循环终止。循环体内完成如下工作: i. 处理命令。如果要求输入数据,还要进行运算 ii. 显示运算结果 iii. 提示用户输入命令字符 iv. 读命令字符 本程序要处理的数据有三种: <> 当前显示的值:一个double型数,用变量displayed_value表示 <> 命令字符:一个字符,用变量command_character表示 <> 参与运算的另一个double型数,用变量new_entry表示 程序总的控制结构是一个循环,而对于不同的命令的处理,可用多分支控制的switch语句来完成,它嵌套在循环语句当中。 因为键入'Q'命令,循环终止,所以循环的控制结构如下: while (command_character != 'Q') { // switch语句 ... // 输入下一个命令 cout << "Value : " << displayed_value << endl; cout << "command>"; cin >> command_character; } 由于'Q'命令是循环语句处理的,所以,switch语句处理的命令包括: 'C'清除命令,设置当前值为0; '+'加,要求输入一个double型数,并作加法运算; '-'减,要求输入一个double型数,并作减法运算; '*'乘,要求输入一个double型数,并作乘法运算 '/'除,要求输入一个double型数,并作除法运算 如果用户输入了不合适的命令,例如,'M'命令,应该给出错误信息提示,这可由"default"情形来处理,在switch语句中: default: cout << "不可理解的输入!"; 当出现错误输入,应该清除掉不该读入的字符,即非法的命令。这可以使用cin.ignore(...)语句,在遇到识别字符(如换行符)之前,它会忽略所有的字符,但要求指定识别字符(如换行符'\n')和忽略字符的最大数目,例如: cin.ignore(100,'\n'); 上一句要求cin找到换行符时,最多可忽略100个字符,这个数字应该能够足以跳过任何无效的字符。所以,完整的switch语句应为: switch(command_character) { case 'C': displayed_value = 0.0; break; case '+': … default: cout << "不可理解的输入!"; cin.ignore(100,'\n'); } 因为default语句后,没有其它的情形要处理,所以不再需要break语句,但是,本switch语句中除default以外的其它情形(如"case '+':"),应有与之配套的break。 |
程序:
根据上面的分析,我们可以编写出完整的程序。
![]() | |
![]() | 例4-18 |
#include <iostream.h> int main() { double displayed_value; double new_entry; char command_character; displayed_value = 0.0; cout << "计算器演示程序" << endl << "----" << endl; cout << "在'>' 提示后输入一个命令字符" << endl; cout << "Value : " << displayed_value << endl; cout << "command>"; cin >> command_character; while (command_character != 'Q') { switch(command_character) { case 'C': displayed_value = 0.0; break; case '+': cout << "number>"; cin >> new_entry; displayed_value += new_entry; break; case '-': cout << "number>"; cin >> new_entry; displayed_value -= new_entry; break; case '*': cout << "number>"; cin >> new_entry; displayed_value *= new_entry; break; case '/': cout << "number>"; cin >> new_entry; displayed_value /= new_entry; break; default: cout << "不可理解的输入!"; cin.ignore(100,'\n'); } //End of switch cout << "Value : " << displayed_value << endl; cout << "command>"; cin >> command_character; } //End of while return 0; } | |
![]() |
计算器演示程序
----
在'>' 提示后输入一个命令字符
Value : 0
command>+↙
number>1.23↙
Value : 1.23
command>*↙
number>6.4↙
Value : 7.872
command>C↙
Value : 0
command> Q↙
键入'Q'后,程序运行终止。
【本章小结】
本章介绍了C++的流程控制语句,包括分支语句:if、if-else语句,多分支switch语句;循环语句:for、 while、 do-while语句;break、 continue语句。本章的后面还给出了一个综合运用流程控制语句实例。
if语句与switch语句可以互换使用。对于多分支的情形,我们常用switch语句,如用if-else语句,会使程序显得复杂,可读性较差。
三种循环语句也可以互换使用。对于有确定次数的循环,我们常用for语句,要注意while循环语句与do-while的差别:do-while循环语句至少要执行一次循环体。我们编程时,常常是循环可能一次也不执行,此时就不能用do-while循环语句,而要用while循环语句或for循环语句。
一:选择题 三:编程及简答题 |