4

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

 6 months ago
source link: https://www.cnblogs.com/bett/p/18028037
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
pFp8UCq.jpg

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

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

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

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

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

3371071-20240222195130881-633723219.png

1. 逻辑运算符

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

1.1 逻辑取反运算符

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

!(变量名)

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

a !a

1.2 与运算符

在C语言中,并不支持数学上的且,而是由一个运算符&&代替的。比如说数学上的0<x<10写成C语言的形式就是x>0&&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<stdio.h>
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<stdio.h>
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<stdio.h>

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,输出:

3371071-20240222195131072-1022864878.png

2.4 if else的嵌套

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

#include <stdio.h>
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;
}

3371071-20240222195131264-1426933310.png

2.5 悬空的else

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

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

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
    else
		printf("haha\n");


	return 0;
}//输出什么???

输出结果:

3371071-20240222195131475-2000174845.png

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

这就是悬空 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;
}

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

3371071-20240222195131661-1732983061.png

为什么输入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<stdio.h>
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 <stdio.h>
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;
}

3371071-20240222195131845-1436118531.png

4.2 题目二

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

#include <stdio.h>
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;
}
3371071-20240222195132038-1655378170.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK