【C语言必知必会 | 第五篇】选择结构入门,这一篇就够了

引言

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。
此文为【C语言你还没卷起来?】系列之第五篇,介绍C语言的选择结构,结合专题优质题目,带领读者从0开始,深度掌握知识点。

在这里插入图片描述


1️⃣ 概念介绍

C语言的选择结构是一种编程结构,用于根据条件的真假来选择性地执行代码块。

我们也称选择结构为条件控制语句选择结构

在这里插入图片描述

条件控制语句选择结构分为if-else结构与switch-case结构

简单形式如下:

if(表达式) 
{
  语句
  }

其中表达式不限于逻辑表达式或关系表达式,可以是各种表达式,如算术表达式等。当表达式的值为非零时,结果为“真”;当表达式的值为零时,结果为“假”。

if-else结构
基本形式是:

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

当表达式的结果为真(非零)时,执行语句1,执行完后跳到下一语句。当表达式的结果为假(零)时,执行语句2,执行完后顺序执行下一语句。

else-if结构
形式如下:

if(表达式1) 语句1
else if(表达式2) 语句2
else if(表达式3) 语句3
……
……
else if(表达式n) 语句n
else 语句n+1

switch语句一般格式

switch(表达式)
{
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;case 常量表达式n:
语句n;
break;
default:
语句n+1;
break;
}

注意事项

case后面常量表达式的值必须互不相等,否则会出现互相矛盾的现象。其类型应该与switch后面表达式的类型相容。
例如不能出现两个case 1

case和常量表达式之间要有空格
case1是错的,case 1是对的

case和default出现可以在任何位置,其先后次序不影响执行结果,但习惯上将default放在switch-case结构的底部。

case提供了执行某一语句序列的入口,起着标号的作用;多个case可以执行同一语句序列。
每个case语句的结尾不要忘了加break,否则将导致多个分支重叠。

不要忘记最后的default分支。即使程序真的不需要default处理,也应该保留语句: default : break;


2️⃣代码过渡

在正式开始选择结构的代码实现之前,我们需要掌握解决问题的数学等思想应该如何向代码思想过渡。

举个例子:
求一个数x的绝对值
数学思想:若x小于0,则其绝对值为-x,否则为x

判断一个整数x是否为5的倍数
数学思想:若x%5等于0,则x是5的倍数,否则不是

将百分制的成绩转换成等级制,100~90->A
数学思想:若成绩≥90,并且成绩≤100,则为A

我们使用C语言解决上面的问题需要使用以下语言元素:
若…则…否则 对应 选择结构
小于等于 对应 关系运算符
并且 对应 逻辑运算符

以下为常见的关系运算符:

在这里插入图片描述在这里插入图片描述

当逻辑表达式成立时,为“真”,用1表示,否则为“假",用0表示。

举个例子:
设a为4,b为6,c为4

在这里插入图片描述
设a为4,b为6,c为5

在这里插入图片描述
注意事项
数学中的 a≤x≤b, 不能改写成C的 a<=x<=b,而应该是a<=x&&x<=b

采用“不完全计算”方法(有结论即停算) 例如a>0 || b!=5已经确定a>0,此时表达式的结果一定为真,不需要再判断b!=5的正确性了

其操作数均视为逻辑量,非0即真 例如(x=-1) && (y=2 )相当于1&&1


3️⃣知识点讲解

这一节我们将细致讲讲形式与执行过程、双分支if语句形式与执行过程、switch语句形式与执行过程

使用单分支的if 语句求表达式值,若为真则执行其内嵌的1条语句(若多条须用大括号引起,成为1条复合语句),否则执行if语句后的语句。

单分支的if 语句形式:

if( 表达式 )  
        语句

举个简单的例子:
要求输出2整数的较大值,我们可以先设两个变量x,y,把x的值赋值给max,如果y>max,就再把y的值赋值给max,如果y<=max,那么max仍然是最大的,最后只需要输出max的值即可。

if( y>max ) 
   max=y; 
   printf("%d\n", max);

双分支的if 语句形式:

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

表达式若为真,则执行if分支内嵌的语句1;否则执行else分支内嵌的语句2。

还是拿上面一题举例子,如果x>y,就把x赋值给max,否则把y赋值给max,使用以下代码:

if( x>y )
    max=x;
else    //相当于if(x <= y)
    max=y; 

注意: else 后无表达式 如else (x<=y)是错的

下面介绍if语句的常用代码块:

第一种

if( a>b) 
  t=a;      
  a=b;
  b=t;

这个代码块用于交换两个数的值,我们细致分析下
比如说a为5,b为4,如果a大于b,我们就把a的值赋值给t,这个时候t的值变为5,然后把b的值赋给a,这个时候a的值变为4,再把t的值赋给b,这个时候b的值变为5,结果为:a==4b==5

第二种

if( score<60 )    
      puts("E"); 
else if( score<70 ) 
      puts("D"); 
else
     puts("A"); 

当score小于60的时候输出E,当score大于等于60小于70的时候输出D,当score大于等于70的时候输出A

这样做的一个好处是我们不需要这样写:

if( score<60 )    
      puts("E"); 
if( score>=60 && score<70 ) 
      puts("D"); 
if(score>=70)
     puts("A"); 

一个简单的else就能帮助我们节省很多步骤

第三种,复杂的if语句

闰年的条件是(1)能被4整除,但不能被100整除;(2)能被400整除。

对应的语句为:(1)year%4==0 && year%100!=0
(2)year%400==0

整合起来就是:

 if( (year%4==0 && year%100!=0) || year%400 )
       printf("%d 是闰年。\n", year ); 
  else
      printf("%d 不是闰年。\n", year );

第四种,好用的条件表达式

max=(a>b) ? a: b;
printf("%d", max);

形式:表达式1 ?表达式2 :表达式3
特点:是C中唯一的3目运算符
求解:求式1,若为真则值为表达式2的值;否则值为表达式3的值
适用:常用于表示简单的双分支选择结构

举个例子:

如果a=5,b=3,那么max(a>b)?a:b的值就是5,因为5大于3,所以条件为真,返回a的值。
如果a=2,b=4,那么max(a>b)?a:b的值就是4,因为2不大于4,所以条件为假,返回b的值。

接着我们讲一讲switch语句形式与执行过程

switch语句是一种用于根据表达式值选择执行不同代码块的选择结构。 它的形式如下:

switch (表达式) {
    case1:
        // 如果表达式的值等于值1,则执行这里的代码
        break;
    case2:
        // 如果表达式的值等于值2,则执行这里的代码
        break;
    case3:
        // 如果表达式的值等于值3,则执行这里的代码
        break;
    // 可以有更多的case语句
    default:
        // 如果表达式的值没有与上面的任何值匹配,则执行这里的代码
}

switch语句的执行过程如下:

1.将表达式的值与每个case后面的值进行比较,从上到下逐个检查。
2.如果找到匹配的值,则从该位置开始执行与该case语句相关联的代码块,并且在执行完毕之后跳出switch语句。
3.如果没有找到匹配的值,即表达式的值与所有case后面的值均不匹配,则执行default标签下的代码块(如果有)。
4.如果没有default标签或者default标签后面的代码块执行完毕,程序将继续执行紧随switch语句的代码。

举个简单的例子:

    int num = 2;
    switch (num) {
        case 1:
            printf("数字是1\n");
            break;
        case 2:
            printf("数字是2\n");
            break;
        default:
            printf("数字不是1、2、3\n");
    }
    return 0;
}

由于num为2,对应case2,所以程序输出数字是2

需要注意的是:

  • 在每个case后面的值必须是常量表达式,且不允许重复
  • 每个case语句块末尾都要使用break语句,用于跳出switch语句,否则会继续执行下一个case的代码块,这可能造成错误。
  • 可以有多个case语句块与同一代码块相关联,它们会顺序执行,直到遇到break语句或者switch语句结束。

4️⃣编程实例

综上所述,选择结构是编程中常用的一种控制结构,用于根据条件的真假选择不同的执行路径。

接着我们通过编程实例,进行实战讲解。

题目要求:求一元二次方程的2实数根或2虚根(不考虑a=0的情况)。

例如:输入 a b c: 1 -2 1 ;输出 x1=1.000, x2=1.000
输入 a b c: 3 4 5 ;输出 x1=-0.667+1.106 i, x2=-0.667-1.106 i

1.解题思路

计算判别式 d,即 b*b - 4*a*c
使用 if 条件语句进行判断:

  • 若 d 大于零,则表示方程有两个不同实数根,使用 sqrt 函数计算 d 的平方根,并分别计算出两个实根 x1 和 x2,然后使用 printf 函数输出结果。
  • 若 d 小于或等于零,则表示方程没有实数根,使用 sqrt 函数计算 -d 的平方根并取虚部,然后计算出实部 x1,最后使用 printf 函数输出结果。

2.代码实现

 // 计算判别式 d = b^2 - 4ac
    d = (b * b - 4 * a *c);

    // 判断二次方程的根的情况
    if (d > 0) {
        // 若 d 大于 0,则有两个不同的实数根
        d = sqrt(d);
        x1 = (-b + d) / (2 * a);
        x2 = (-b - d) / (2 * a);
        printf("x1 = %.3f, x2 = %.3f\n", x1, x2);
    } else {
        // 若 d 小于等于 0,则有虚根
        d = sqrt(-d);
        x1 = -b / (2 * a);      // 实部
        x2 = d / (2 * a);       // 虚部
        printf("x1 = %.3f + %.3fi, x2 = %.3f - %.3fi\n", x1, x2, x1, x2);
    }

3.添加预处理命令等,将代码格式化

#include <math.h>
#include <stdio.h>

int main() {
    double a, b, c, d, x1, x2;

    // 提示用户输入 a、b、c 的值
    printf("Enter a b c: ");
    scanf("%lf %lf %lf", &a, &b, &c);

    // 计算判别式 d = b^2 - 4ac
    d = (b * b - 4 * a *c);

    // 判断二次方程的根的情况
    if (d > 0) {
        // 若 d 大于 0,则有两个不同的实数根
        d = sqrt(d);
        x1 = (-b + d) / (2 * a);
        x2 = (-b - d) / (2 * a);
        printf("x1 = %.3f, x2 = %.3f\n", x1, x2);
    } else {
        // 若 d 小于等于 0,则有虚根
        d = sqrt(-d);
        x1 = -b / (2 * a);      // 实部
        x2 = d / (2 * a);       // 虚部
        printf("x1 = %.3f + %.3fi, x2 = %.3f - %.3fi\n", x1, x2, x1, x2);
    }

    return 0;
}

编译运行结果:

在这里插入图片描述
通过使用 if 条件语句,程序能够根据不同的情况执行相应的代码,实现了根据判别式的值来判断二次方程的根的类型。

至此,选择结构的编程实例已讲解完成,读者需要躬身实践来掌握C语言选择结构相关知识点。


5️⃣总结

此文为 【C语言必知必会】系列第五篇 ,带领读者掌握C语言的选择结构,带领读者从0开始,深度掌握知识点。

专栏将提供优质C语言编程题,带领读者全方位掌握C语言,读者可订阅专栏持续跟进。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏,祝你平安喜乐。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值