屌丝c++语言程序设计 第四章 流程控制语句
来源:互联网 发布:java线程数量 编辑:程序博客网 时间:2024/05/22 04:40
【学习目标】
熟练掌握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中。
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语句的形式。例如,上面的语句,我们可以写为:
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是一个转义字符,它使计算机发出鸣叫声。
#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次。
循环体也可以是空的,例如:
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:
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-16int 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。
第五节 程序举例
该程序具体要求如下:
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。
程序:
根据上面的分析,我们可以编写出完整的程序。
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循环语句。
一:选择题
1. 如果变量x,y已经正确定义,下列语句哪一项不能正确将x,y的值进行交换:
a. x=x+y,y=x-y,x=x-y;
b. t=x,x=y;y=t;
c. t=y,y=x,x=t;
d. x=t,t=y,y=x
2. 如要求在if后一对括号中的表达式,表示a不等于0的时候的值为"真",则能正确表示这一关系的表达式为:
a. a<>0
b. !a
c. a=0
d. a
3. 下面的这个循环的循环次数是:for(int i=0,j=10;i=j=10;i++,j--)
a. 无限次
b. 语法错误,不能执行
c. 10
d. 1
4. 以下哪个不是循环语句:
a. while语句
b. do-while语句
c. for语句
d. if-else语句
5.下列do-while循环的循环次数是:
已知:int i=5;
do{ cout<<i--<<endl;
i--;
}while (i!=0)
a. 0
b. 2
c. 5
d. 无限次
6.下列do-while循环的循环次数是:
for(int i=0,x=0;!x&&i<=5;i++)
a.5
b.6
c.1
d.无限次
二:填空题
1. do-while语句与while语句的主要区别 。
2. x,y,z为int类型的时候,下列语句执行之后,x的值为 , y的值为 ,z的值为 。
x=10;y=20;z=30;
if(x>y) x=y;y=z;z=x;
3. 是构造程序最基本的单位,程序运行的过程就是 的过程。
4. break语句实现的功能是 。
5. continue语句实现的功能是 。
三:编程及简答题
1. 用两次for 循环和求余运算符测试和打印输出(2-100)中为素数的正整数。
2.写一段程序,使用while循环从标准输入设备中读取字符到字符串中,自己确定输入什么字符时退出循环,对每一个读取的字符先用if语句判别是否为数字,然后用switch语句判别是否为字母,并打印输出相应字母为首字母的英文单词到屏幕。退出循环后在屏幕上显示输入的字符串。
3.把下面程序中的if语句换成switch语句。
#include <iostream.h>
void main()
{
char c;
while(true)
{
cout << "MAIN MENU:" << endl;
cout << "l: left, r: right, q: quit -> ";
cin >> c;
if (c == 'q')
break; // while结束
if (c == 'l')
{
cout << "LEFT MENU:" << endl;
cout << "select c or d: ";
cin >> c;
if(c == 'c')
{
cout << "you chose 'c'" << endl;
continue; // 返回主菜单
}
if(c == 'd')
{
cout << "you chose 'd'" << endl;
continue; // 返回主菜单
}
else
{
cout << "you didn't choose c or d!"<< endl;
continue; //返回主菜单
}
}
if (c == 'r')
{
cout << "RIGHT MENU:" << endl;
cout << "select a or b: ";
cin >> c;
if (c == 'a')
{
cout << "you chose 'a'" << endl;
continue; //返回主菜单
}
if (c == 'b')
{
cout << "you chose 'b'" << endl;
continue; //返回主菜单
}
else
{
cout << "you didn't choose c or d!"<< endl;
continue; //返回主菜单
}
}
cout << "you must type l or r or q!" << endl;
}
cout << "quitting menu..." << endl;
}
4.读下段程序,分析其功能是什么?
#include <iostream.h>
void main( )
{
cout<<"please input the b key to hear a bell."<<endl;
char ch;
cin>>ch;
if (ch=='b')
cout <<'\a';
else
if (ch=='\n'
cout <<"what a boring select on..."<<endl;
else
cout <<"bye! \n";
}
5.编写一个程序实现以下功能:从键盘读入3个整数,比较其大小,输出其中的最大数。
6.以下程序中的else应该与哪一个if配对?
1、 if (a==0)
p=0;
if (a<0)
p=-1;
else
p=1;
2、 if (a==0)
{
p=0;
if (a<0)
p=-1;
}
else
p=1;
7.看下面几个循环语句,说明循环的含义。
1、while ((c=getchar( ))!='Y'||c!='y'||c!='N'||c!='n' );
2、 while (thue) {.... }
3、while (i ) {... }
4、int i=1,sum=0; while (i<=100) sum+=i++;
8.编程实现:输入一行字符,求其中字母、数字和其他符号的个数。
9.求满足下式的最小n值,其中的limit由键盘输入。
1+1/2+1/3+……+1/n>limit
10.编写程序输出菲波那切数列的前20项。即前两项为1,以后每一项为前两项之和。
11.编写程序根据学生成绩输出优、良、中、及格和不及格。
12.编程实现如下功能:读入一行字母,求其中元音字母出现的次数。
- 屌丝c++语言程序设计 第四章 流程控制语句
- 第四章c语言 流程控制语句(一)
- 第四章 C语言程序设计
- 第四章 JAVA流程控制语句
- C++--流程控制语句
- Java入门 第一季第四章 流程控制语句
- 【PHP自学笔记】第四章 PHP流程控制语句
- 第四章:流程控制
- 第四章 流程控制
- 第四章.流程控制
- 第四 Java的流程控制语句
- c语言程序设计现代方法---第四章:表达式
- C语言程序设计17通信 第四章作业
- C的基础上学习C# (第四章--流程控制)
- C语言 第四章 关系、逻辑运算与分支流程控制
- 流程控制语句(C#)
- C#—流程控制语句
- C语言 流程控制语句
- 9i 可选后台进程术语解释
- Start/stop Oracle&nbs…
- Note 452067.1 &n…
- blog 搬家到csdn
- solaris 11 下安装VMwar…
- 屌丝c++语言程序设计 第四章 流程控制语句
- Linux与Solaris比较 <转载>
- (微软面试100题)求子数组的最大和
- OpenCV之鼠标和键盘事件处理
- 红黑树原理和实现(1)
- iOS基础面试题(四)
- 标头停止点不能位于宏或#if块中
- Scrum之Sprint
- pygame之事件(一)