欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第三章 选择结构程序设计

程序员文章站 2022-03-09 08:05:36
...

第一节 if语句

  • 3.1 if语句的一般形式

    • if 语句包含3中形式:

        1. if (表达式) 语句
        1. if (表达式) 语句1

        else 语句2

        1. if(表达式1) 语句1

        else if (表达式2) 语句2

        else if (表达式3) 语句3

        ··· ···

        else if (表达式m) 语句m

        else 语句m+1

    • 表达式:可以是关系表达式、逻辑表达式,甚至是数值表达式。

      • 关系表达式:两个数值进行比较的式子。
      • else - if 多分支语句:从前往后计算各个表达式的值,如果某个表达式的值为真,则执行对应的语句,并终止整个多分支结构的执行。如果上述所有表达式均不成立,即均为逻辑假时,则执行对应的 else 部分。else 部分可以省略,但一般情况下不省略。
    • 流程图示例:

      • 第三章 选择结构程序设计
    • 代码示例:

      • #include <stdio.h>
        int main() {
            int num_age;
            scanf("%d", &num_age);
            if (num_age < 12) 
                printf("是儿童");
            printf("判断结束");
            return 0;
        }
      • //判断是否是儿童-2
        #include <stdio.h>
        int main() {
            int num_age;
            scanf("%d", &num_age);
            if (num_age < 12) 
                printf("是儿童");
            else
            	printf("不是儿童");
            printf("判断结束");
            return 0;
        }
    • 练习1:有两个变量(a和b)通过scanf获取数据,通过比较,将最大的数存储到a变量中,将小的数存储到b变量中,并打印输出其内容。

      • #include <stdio.h>
        int main() {
        	int a, b, t;
        	printf("请输入两个数字:\n");
        	scanf("%d %d", &a, &b);
        	if (a < b) {
        		t = a;
        		a = b;
        		b = t;
        	}
        	printf("a = %d\nb = %d", a, b);
        	return 0;
        }
    • 练习2:人的年龄段可以划分为:0~12 儿童,12~18 青少年,18~30 青年,30~60 中年,60以上 老年

      #include <stdio.h>
      int main() {
      	int age;
      	printf("请输入年龄:\n");
      	scanf("%d", &age);
      	if (age > 0 && age <= 12)
      		printf("儿童");
      	else if (age >12 && age <= 18)
      		printf("青少年");
      	else if (age > 18 && age <= 30)
      		printf("青年");
      	else if (age > 30 && age <= 60)
      		printf("中年");
      	else if (age > 60)
      		printf("老年");
      	else
      		printf("年龄输入不符合规范,请重新输入正整数");
      	return 0;
      }

第二节 关系运算符和关系表达式

  • 用来对两个数值进行比较,即比较符,也称为关系运算符。在c语言中,满足条件,则结果称为“真”,不满足条件则称为“假”。

  • 关系运算符及其优先次序

    • 第三章 选择结构程序设计

      1. 前4种关系运算符(<, <=, >, >=)的优先级别相同,后2种也相同。前4种高于后2种。例如,“>”优先于“==”,而“>”与“<”优先级相同。
      2. 关系运算符的优先级低于算术运算符。
      3. 关系运算符的优先级高于赋值运算符。
    • 例如:

      • 表达式 含义 解释
        c>a+b 等效于c>(a+b) 关系运算符的优先级低于算术运算符
        a>b ==c 等效于(a>b) ==c 大于运算符>的优先级高于相等运算符==
        a==b<c 等效于a==(b<c) 小于运算符<的优先级高于相等运算符==
        a=b>c 等效于a=(b>c) 关系运算符的优先级高于赋值运算符
    • 练习:定义a,b,c三个变量,比较a和b的大小,将最小的数保存到c中,如果a和b相等的时候,c存储a和b任何一个数据,如果a和b相等的时候,提示a和b相等,如果a和b不相等的时候,提示a和b不相等。

      • #include <stdio.h>
        int main() {
        	int a, b, c;
        	printf("请输入两个数字:\n");
        	scanf("%d %d", &a, &b);
        	if (a >= b)
        		c = b;
        	else
        		c = a;
        	if (a == b) {
        		c = a;
        		printf("a == b\n");
        	}
        	else
        		printf("a != b\n");
        	printf("c = %d\n", c);
        	return 0;
        }
  • 关系表达式: 用关系运算符将两个数值或数值表达式连接起来的式子 。

    • 关系表达式的值是一个逻辑值,即“真”或“假”。在c的逻辑运算中,1代表真,0代表假;例如:5==3 假 5>=0 真

第三节 逻辑运算符和逻辑表达式

  • 3种逻辑运算符:与(AND),或(OR),非(NOT)。

  • 逻辑运算符及其含义

    • 运算符 含义 举例 说明
      && 逻辑与 a&&b 如果a和b都是真,则结果为真,否则为假
      || 逻辑或 a||b 如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假
      逻辑非 !a 如果a为假,则!a为真,如果a为真,则!a为假
  • 逻辑运算符的真值表

    • a b !a !b a&&b a||b
  • 代码示例

    • #include <stdio.h>
      int main() {
          int a, b;
          scanf("%d %d", &a, &b);
          if (a < 100 && b < 100) {
              printf("a和b的值都小于100\n");
          }
          if (a < 100 || b < 100) {
              printf("a和b的值有一个小于100\n");
          }
          if (!(a > 100)) {
              printf("a的值不大于100\n");
          }
          return 0; 
      }
  • !a && b || x > y && c ==> ((!a) && b) || ((x > y) && c)

    • 第三章 选择结构程序设计
  • 逻辑表达式

    • 用逻辑运算符将关系表达式或其他逻辑量连接起来的式子。

    • 逻辑表达式的值是一个逻辑量“真”或“假”。C语言编译系统在表示逻辑运算结果时,用数值1代表“真”,用0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。

    • 代码示例

      • #include <stdio.h>
        int main() {
            int a = 4, b = 5;
            if (a) {
                printf("量为真\n");
                return 0;
            }
        }
    • 逻辑运算的真值表进化版

      • a b !a !b a&&b a||b
        非0 非0 0 0 1 1
        非0 0 0 1 0 1
        0 非0 1 0 0 1
        0 0 1 1 0 0
    • 注意:

      • 在逻辑表达式的求解中,不是所有的逻辑运算符都会被执行,只有在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
    • 举例:

      • (1)a && b && c 如果a为假,就不会判别b和c,因为只有a为真(非0)时,才需要判别b的值。只有当a和b都为真的情况下才需要判别c的值。如果a为真,b为假,不判别c。

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

    • 代码示例

      • #include <stdio.h>
        int main() {
            int a = 1, b = 2, c = 3, d = 4;
            if (a > b && c > d) {
                printf("该语句模块被执行\n");
            }
            return 0;
        }
    • 练习:判断年份是否为闰年

      • /*
        闰年:能被400整除 || 能被4整除但是不能被100整除
        */
        #include <stdio.h>
        int main() {
        	int year;
        	printf("请输入一个年份:\n");
        	scanf("%d", &year);
        	if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
        		printf("%d年是闰年\n", year);
        	}
        	else
        		printf("%d年不是闰年\n", year);
        	return 0;
        }
    • 关系表达式和逻辑表达式的值是0和1,而且在判断一个量是否为真时,以0代表假,以非0代表真,那么就可以理解为什么在if语句中表达式可以是任何数值表达式。

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

  • 条件表达式的一般形式:表达式1 ? 表达式2 : 表达式3

    • ​ 表达式的结果是否为真?如果为真,则执行表达式2,否则执行表达式3。
  • 条件运算符:由两个符号( ? 和 : )组成,必须一起使用,要求有3个操作对象,称为三目运算符,它是C语言中唯一的三目运算符。

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

    • 根据表达式1的结果,将表达式2或3的结果赋值给变量c。

    • 代码示例:

      • #include <stdio.h>
        int main() {
        	int a;
        	scanf("%d", &a);
        	a < 10 ? printf("a小于10") : printf("a不小于10");
        	return 0;
        }
    • 练习:输入一个字符,判断是否为大写字母,如果是,将它转换为小写字母,否则不转换,输出最后得到的字符

      • #include <stdio.h>
        int main() {
        	char c;
        	scanf("%c", &c);
        	c = (c >= 'A' && c <= 'Z') ? c + 32 : c;
        	printf("%c", c);
        	return 0;
        }

第五节 选择结构的嵌套

  • 在if语句中又包含一个或多个if语句称为if语句的嵌套。

  • 多分支结构就属于if语句的嵌套。if语句的嵌套一般形式如下:

    • 第三章 选择结构程序设计
  • 应当注意if与else的配对关系。else总是与它上面的最近的未配对的if配对。

第六节 用switch语句实现多分支选择结构

  • if语句只有两个分支可以选择,如果要实现多个分支,使用起来比较复杂,嵌套的层数比较多,大大降低了代码的可读性。C语言提供了switch语句直接处理多分支选择。

  • switch语句的一般形式:

    • 第三章 选择结构程序设计

    • 说明:

      • (1)switch括号中的表达式,值类型应为整数类型(包括字符型)。

      • (2)switch下面的花括号是一个复合语句,这个复合语句包含若干语句,它是switch语句的语句体。语句体内包含多个以关键字case开头的语句行和最多一个以default开头的行。case后面跟一个常量(或常量表达式),如:case ‘A’,它们和default都是起标号(label,或称标签、标记)的作用,用来标志一个位置。执行switch语句时,先计算switch后面的”表达式“的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。

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

      • (4)各个case标号出现次序不影响执行结果。例如,可以先出现default标号,再出现” case ‘D’ : ··· “,然后是” case ‘B’ : ··· “。

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

      • (6)case标号只起标记的作用。在执行switch语句时,根据switch表达式的值找到匹配的入口标号,并不在此进行条件检查,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断(一般情况下,在执行一个case子句后,应当用break语句终止该条switch子句的执行。最后一个case子句(今为default子句)中可不必加break语句)。

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

      • (8)多个case标号可以共用一组执行语句,如:

        • case 'A':
          case 'B':
          case 'C': printf(">60\n");break;
          ···
    • 代码示例:

      • #include <stdio.h>
        int main() {
        	char c;
            printf("请输入等级:\n");
        	scanf("%c", &c);
        	swit ch (c) {
        	case 'A':printf("85分以上\n"); break;
        	case 'B':printf("70`84分\n"); break;
        	case 'C':printf("60`69分\n"); break;
        	case 'D':printf("60分以下\n"); break;
        	default:printf("输入错误,请重新输入");
        	}
        	return 0;
        }
    • 练习:买鞋,12双不打折,34双9折,56双8折,78双7.5折,9双以上7折

      • #include <stdio.h>
        int main() {
        	int num, price;
        	printf("请输入要买的鞋的数量和单价:\n");
        	scanf("%d %d", &num, &price);
        	
        	switch ((num + 1) / 2) {
        	case 1:printf("不打折,总价为:%f\n", num * price); break;
        	case 2:printf("9折,总价为:%f\n", num * price * 0.9); break;
        	case 3:printf("8折,总价为:%f\n", num * price * 0.8); break;
        	case 4:printf("7.5折,总价为:%f\n", num * price * 0.75); break;
        	default:printf("7折,总价为:%f\n", num * price * 0.7); 
        	}
        	return 0;
        }