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

简介: 【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 (表达式) {
    case 值1:
        // 如果表达式的值等于值1,则执行这里的代码
        break;
    case 值2:
        // 如果表达式的值等于值2,则执行这里的代码
        break;
    case 值3:
        // 如果表达式的值等于值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语言,读者可订阅专栏持续跟进。

目录
相关文章
|
1月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
59 2
|
1月前
|
网络协议 编译器 Linux
【C语言】结构体内存对齐:热门面试话题
【C语言】结构体内存对齐:热门面试话题
|
17天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
59 16
|
1月前
|
存储 Java 编译器
初识C语言1——C语言入门介绍
初识C语言1——C语言入门介绍
30 1
|
1月前
|
编译器 C语言 Python
C语言结构
C语言结构
17 0
|
1月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
2月前
|
存储 编译器 程序员
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
95 10
|
2月前
|
C语言
C语言程序设计核心详解 第四章&&第五章 选择结构程序设计&&循环结构程序设计
本章节介绍了C语言中的选择结构,包括关系表达式、逻辑表达式及其运算符的优先级,并通过示例详细解释了 `if` 语句的不同形式和 `switch` 语句的使用方法。此外,还概述了循环结构,包括 `while`、`do-while` 和 `for` 循环,并解释了 `break` 和 `continue` 控制语句的功能。最后,提供了两道例题以加深理解。
|
2月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
2月前
|
C语言
C语言程序设计核心详解 第三章:顺序结构,printf(),scanf()详解
本章介绍顺序结构的基本框架及C语言的标准输入输出。程序从`main()`开始依次执行,框架包括输入、计算和输出三部分。重点讲解了`printf()`与`scanf()`函数:`printf()`用于格式化输出,支持多种占位符;`scanf()`用于格式化输入,需注意普通字符与占位符的区别。此外还介绍了`putchar()`和`getchar()`函数,分别用于输出和接收单个字符。