zoukankan      html  css  js  c++  java
  • C语言之选择结构

    该章内容:本章我们学习三大结构之一:选择结构,采用选择结构来解决问题称为判断问题,它的求解规则是在不同的条件下进行不同的操作。选择结构比顺序结构要复杂一些。本章是考试的重点章节。

    学习方法:先了解选择结构相关的基础知识,然后做选择结构简单的习题,逐步加入复杂的语句。最终一定要学会如何写简单的选择结构的程序。

    第一节 关系运算符、关系表达式

    知识点:语句和表达式之间的联系;分号的使用;复合语句

    重要程度:★★★★

    1、C语言中的逻辑值

    C语言中的逻辑值只有两个:“真”和“假”。用非零来代表“真”,用零来代表“假”。

    C语言中只有一个数值表示假,就是0。其它的数据都是表示真,如:1.1,2.9,-2等等。

    1、关系运算符和关系表达式

    所谓的关系运算就是比较运算,将两个数进行比较,判断比较的结果是否符合条件。

    1.1 C语言中的关系运算符

    C语言提供了6种关系运算符,如表1所示。

    表1  C语言中的6种关系运算符及其优先级

    优先级

    优先级相同(高)

    优先级相同(低)

    关系运算符

    >

    (大于)

    >=

    (大于等于)

    <

    (小于)

    <=

    (小于等于)

    ==

    (等于)

    !=

    (不等于)

                 

    注意:

    1)由两个字符组成的运算符之间不可以加空格,如<=就不能写成:< =。

    2)前四种关系运算符(>、>=、<、<=)的优先级相同,后两种关系运算符(==、!=)的优先级相同,前四种关系运算符的优先级高于后两种关系运算符。

    3)关系运算符的优先级低于算术运算符。如“+”的优先级高于“<”。

    4)关系运算符的优先级高于赋值运算符。如“=”的优先级低于“==”。(注意“=” “==”的区别)。(考试的重点

    5)关系运算符都是双目运算符,自左至右的结合性。如4<5<2则等价于(4<5)<2(考试重点)。

    1.2 关系表达式

    关系表达式:用关系运算符将表达式连接起来的式子称为关系表达式。

    关系表达式的值:关系表达式的值若为真,则结果为1;若为假,则结果为0。(只有01两种!!)

    如,3>2>1的值为1;若变量a中的值为10,变量b中的值为6,则关系表达式a>b的值为“真”,即为1。而关系表达式(a>5)<(b>10)的值为“假”,即为0。

    第二节、逻辑运算符和逻辑表达式

    1.1 C语言中的逻辑运算符

    C语言提供了3种逻辑运算符,如表2所示。

    表2  C语言中的3种逻辑运算符及其优先级

    优先级

      优先级低                    优先级高

    逻辑运算符

    || (逻辑“或”)

    &&(逻辑“与”)

    ! (逻辑“非”)

    注意:

    (1)&&和||运算符是双目运算符,如(a>b)&&(x<y)。!运算符是单目运算符,应该出现在运算对象的左边,如!(a<b)。逻辑运算符具有自左向右的结合性。

    (2)在关系运算符、算术运算符、赋值运算符、逻辑运算符四者中,优先级从高到低依次为:! (逻辑“非”)、算术运算符、关系运算符、&&(逻辑“与”)、||(逻辑“或”)、赋值运算符。

    1.2 逻辑表达式和逻辑表达式的值

    逻辑表达式:用逻辑运算符将表达式连接起来的式子称为逻辑表达式。

    逻辑运算的对象可以是C语言中任意合法的表达式。如,!(a<b),(a+b)&&(x=8),(a=b)||(c+2),'d'&&'c'等都是合法的表达式。

    逻辑表达式的值:逻辑表达式的运算规则如表3所示。逻辑表达式的值若为真,则结果为1;若为假,则结果为0。(表达式的值也只有0和1两种!!!)

    表3  逻辑运算的规则

    A

    b

    !a

    !b

    a&&b

    a||b

    非0

    非0

    0

    0

    非0

    0

    非0

    0

    0

    0

    1

    1

    0

    1

    0

    1

    1

    0

    0

    0

    1

    1

    1

    0

    1设有定义:int a=5,b=6,c=7;则以下选项中值为0的表达式是

    A)(!a==0)&&  (a<b<c)                B)(b<c)&&!c||1

    C)a&&b                                 D)(a+4)||( a+b)&&(c-a)

    正确答案为A。

    考试重点考察点

    1、在C语言中,由&&||组成的逻辑表达式,在特定的情况下会产生“短路”的现象。在逻辑表达式的求解中,并不是所有的运算对象都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该逻辑运算符。(若“&&”的左边的运算对象的值为0,则不再对右边的运算对象进行运算,直接得出整个表达式的值为0;若“||”的左边的运算对象为1,则不再对右边的运算对象进行运算,直接得出整个表达式的值为1。)

    (1)若执行下列语句

    a=0;b=1;

    c=a++&&(b=6);

    各变量的值为:a为1,b为1,c为0,由于(b=6)没被执行到,故b的值不变。

    (2)执行语句

    a=1;b=1;c=0;

    d=--a||b--||(c=b+3);

    后,结果:a为0,b为0,c为0,d为1,表达式中的(c=b+3)没有被执行到,c值不变。

    2、用C语言正确表示数学意义上的a<b<c,

    正确的表示方法是 a<b&&b<c。因为a<b<c在C语言执行中,假定a=8,b=7,c=6,在数学中,a<b<c是不成立的。但是在C语言中,8<7<6会首先首先执行8<7得到0,再接着算0<6,这样就成合法了。所以一定注意C语言考试中这个a<b<c样子的是考试陷阱。

    第三节  if语句

    知识点:if语句的三种形式使用;if和else的搭配;嵌套的if语句的使用

    重要程度:★★★★

    1、if语句的三种形式

    1.1 if语句

      if只管后面一个分号;要管多个用大括号把多个语句括起来。

                                   

          程序1:                                                                                                      

          if(a<b)

    {t=a;  a=b;  b=t;}                                 

         --------------------------

          程序2: 

    if(a<b)

    t=a;  a=b;  b=t;

    程序1、2注意两者的区别 !!!                           

    图1  if语句的流程图

    1.2 if-else语句

    它的一般格式如下:

              if(表达式)

                 语句1;

              else

                 语句2;

    例如:对两数大小的比较,输出大数。用if-else语句实现:

    if(x>y)

      printf(“%d”,x);

    else

      printf(“%d”,y);

                          图2  if-else语句的流程图

    1若有以下程序

    main( )

    {    

    int   a=5,b=4,c=6,t=0;

    if(a<b) {t=a;a=b;b=t;}

    if(a<c) t=a;a=c;c=t;

    printf("%d %d %d ",a,b,c);

    }

    执行后输出结果是     

    答案:645

    分析:程序的第一行在定义a、b、c、t四个变量时初始化了值。接下来,第一个if语句的表达式为:a<b,a变量里存放的是整数5,b变量里存放的是整数4,可以判断该表达式为“假”,那么程序应该跳过if的子句。子句是一条复合语句则{t=a;a=b;b=t;}被跳过。第二个if语句的表达式为:a<c,因为变量a的值为5,变量c的值为6,因此该表达式的值为“真”,执行该if的语句“t=a;”,t的值被赋为5。该if语句执行完成后,还有两个其它的语句“a=c;c=t;”执行后这两条语句后,a的值被赋为6,c的值被赋为5。因此,最后输出a、b、c变量的值应该分别为6、4、5。若将if(a<b) {t=a;a=b;b=t;}改为if(a<b) t=a;a=b;b=t;,请读者自行分析结果。

    1.3 if-else-if 语句结构

    它的一般格式如下:(只有一个语句被执行)

    if(表达式1)

    语句1;

    else if(表达式2)

    语句2 ;

    else if(表达式3)

    语句3 ;

    ……

    else

    语句n ;

     

    图2  if-else-if 语句的流程图

    2有如下程序

    main( )

    { float x=2.0,y;

    if(x<0.0) y=0.0;

    else if(x<10.0) y=1.0/x;

    else y=1.0;

    printf("%f ",y);

    }

    该程序的输出结果是( )。

    A) 0.000000   B) 0.250000   C) 0.500000   D) 1.000000

    分析:首先x的初值为2.0。判断x<0.0,其为假,则跳过语句“y=0.0;”,接着又判断x<10.0,其为真,则执行“y=1.0/x;”,然后将其输出。因此答案选C。

    注意:

    (1)if后面圆括号中的表达式,可以是任意合法的C语言表达式,可以是任意类型的数据。

    (2)if子句和else子句中如果只有一条语句,则该语句后的分号不能省。

    2、if语句的嵌套(概念考得多)

    if语句的嵌套:在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:

    if(表达式1)

    if(表达式2)  语句1;

    else        语句2;

    else

    if(表达式3)  语句3;

    else         语句4;

    其执行过程:若表达式1为“真”,则执行其嵌套的if-else语句,否则,执行else后的内嵌if-else语句。其中if-else语句在语法上是一条语句。

    特别注意:C语言的语法规定:else子句总是与前面最近的不带elseif相结合,与书写格式无关。

     
     

    如下面语句:

    if(表达式1)

    if(表达式2)  语句1;

    else        语句2;

    实质上等价于:

    if(表达式1)

    if(表达式2)  语句1;

    else        语句2;

     

     

     

     

     

     

     

     

     

     

     

    第四节  条件运算符与条件表达式

    知识点:条件运算符号的使用(唯一的三目);条件表达式的运算;

    重要程度:★★★★(口诀是“真前假后”

    1、条件运算符

    条件运算符由两个运算符组成:。条件运算符要求有三个运算对象,称三目运算符,它是C语言中唯一的一个三目运算符。

    2、条件表达式(“真前假后”口诀)

    表达式1 ? 表达式2:表达式3

    其执行过程:先求解表达式1,若为非0(真)则求解表达式2,并将表达式2的值作为整个表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个表达式的值。

     

    1以下程序的输出结果是( )。
    ��main()
    ��{

    int a=5,b=4,c=6,d;
    �� printf("%d ",d=a>b?(a>c?a:c):(b));
    }
    ��A) 5   B) 4   C) 6   D) 不确定

    分析:这是一个条件表达式的嵌套,先判断a>b为“真”,则需要求解表达式a>c?a:c的值。因此又对a>c进行判断,其为“假”,那么c就是整个表达式的值。答案选C。

    3、条件运算符的优先级

    条件运算符优先于赋值运算,但低于逻辑运算,关系运算符和算术运算符。条件运算符的结合方向为“自右向左”。如有以下表达式:

    a>b?a:c>d?c:d               等价于            a>b?a:(c>d?c:d)

    如果a=1,b=2,c=3,d=4,则表达式的值等于4。

           

    第四节 switch语句及其构成的选择结构

    知识点:switch语句的执行方式;switch语句和 break的搭配;

    重要程度:★★★★

    1、switch语句

    switch语句的一般形式如下:

    switch(表达式)

    {     case  常量表达式1:语句1;

    case  常量表达式2:语句2;

           ……

    case  常量表达式n:语句n;

    default: 语句块n+1;

    }

    其中语句1,语句2等等,可以是一条语句,也可以是若干语句。也可以是嵌套的switch语句。

    注意:

    (1)switch后圆括号中的表达式的值必须是实型或字符型,不能为实型

    (2)case后面是常量表达式,但常量表达式中不能有变量

    (3)default可以出现在语句体中的任何位置,但最多只能有一个。它通常出现在语句体的最后。

    2、switch语句的执行过程

    首先求解switch后圆括号中表达式的值,然后匹配case标号,有匹配成功则执行后面语句,只需要匹配一次成功,后面就不用再匹配了。(通过三个例子掌握switch的使用!)

    1按照学生的考试成绩,打印出相应的等级。90分以上的输出“A”等级,80分以上的输出“B”等级,依此类推,60分以下输出“E”等级。程序如下:

    main( )

    {     int score;

    scanf("%d",& score);   /* score中存放学生的成绩 */

    printf("score=%d: ",score);

    switch(score/10)

    {     case 10:printf("A ");

    case 9:printf("A ");

    case 8:printf("B ");

    case 7:printf("C ");

    case 6:printf("D ");

    default:printf("E ");

    }

    }

    输入99分,可以知道case 9 是匹配成功的,所以就不用再匹配,直接执行后面的case剩下的语句。直到遇到break结束。

    现将上面程序修改如下:

    main( )

    {     int score;

    scanf("%d",&score);

    printf("score=%d: ",score);

    switch(score/10)

    {     case 10:printf("A ");break;

    case 9:printf("A "); break;

    case 8:printf("B "); break;

    case 7:printf("C "); break;

    case 6:printf("D "); break;

    default:printf("E "); break;

    }

    }

    此时score变量取值为75时,输出结果为:score=75:C

    现将上面程序修改如下:

    main( )

    {     int score;

    scanf("%d",&score);

    printf("score=%d: ",score);

    switch(score/10)

    {     case 10:printf("A ");

    case 9:printf("A ");

    case 8:printf("B ");

    case 7:printf("C "); break;

    case 6:printf("D ");

    default:printf("E "); break;

    }

    }

    此时score变量取值为95时,输出结果为:score=75:ABC.

    考试核心:

    1、 switch的概念题目非常重要,switch后圆括号中、case后的表达式的要求牢记。

    2、 switch语句有break和没有break之间的区别,注意,只要匹配成功一次,后面不需要继续的匹配了,直接执行匹配的语句直到遇到break语句。

    3、 switch嵌套switch的题目是考试的重点,请多次练习。

    (1)以下程序运行后的输出结果是:2,1

    main()

    {

    int x=1,y=0,a=0,b=0;

    switch(x)

    {

    case 1: switch(y)

           {case 0: a++; break;

            case 1: b++; break;

           }

    case 2: a++;b++;break;

    }

    printf(”%d %d ”,a,b);

    }

    (2)

    有以下程序,程序运行后的输出结果是——A

    A、1            B、2             C、3             D、4

    main()

    {

    int a=15,b=21,m=0;

    switch(a%3)

    {

    case 0: m++;break;

    case 1: m++;

    switch(b%2)

           {default: m++;

            case 0: m++; break;

           }

    }

    printf(”%d ”, m);

    }

    第五节  goto语句

    知识点:goto是关键字;goto语句的含义;

    重要程度:

    1、goto语句

    goto语句的作用是,无条件的把程序的执行转向语句标号所在的位置。滥用goto语句将使程序的流程毫无规律,可读性差,对于初学者来说应尽量不用。(记住这句话就可以了!)

    goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。
    如: label: i++;
    loop: while(x<7);
    C语言不限制程序中使用标号的次数,但各标号不得重名。goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。
    goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
    但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
    .可以考虑使用goto的情形
    1.从多重循环中直接跳出
    很多人建议废除C++/C的goto语句,以绝后患。但实事求是地说,错误是程序员自己造成的,不是goto的过错。goto 语句至少有一处可显神通,它能从多重循环体中一下子跳到外面,用不着写很多次的break语句。例如:
    for(......){
    for(....){
    for(.....){
    // 如何冲出重重包围?
    }
    }
    }
    break;只能跳出单层的循环,return将整个函数都返回了,没法再继续了,显然也不行,所以我们想到了goto。如果是在陷入了很深层次的循环里想要跳出最外层的循环,用 goto 直接跳出却比用 break 一个循环一个循环地跳出要好得多。有人甚至形象比喻说:“就像楼房着火了,来不及从楼梯一级一级往下走,可从窗口跳出火坑。” 其实,你可以将 break 和 continue 理解成弱化了的 goto 语句。
    2. 出错时清除资源
    如果一个函数有多个出口,则在每个出口处,会产生巨大的退出代码,如下例一,每个函数只能有一个出口,所有的资源释放必须放在出口统一解决,那全部使用大括号,十几个,几十个if判断条件下来,你数数你的大括号有多深?这种代码可读性不好,一旦写错了,难于寻找错误。所有这些问题,一个goto就解决了。
    当程序要分配和清除资源时(像内存、或处理字形、窗口、打印机),这种情形下用goto通常是为了复制代码或清除资源。若遇到这种情况,程序员就要掂量是 goto 的缺点令人讨厌呢?还是复制代码那令人头痛的维护更讨厌呢?最后还是认为 goto 的缺点更可忍受。
  • 相关阅读:
    ini_set /ini_get函数功能-----PHP
    【转】那个什么都懂的家伙
    word 2007为不同页插入不同页眉页脚
    August 26th 2017 Week 34th Saturday
    【2017-11-08】Linux与openCV:opencv版本查看及库文件位置等
    August 25th 2017 Week 34th Friday
    August 24th 2017 Week 34th Thursday
    August 23rd 2017 Week 34th Wednesday
    August 22nd 2017 Week 34th Tuesday
    August 21st 2017 Week 34th Monday
  • 原文地址:https://www.cnblogs.com/zhugeanran/p/8442579.html
Copyright © 2011-2022 走看看