第三章 选择结构程序设计

第一节 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 部分可以省略,但一般情况下不省略。
    • 流程图示例:

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-faKQjNS0-1586181362647)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第三章\3-1-流程图.png)]
    • 代码示例:

      • #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语言中,满足条件,则结果称为“真”,不满足条件则称为“假”。

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

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n5etm2nC-1586181362648)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第三章\3-2-1-6种关系运算符.png)]

      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为假
  • 逻辑运算符的真值表

    • ab!a!ba&&ba||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)

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x3O4RZLd-1586181362649)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第三章\3-3-1优先级.png)]
  • 逻辑表达式

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

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

    • 代码示例

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

      • ab!a!ba&&ba||b
        非0非00011
        非000101
        0非01001
        001100
    • 注意:

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

      • (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语句的嵌套一般形式如下:

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lBZtTcT9-1586181362649)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第三章\3-5-1-嵌套.png)]
  • 应当注意if与else的配对关系。else总是与它上面的最近的未配对的if配对。

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

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

  • switch语句的一般形式:

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y7ujWwWJ-1586181362649)(E:\workspace\TyporaProjects\C笔记\网易-C程序设计第四版\images\第三章\3-6-switch.png)]

    • 说明:

      • (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;
        }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值