屌丝c++语言程序设计 第四章 流程控制语句

【学习目标】
  熟练掌握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循环语句的执行过程
 
循环次数ini <= nsum += i++
第一次1511
第二次2513
第三次3516
第四次45110
第五次55115
第六次650.

  循环体也可以是空的,例如:
    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循环语句。


一:选择题
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.编程实现如下功能:读入一行字母,求其中元音字母出现的次数。



谢谢大家支持!!!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值