C++辅导教程(2)——分支结构

第二章  分支语句

 

在前面的内容中,介绍了关系运算和逻辑运算。在编程中可以通过赋值语句,给一个变量赋值来得到是否成立,但是单纯依靠前面的语句是无法达到按照这个逻辑值的不同而运行不同的语句。

一、分支语句

在程序设计中,为了实现前面的情况,定义了一种结构叫做选择结构。if语句是选择结构中,最常用的一种,它可以根据条件的成立和不成立,来把程序分为两个部分,所以if语句有叫做双分支语句。

if语句主要有以下几种形式:

形式1:

if (条件)

{

语句……

}

扫描二维码关注公众号,回复: 4641155 查看本文章

只有条件成立时需要运行的语句,而没有条件不成立时的部分。而条件成立时需要运行的语句如果多于1条时,则必须放在{}之间;而如果需要运行的语句只有一条,则{}可以省略,具体如下。

形式1简化:

if (条件)

  运行语句;

 

形式2:

if (条件)

{

语句段1……

}

else

{

语句段2……

}

既有条件成立时需要运行的语句,也有条件不成立时的语句。但如形式1一样,如果语句段中的语句超过1句,也必须使用{}。还有一点特别需要指出的,C/C++中if语句的()是不能够省略的,一定要把条件放在()之间。

【例11】求两个数中的最大数

#include <cstdlib>

#include <iostream>

 

using namespace std;

 

int main(int argc, char *argv[])

{

    int a,b;

    cin>>a>>b;

    if (a>b)

      cout<<a<<endl;

    else

      cout<<b<<endl;   

    system("PAUSE");

    return EXIT_SUCCESS;

}

【例11】是一个简单的使用if语句来求出两个值中间的最大值的例子。if语句的条件是a>b,当这个条件成立时将运行if语句下面的cout<<a<<endl;语句;而这个语句不成立时,则运行else语句后面的语句cout<<b<<endl;。

二、分支语句的嵌套

if语句虽然可以实现按照条件的成立与否,来分别执行不同的语句,但是有的时候复杂的条件容易,会让单纯的if语句显得不易理解,所以在使用if语句时,有一种技巧让一个if语句嵌套在另外一个if语句中。这样就可以让if语句判断的条件更清晰。

【例12】求三个数中的最大数

(1)用三个if来实现找最大数

#include <cstdlib>

#include <iostream>

 

using namespace std;

 

int main(int argc, char *argv[])

{

    int a,b,c;

    cin>>a>>b>>c;

    if (a>=b&&a>=c)

      cout<<a<<endl;

    if (b>=a&&b>=c)

      cout<<b<<endl;

    if (c>=a&&c>=b)

      cout<<c<<endl;

    system("PAUSE");

    return EXIT_SUCCESS;

}

这是一个看似很清晰的程序,如果a对b和c的关系都是大于或等于,则输出a;如果b对a和c的关系都是大于或等于,则输出b;如果c对a和b的关系都是大于或等于,则输出c。但细分析起来,会发现,当a,b,c出现重复时,会出现显示多个数值的情况。但如果为了避免显示多个数值而去掉条件中的所有“=”号,则发现,当出现数值相等时,是无法判断出正确结果的。而如果把每一中可能等于,可能大于的情况单独列出的话,则不是能够很容易想的明白的。

在这种情况下,不如使用下面的方法:

(2)使用if语句的嵌套

#include <cstdlib>

#include <iostream>

 

using namespace std;

 

int main(int argc, char *argv[])

{

    int a,b,c;

    cin>>a>>b>>c;

    if (a>b)

      if (a>c)

        cout<<a;

      else

        cout<<c;

    else

      if (b>c)

        cout<<b;

      else

        cout<<c;

    system("PAUSE");

    return EXIT_SUCCESS;

}

在这种处理中,不但回避了等于问题,且是逐渐把问题分成两种情况,就把三个数的问题简化到了两个数的问题,最后再加以解决。整个解题的过程清晰简明,很容易理解。

三、条件表达式

在C/C++中,有一种很有趣的表达式叫做条件表达式,用一个语句就可以根据条件的成立与否,给表达式不同的值。如【例11】题目的条件,则可以用下面的条件表达式完成。

c=(a>b)?a:b;

这个表达式的条件就是()中的a>b,如果成立则值为“:”号前面的值(即a);如果不成立则值为“:”号后面的值。而这里面的“?:”被成为条件运算符。

四、多分支语句

在分支结构中,不仅仅有像if语句这样的双分支语句,更有另外一种switch()语句,可以根据表达式的值,将运行的语句分成很多很多种。

switch()语句的结构如下:

switch(表达式)

{

  case 常量表达式1:语句1

  case 常量表达式2:语句2

case 常量表达式3:语句3

case 常量表达式4:语句4

case常量表达式n:语句n

default          :语句n+1

}

switch()语句和case语句搭配和形成的多分支语句,是根据switch()语句括号中的表达式的值,搭配case语句后面的常量表达式的值,形成一种对应关系。从而判断到底从哪条语句开始执行。但有几点特别需要注意:

1、switch()语句“( )”中的表达式的值必须为有序类型,如整数、字符等;

2、case语句其实只是决定switch语句的执行入口,也就是决定从哪条语句开始执行,而并不是单独执行那条语句。

3、default语句是表示除了其他条件外的其他所有值的情况,所以,一定要把default语句放在所有case语句的后面。

【例12】case语句的入口效应

#include <cstdlib>

#include <iostream>

 

using namespace std;

 

int main(int argc, char *argv[])

{

    int a;

    cin>>a;

    switch(a)

    {

      case 1:cout<<"One"<<endl;

      case 2:cout<<"two"<<endl;

      case 3:cout<<"three"<<endl;

      case 4:cout<<"four"<<endl;

      default:cout<<"Unknow!"<<endl;            

    }

    system("PAUSE");

    return EXIT_SUCCESS;

}

如上面这个程序,是一个最简单的翻译程序,在输入阿拉伯数字后,程序会给你翻译成英文输出。但是,实际程序实现的效果是,如果输入1,则显示出所有语句。这就是因为a的值对应了case后面值为“1”的情况。所以程序执行是从这一条case开始执行,但是由于执行了这一行的cout<<”one”<<endl;后,没有中断switch()语句的运行,所以,会自动执行后面的

case 2:cout<<"two"<<endl;

      case 3:cout<<"three"<<endl;

      case 4:cout<<"four"<<endl;

      default:cout<<"Unknow!"<<endl;

这一系列语句。直达所有语句都运行完了,才能结束。而其实在C/C++中是有这样的结束语句的,叫做break;只要将break;语句放在要执行的语句后,就可以只执行满足值条件的那一行程序。

【例13】break语句与switch语句的出口

#include <cstdlib>

#include <iostream>

 

using namespace std;

 

int main(int argc, char *argv[])

{

    int a;

    cin>>a;

    switch(a)

    {

      case 1:cout<<"One"<<endl;break;

      case 2:cout<<"two"<<endl;break;

      case 3:cout<<"three"<<endl;break;

      case 4:cout<<"four"<<endl;break;

      default:cout<<"Unknow!"<<endl;   break;         

    }

    system("PAUSE");

    return EXIT_SUCCESS;

}

只是简单在cout后面添加了break语句,这就相当与给switch语句开了一扇出门的门。只要在switch语句中遇到break语句则程序就会跳过switch语句中,满足条件以外的其他语句,而直接跳出if语句外,运行其他部分。

当然不加break;也是可以理解的,如下面的例题就用的很好。

【例14】按照分数划分成绩等级

#include <cstdlib>

#include <iostream>

 

using namespace std;

 

int main(int argc, char *argv[])

{

    int a;

    cin>>a;

    switch(a/20)

    {

      case 0:

      case 1:

      case 2:cout<<"不及格"<<endl;break;

      case 3:cout<<"及格"<<endl;break;

      case 4:

      case 5:cout<<"优秀"<<endl;break;

      default:cout<<"未知,请核实数据!"<<endl;break;         

    }

    system("PAUSE");

    return EXIT_SUCCESS;

}

    这个程序是以60为界,以下为不及格;而60以上(含60)到80(不含80),都属于及格;而80以上(含80)到100(含100),都属于优秀。在处理0,1,2的值时,0和1后面不但没有break语句,更是连一个处理语句都没有。其实,也就是应用了case语句入口效应,和break的出口作用,让程序从合适的地方进来,并不段运行,再从合理的地方出去,完成一个完整的出入过程。这也就是switch语句的灵活之处。

猜你喜欢

转载自blog.csdn.net/fatship/article/details/85244430