zoukankan      html  css  js  c++  java
  • 第4章 简单的C程序设计——选择结构程序设计

    在顺序结构中,各语句是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的,不必作任何判断。实际上,很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作选择其一。

    4.1选择结构和条件判断

    例:定义一个函数,如果饿了吃饭。如果不饿不吃饭。

     1 #include <stdio.h>
     2 int main()
     3 {
     4     int a;
     5     printf("请输入一个数 0或1 ,0代表不饿,1代表饿了
    ");
     6     scanf("%d",%a);
     7     if(a!=0||a!=1)
     8         printf("输入错误
    ");
     9     if(a==1)
    10         printf("饿了,吃饭。。。
    ");
    11     else
    12         printf("不饿,不吃饭。。。
    ");
    13     return 0;
    14 }
    View Code
    1 若输入0则,输出“不饿,不吃饭。。。”
    2 若输入1则,输出“饿了,吃饭。。。”
    3 若输出其他值,输出”输入错误“
    code result

    C语言有两种选择语句:(1)if语句,用来实现两个分支的选择结构;(2)switch语句,用来实现多分支的选择结构。

    4.2 用if语句实现选择结构

    4.2.1 用if语句处理选择结构举例

    例:实现两个变量的交换

     1 #include <stdio.h>
     2 int main()
     3 {
     4     int a,b,temp;
     5     printf("请输入两个数a b
    ");
     6     scanf("%d%d",a,b);
     7     printf("你输入的值a=%d,b=%d
    ",a,b);
     8     printf("正在交换两个数的位置
    ");
     9     temp = a;
    10     a = b;
    11     b = temp;
    12     printf("交换后的值a=%d,b=%d
    ",a,b);
    13     return 0;
    14 }
    View Code
    1 若输入1,2;则输出:
    2 {
    3     请输入两个数a b
    4     你输入的值a=1,b=2
    5     正在交换两个数的位置
    6     交换后的值a=2,b=1
    7 }
    Code Result

    4.2.2 if语句的一般形式

    if语句的一般形式如下:

    if(表达式) 语句1

             [else 语句2]

    if语句中的“表达式”可以使关系表达式、逻辑表达式,甚至是数值表达式。

    关系表达式就是两个数值进行比较的式子。

    根据if语句的一般形式,if语句可以写成不同的形式,最常用的优以下3中形式:

    (1)if(表达式)

    语句1[复合语句]           (没有else子句部分)

    (2)if(表达式)                             (有else子句部分)

             语句1[复合语句] 

    else

             语句2[复合语句] 

    (3)if(表达式1)         语句1[复合语句]  (在else部分又嵌套了多层的if语句)

      else if(表达式2) 语句2[复合语句]        

      else if(表达式3) 语句3[复合语句]        

             …                      …

    else if(表达式m) 语句m[复合语句] 

    else                            语句m+1[复合语句]    

    注意:复合语句应当用花括号括起来。{} 花括号括起来的多条语句称为复合语句。

    4.3 关系运算符和关系表达式

    在C语言中,比较符(或称比较运算符)称为关系运算符。所谓“关系运算”就是“比较运算”,将两个数值进行比较,判断其比较的结果是否符合给定的条件。

    4.3.1 关系运算符机器优先次序

    C语言提供6中关系运算符:

    ①<  (小于)

    ②<=         (小于或等于)

    ③>  (大于)

    ④>=         (大于或等于)

    ⑤==         (等于)

    ⑥!= (不等于)

    ①②③④优先级相同(高),⑤⑥优先级相同(低)

    关于优先次序:

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

    (2)关系运算符的优先级低于算术运算符

    (3)关系运算符的优先级高于赋值运算符

    4.3.2 关系表达式

    用关系运算符将两个数值或数值表达式连接起来的式子,称关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。

    在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”。更准确来说,是“!0”代表真,“0”代表假。

    4.4 逻辑运算符和逻辑表达式

    4.4.1 逻辑运算符及其优先次序

    有3中逻辑运算符:与(AND) 或(OR) 非(NOT)。注意:在C语言中不能在程序中直接用AND、OR、NOT作为逻辑运算符,而是用其他符号代替。C逻辑运算符及其含义如下:

    “&&”和“||”是双目(元)运算符,它要求有两个运算对象(操作数);“!”是一目(元)运算符,只要求有一个运算对象。逻辑运算真值表:

    按以下的优先次序:

    (1)!(非)->&&(与)->||(或),即“!”为三者中最高的

    (2)逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。

    4.4.2 逻辑表达式

    逻辑表达式的值应该是一个逻辑量“真”或“假”。

    实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0的整数,也可以是字符型、浮点型、枚举型或指针型的纯量型数据。(关于纯量型的讲解,在本人博客里C Language的第2章里有讲解)系统最终以0和非0来判定他们属于“真”或“假”。逻辑运算的真值表(用0和非0表示的另一种格式):

    在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符;如

    (1)a&&b&&c。只有a为真(非0)时,才需要判别b的值。只有当a和b都为真的情况下才需要判别c的值。如果a为假,就不必判断b和c的值(此时整个表达式已确定为假)。换个说法,就是a若为假,则b和c被短路了,不会被执行。

    (2)a||b||c。只要a为真(非0)是,就不必判断b和c。只有a为假,才判别b。a和b都为假才判别c。

    4.4.3 逻辑型变量

    这是C99有所增加的一种数据类型。可将关系运算和逻辑运算的结果存到一个逻辑变量中,以便于分析和运算。定义逻辑变量用类型符_Bool.

    float score;

    scanf(“%f”,&score);

    _Bool a ,b;                                 //a和b被定义为逻辑型变量

    a = score>=60;                                   //将关系表达式score>=60的值赋给逻辑变量a

    b = score<=69;                                   //将关系表达式score<=60的值赋给逻辑变量b

    if(a&&b)                                     //如果a和b均为真,输出分数等级为C

             printf(“The grade is C ”);

       如果在源文件中用#include指令包含了头文件stdbool.h,那么上面的程序段可以写成:

    float score;

    scanf(“%f”,&score);

    bool a ,b;                           //a和b被定义为逻辑型变量

    a = score>=60;                                   //将关系表达式score>=60的值赋给逻辑变量a

    b = score<=69;                                   //将关系表达式score<=60的值赋给逻辑变量b

    if(a&&b)                                     //如果a和b均为真,输出分数等级为C

             printf(“The grade is C ”);

    注意:在使用bool类型时,要先了解自己所用的编译系统能否允许使用逻辑型变量bool和true和false.

    4.5 条件运算符和条件表达式

    有一种if语句,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值,如:

    if(a>b)

             max = a;

    else

             max = b;

    以上的if语句可以改写为:

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

    条件运算符有两个符号(?和:)组成,必须一起使用,要求有3个操作对象,称为三目(元)云三幅,它是C语言中唯一的一个三目运算符。

    条件表达式的一般形式为:

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

    执行过程:先计算出表达式1的值,若为非零(真),则执行表达式2;否则,执行表达式3.

    说明:

    (1)条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假)则求解表达式3,表达式3的值就作为整个条件表达式的值。

    (2)条件运算符优先于赋值运算符,因此复制表达式的求解过程是先求解条件表达式再将它的值赋给max

    条件运算符的优先级别比关系运算符和算术运算符都低。

    例:输入一个字符,判别它是否为大写字母,若是,则转换为小写字母。

    #include <stdio.h>

    int main()

    {

             char ch;

             scanf(“%c”,&ch);

             ch = (ch>=’A’&&ch<=’Z’)?(ch+32):ch;

             printf(“%c ”,ch);

             return 0;

    }

    运行结果 A 回车 a

    4.7选择结构的嵌套

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

    if()

             if()   语句1

             else()       语句2

    else

             if()            语句3

             else()       语句4

    应当注意,if与else的配对关系。else总是与它上面的最近的未配对的if配对。如:

    if()

             if()    语句1

    else

             if()    语句2

    else          语句3

    有些编程者会把else写在与第1个if(外层if)同一列上,意图是使else与第1个if对应,但实际上else是与第2个if配对,因为它们相距最近。

    为了避免二义性的混淆,最好使内嵌if语句也包含else部分。如:

    if()

    {

             if() 语句1

    }

    else 语句2

    这时“{}”限定了内嵌if语句的范围,因此else与第一个if配对。

    4.7用switch语句实现多分支选择结构

    C语言提供switch语句直接处理多分支选择。

    switch语句是多分支选择语句。

    switch渔具店作用是根据表达式的值,是流程跳转到不同的语句。switch语句的一般形式如下:

    switch(表达式)

    {

             case 常量1 : 语句1

    case 常量1 : 语句1

             …                     

             case 常量n : 语句n

             default :      语句n+1

     

    }

    说明:

    (1)switch后面的括号内的“表达式”,其值的类型应为整数类型(包括字符型)

    (2)switch下面的花括号内是一个复合语句。这个复合语句包括若干语句,它是switch语句的语句体。语句体内包含多个以关键字case开头的语句行和最多一个以default开头的行。

    case后面跟一个常量(或常量表达式),如:case ‘A’ ,它们和default都是标号(label或称标签、标记的作用,用来标志一个位置。执行switch语句时,先计算switch后面的“表达式”的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。换句话说,就是表达式和case后面的常量比较,有适配的就执行对应的语句;如果case没有匹配的常量,就执行default后面的语句。

    (3)可以没有default标号,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句。

    (4)各个case标号出现次序不影响执行结果。如,可以先出现default标号,然后再出现case标号。

    (5)每一个case常量必须互不相同;否则就会出现相互矛盾的现象(对switch表达式的同一个值,有两种或多种执行方案)

    (6)case标号只起标记的作用。如果在个case子句中没有break语句,则会连续输出剩下从case标号对应的语句,直至遇到break或者结束switch选择分支。

    注意:一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构,即终止switch语句的执行。最后一个case子句(或者default子句)中可不必加break语句,因为流程已到了switch结构的结束处。

    (7)在case子句中虽然包括了一个以上执行执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然也可以加上花括号。

    (8)多个case标号可以共用一组执行语句。

    例:case ‘A’

             case ‘B’

             case ‘C’ : printf(“>60 ”);break;

    当值为’A’ ’B’ ’C’时,都会执行同一组语句,输出“>60”,然后换行。

    例:

     1 #include <stdio.h>
     2 
     3 int main()
     4 
     5 {
     6 
     7     char ch;
     8 
     9     ch = getchar();
    10 
    11     switch(ch)
    12 
    13     {
    14 
    15          case 'a':
    16 
    17          case 'b':
    18 
    19          case 'c': {
    20 
    21                       printf("a");
    22 
    23                       printf("b");
    24 
    25                       printf("c");
    26 
    27                     }
    28 
    29     }  
    30     return 0;
    31 
    32 }
    View Code

    运行结果:输入a 输出结果为abc;

       

  • 相关阅读:
    vue 移动端ui框架
    vue ESLint自动修复
    vue 隐藏滚动条
    生动形象地理解async await
    vue中的slot与slot-scope
    爬虫利器 puppeteer
    vue实例的生命周期
    vue 监听滚动事件,实现动态锚点
    转:视觉中国的NoSQL之路:从MySQL到MongoDB
    转:你需要知道的NoSQL数据库10件事
  • 原文地址:https://www.cnblogs.com/HOsystem/p/10759575.html
Copyright © 2011-2022 走看看