• 解密C语言选择结构:掌握条件语句与分支逻辑的利器


    pFp8UCq.jpg

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨

    🎈🎈养成好习惯,先赞后看哦~🎈🎈

    所属专栏:C语言学习
    贝蒂的主页:Betty‘s blog

    引言

    C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构。为什么有着三种结构呢,大家其实可以想象一下,生活中的绝大数事情都可以抽象着三种结构,而我们今天要给大家介绍的就是三大结构之一——选择结构

    选择结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。它的流程图大致如下:

    1. 逻辑运算符

    在讲解什么是选择结构前,我们要先了解一些C语言常见的逻辑运算符。

    1.1 逻辑取反运算符

    逻辑取反运算符的形式特别简单,只需要在需要进行取反操作的变量前+!:

    !(变量名)

    假设有变量a,它的取反规则如下:

    a !a

    1.2 与运算符

    在C语言中,并不支持数学上的且,而是由一个运算符&&代替的。比如说数学上的00&&x<10。

    假设有两个变量a,b,与运算符的运算规则如下:

    a b a&&b

    1.3 或运算符

    在C语言中,或者也有专门的运算符表示——||

    假设有两个变量a,b,或运算符的运算规则如下:

    a b a||b

    2. if......else语句

    2.1 if语句

    if语句是最简单选择结构语法之一,他的语法结构如下:

    if ( 表达式 )
    语句

    表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。

    C语言特别规定:非零为真,零为假。

    例⼦:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数

    #include
    int main()
    {
    	int num = 0;
    	scanf("%d", &num);
    	if (num % 2 == 1)
    		printf("%d 是奇数\n", num);
    	return 0;
    }
    
    • 首先输入一个值(num),然后进入if语句判断,如果num%2等于1,条件就为真,就会打印;反之,条件为假,就不会进入打印。

    • 特别注意:C语言中判断是否相等的运算符是==,=是赋值符号。

    2.2 else

    我们继续以上面例子为列,如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表
    ⽰呢?
    这⾥就需要 if...else... 语句了,语法形式如下:

    if ( 表达式 )
    语句1
    else
    语句2

    所以上面的例子可以改写成如下代码:

    #include
    int main()
    {
    	int num = 0;
    	scanf("%d", &num);
    	if (num % 2 == 1)
    		printf("%d 是奇数\n", num);
    	else
    		printf("%d 是偶数\n", num);
    	return 0;
    }
    
    • 默认在 if 和 else 语句中默认都只控制⼀条语句

    2.3 多个if else的使用

    if else 语句也可以多个同时使用,构成多个分支,形式如下:

    if(判断条件1){
    语句块1
    } else if(判断条件2){
    语句块2
    }else if(判断条件3){
    语句块3
    }else if(判断条件m){
    语句块m
    }else{
    语句块n
    }

    意思是,从上到下依次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,然后跳到整个 if else 语句之外继续执行其他代码。如果所有判断条件都不成立,则执行语句块n,然后继续执行后续代码。

    也就是说,一旦遇到能够成立的判断条件,则不再执行其他的语句块,所以最终只能有一个语句块被执行。

    我们以下面这段代码举个例子:

    #include
    
    int main()
    {
    	int age = 0;
    	scanf("%d", &age);
    	if (age > 0 && age < 18) {
    		printf("少年\n");
    	}
    	else if (age >= 18 && age < 30) {
    		printf("青年\n");
    	}
    	else if (age >= 30 && age < 45) {
    		printf("壮年\n");
    	}
    	else if (age >= 45 && age < 55) {
    		printf("中年\n");
    	}
    	else if (age >= 55 && age < 75) {
    		printf("老年\n");
    	}
    	else {
    		printf("老寿星\n");
    	}
    	return 0;
    }
    

    假设我们输入的是40,输出:

    2.4 if else的嵌套

    if else也能嵌套使用,也就是说if执行的语句中也可以包含if else语句。我们用判断三角形来具体说明这个问题:

    #include 
    int main()
    {
    	int a, b, c;
    	while(scanf("%d%d%d", &a, &b, &c)==3)
    	{
    		if (a + b > c && a + c > b && b + c > a) {
    			if (a == b && b == c) {
    				printf("是一个等边三角形");
    			}
    			else if (a == b || a == c || b == c) {
    				printf("是一个等腰三角形");
    			}
    			else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
    				printf("是一个直角三角形");
    			}
    			else {
    				printf("是一个普通三角形");
    			}
    		}
    		else {
    			printf("由%d,%d,%d三边组成的不是三角形", a, b, c);
    		}
    	}
    	return 0;
    }
    
    

    2.5 悬空的else

    在书写if....else语句时最好每一条语句后面都加上大括号

    至于为什么,我们可以以下面这段代码举例

    #include
    int main()
    {
    	int a = 0;
    	int b = 2;
    	if (a == 1)
    		if (b == 2)
    			printf("hehe\n");
        else
    		printf("haha\n");
    
    
    	return 0;
    }//输出什么???
    

    输出结果:

    为什么会什么结果都没有输出呢?

    这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。最下面的else其实是与if(b==2)这条语句配对的,而不是与if(a==1)配对,当a等于0,自然不会进入任何语句。

    3. switch语句

    在我们学习多个lf else语句时候就会会发现,如果条件多的话,整个选择结构就会变得很冗杂,所以C语言为了解决这个问题引入了switch,switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分支的 if else 语句。

    比如说下面这段代码就会显得十分冗余

    int main()
    {
    	int day = 0;
    	scanf("%d", day);
    	if(day == 1)
    		printf("星期一\n");
    	else if(day == 2)
    		printf("星期二\n");
    	else if (day == 3)
    		printf("星期三\n");
    	else if (day == 4)
    		printf("星期四\n");
    	else if (day == 5)
    		printf("星期五\n");
    	else if (day == 6)
    		printf("星期六\n");
    	else
    		printf("星期天\n");
    	return 0;
    }
    

    3.1 switch的基本规则

    switch的语法如下:

    switch (expression) {
    case value1: statement
    case value2: statement
    default: statement
    }

    switch语句必须遵循下面的规则:

    1. switch语句中的括号是一个常量表达式,必须是一个整型或枚举类型。

    2. 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。

    3.2 break的重要性

    学习完switch的语法之后,然后我们可以将最开始的例子改造

    int main()
    {
    	int day = 0;
    	scanf("%d", &day);
    	switch (day)
    	{
    	case 1:
    		printf("星期一\n");
    	case 2:
    		printf("星期二\n");
    	case 3:
    		printf("星期三\n");
    	case 4:
    		printf("星期四\n");
    	case 5:
    		printf("星期五\n");
    	case 6:
    		printf("星期六\n");
    	case 7:
    		printf("星期天\n");
    	}
    	return 0;
    }
    

    但是当我们一运行代码就会发现问题:

    为什么输入1反而后续的结果都输出了呢?

    原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。

    所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。

    当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

    改造代码后;

    int main()
    {
    	int day = 0;
    	scanf("%d", &day);
    	switch (day)
    	{
    	case 1:
    		printf("星期一\n");
    		break;
    	case 2:
    		printf("星期二\n");
    		break;
    	case 3:
    		printf("星期三\n");
    		break;
    	case 4:
    		printf("星期四\n");
    		break;
    	case 5:
    		printf("星期五\n");
    		break;
    	case 6:
    		printf("星期六\n");
    		break;
    	case 7:
    		printf("星期天\n");
    		break;
    	}
    	return 0;
    }
    

    3.3 default的使用

    在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。

    其语法如下:

    switch (expression) {
    case value1: statement
    case value2: statement
    default: statement
    }

    • switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏default ⼦句。

    就⽐如前⾯做的打印星期的练习,如果 day 的输⼊不是1~7的值,如果我们要提⽰:输⼊错误,则可以这样完成代码:

    #include
    int main()
    {
    	int day = 0;
    	scanf("%d", &day);
    	switch (day)
    	{
    	case 1:
    		printf("星期一\n");
    		break;
    	case 2:
    		printf("星期二\n");
    		break;
    	case 3:
    		printf("星期三\n");
    		break;
    	case 4:
    		printf("星期四\n");
    		break;
    	case 5:
    		printf("星期五\n");
    		break;
    	case 6:
    		printf("星期六\n");
    		break;
    	case 7:
    		printf("星期天\n");
    		break;
    	default :
    		printf("输入错误\n");
    		break;
    	}
    	return 0;
    }
    
    • 在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的。

    4. 综合练习

    4.1 题目一

    输入三个整数x,y,z,请把这三个数由小到大输出。

    #include 
    int main()
    {
        int x, y, z, t;
        printf("请输入三个数字:\n");
        scanf("%d%d%d", &x, &y, &z);
        if (x > y) 
        { /*交换x,y的值*/
            t = x; x = y; y = t;
        }
        if (x > z) 
        { /*交换x,z的值*/
            t = z; z = x; x = t;
        }
        if (y > z) 
        { /*交换z,y的值*/
            t = y; y = z; z = t;
        }
        printf("从小到大排序: %d %d %d\n", x, y, z);
        return 0;
    }
    

    4.2 题目二

    输入某年某月某日,判断这一天是这一年的第几天?

    #include 
    int main()
    {
        int day, month, year, sum, leap;
        printf("请输入年、月、日,格式为:年,月,日(2015,12,10)\n");
        scanf("%d,%d,%d", &year, &month, &day);  // 格式为:2015,12,10
        switch (month) // 先计算某月以前月份的总天数
        {
        case 1:
            sum = 0; 
            break;
        case 2:
            sum = 31; 
            break;
        case 3:
            sum = 59; 
            break;
        case 4:
            sum = 90;
            break;
        case 5:
            sum = 120;
            break;
        case 6:
            sum = 151;
            break;
        case 7:
            sum = 181; 
            break;
        case 8:
            sum = 212; 
            break;
        case 9:
            sum = 243;
            break;
        case 10:
            sum = 273; 
            break;
        case 11:
            sum = 304; 
            break;
        case 12:
            sum = 334; 
            break;
        default:
            printf("输入错误\n"); 
            break;
        }
        sum = sum + day; // 再加上某天的天数
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {// 判断是不是闰年
            leap = 1;
        }
        else {
            leap = 0;
        }
        if (leap == 1 && month > 2) 
        { // *如果是闰年且月份大于2,总天数应该加一天
            sum++;
        }
        printf("这是这一年的第 %d 天。", sum);
        printf("\n");
        return 0;
    }
    

  • 相关阅读:
    Servlet
    小鱼ROS
    教程图文详解 - 局域网与城城网(第四章)
    人机交互复习专题
    windows下用Java跑通spark官方文档的quick-start
    BlackBerry 软件全球现已部署超过2.15亿辆汽车
    计算机毕业设计java微信小程序毕设项目之ssm基于微信小程序的学生公寓生活管理系统
    【ros学习笔记】-9 ros基本概念
    酷柚易汛ERP - 盘点操作指南
    android自定义View: 九宫格解锁
  • 原文地址:https://www.cnblogs.com/bett/p/18028037