C语言基础第5天: 分支结构

C语言基础:第5天笔记

内容提要

  • 分支结构
    • 条件判断
    • 用if语句实现分支结构
    • 用Switch语句实现分支结构

分支结构

问题抛出

我们在程序设计往往会遇到如下问题,比如下面的函数的计算:

在这里插入图片描述

也就是我们必须要通过一下条件的结果来选择下一步的操作,算法上属于一个分支结构,C语言中实现分支结构主要使用if语句

条件判断

根据某个条件成立与否,决定是否执行指定的任务(操作)

在这里插入图片描述

条件判断的结果是逻辑值(布尔类型,也就是说分支语句的条件可以使用关系表达式和逻辑表达式),在程序中用真(1)和假(0)来表示

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

关系运算符是用来进行比较的符号,C语言中提供了六种关系运算符

在这里插入图片描述

关系表达式

关系表达式是指用关系运算符将两个表达式链接起来组成有意义的式子

在这里插入图片描述

问题抛出

有时,只用一个简单的关系表达式无法完整的表达一个条件:

在这里插入图片描述

if(x!=0 && a!=0) if(x!=0)&&(a!=0)

其中的条件需要用逻辑表达式来表示 : x!=0 a!=0.&&就是一种逻辑运算符.

逻辑运算及其表达式

逻辑运算符是构成复杂的复合条件的运算符

C语言中提供了3种逻辑运算符:

在这里插入图片描述

逻辑表达式

在这里插入图片描述

用逻辑运算符将关系表达式或逻辑表达式链接起来的构成有意义的式子

在这里插入图片描述

逻辑表达式中各种运算符的优先级顺序如下:

!(逻辑非)→算术运算符(±*/%)→关系运算符(> < >= !=)→&&和||→赋值运算符(= +=)

C语言编译系统在表示逻辑运算的结果时,用 1表示真,用0表示假

案例

假设a=4 b=5,则

!a            --0
a && b        --1
a || b        --1
!a || b       --1

小贴士:

实际上,逻辑运算符两侧的运算对象不但是0和1,或者是0和非0,而且也可以是字符型,实型和指针型等.系统最终是以0和非0来判断他们的真假的,例如

c && d结果为1

用if语句实现分支结构

单分支:if…
  • 语法:

    //语法1:可以舍弃{}
    if (条件表达式)
    	单语句;
    	
    //语法2: 必须保留{}
    if(条件表达式)
    {
    	单语句或者复合语句;
    }
    

    流程图:

在这里插入图片描述

  • 功能
    • 若表达式值为真(非0),则执行表达式后面的语句,执行完该语句继续执行if语句后的代码
    • 若表达式值为假(0),则不执行表达式后面的语句,而直接if语句后面的语句

​ 说明:

​ 如果表达式后面的是复合语句,则要用一对{}括起来,单语句可有可无

  • 案例:

    • 要求:计算并输出下列分段函数的值:

      在这里插入图片描述

流程图

在这里插入图片描述

  • 代码:

  • #include <stdio.h>
    int main(int argc,char *argv[])
    {
    	// 创建两个变量,用来存储两个操作数
    	double x,y = -2;
    	// 从控制台输入x
    		printf("请输入一个数,作为x的值:\n");
    	scanf("%lf",&x);
    	// 校验
    	if (x >= 0) y = 2;
    	printf("x=%lf,y=%lf\n",x,y);
        
    	return 0;
    }
    

    在这里插入图片描述

    案例:

    需求:有abc三个数,要求从控制台输入,求出最大值

    分析:

    1. 通过控制台输入abc的值
    2. 创建一个变量max,用来存放abc中的最大值,默认a是最大值(这样可以减少一次判断)
    3. 让bc和max比较,将最大值存入max

代码:

#include <stdio.h>
int main(int argc,char *argv[])
{
// 创建四个变量a,b,c,max
int a,b,c,max;
// 通过键盘录入数据给a,b,c
printf("请输入三个整数:\n");
scanf("%d%d%d",&a,&b,&c);
// 默认a是最大值
max = a;
// 让最大值分别和b和c比较
if (max < b) max = b; // b是a,b中的最大值
if (max < c) max = c; // 其实就是a,b中的最大值和c比较,得到三者中的最大值
printf("%d,%d,%d中的最大值是%d\n",a,b,c,max);
return 0;
}
image-20250212090547778

有可能产生的问题:

  1. scanf()同时输入多个变量时,默认使用空格 Tab键 回车进行区分

  2. 在变量赋值前使用变量,导致运算结果错误,(变量未赋值前,系统会给变量分配随机值)

    双分支: if…else

    语法:

    //语法1:舍弃{}
    if (表达式)
        单语句1;
    else
        单语句2;
    az
    
    //语法2:保留{}
    if(条件表达式)
    {
        单语句或复合语句1;
    }
    else
    {
        单语句或复合语句2;
    }
    

    注意else语句本身不能单独使用,必须依赖于if使用

流程图:

在这里插入图片描述

功能:

若表达式的值为1 ,则执行语句1:否则执行语句2,不管条件表达式成不成立都要执行一个语句,其次需要注意的是,语句1和语句2都可以是但语句或者复合语句

说明:

if…else…结果可以实现双分支结构,c语言允许进行嵌套,即在语句1与语句2中又可以包含完整的if语句或者if…else…语句,并且这种嵌套可以多层,(为了保证程序的执行效率,建议不要超过四层)利用if…else…结构的嵌套,可以实现多分支选择结构

案例:

  • 需求: 计算并谁出下列分段函数的值"

    在这里插入图片描述

  • 流程图

在这里插入图片描述
20250211113105744.png&pos_id=img-s8tQDJBE-1739526816042)

代码:

#include <stdio.h>
int main(int argc,char *argv[])
{
// 创建两个变量存储x,y
int x,y;
// 通过键盘录入x
printf("请输入一个整数:\n");
scanf("%d",&x);
// 校验
if (x < 0)
y = -2;
else
y = 2;
// 打印输出测试结果
printf("x=%d,y=%d\n",x,y);
return 0;
}

在这里插入图片描述

三目运算符

语法:

表达式1?表达式2.表达式3

u 如果表达式1的结果为真,就执行表达式2,否则就执行表达式3

​ 三目运算运算符的写法实际上就是单语句的双分支的缩略写法

案例:

  • 需求:将上面双分支的案例改造为三目运算符的写法

  • 代码:

多分支: if…else if…else…

语法:

//写法1:嵌套(if..else)
if(表达式)语句1;
else 
    if(表达式2)语句2;
		...
            else
                if(表达式n)语句n;
				else 语句n+1;


//写法2:并列if...else if...else(推荐)
if (表达式1) 语句1;
else if (表达式2) 语句2;
...
else if (表示式n) 语句n;
else 语句n+1

流程图:
在这里插入图片描述

注意:多分支中,同以时刻只能满足一个分支.

案例:

  • 需求: 根据学生的成绩,对学生进行分级:

    • 成绩 >= 90 A

    • 成绩 >= 80 B

    • 成绩 >= 60 C

    • 成绩 < 60 D

      代码:

      #include <stdio.h>
      // 方式1:借助于执行顺序,减少判断条件
      int if_test1()
      {
      // 创建一个变量,用来存储输入的成绩
      int score;
      // 通过键盘录入成绩
      printf("请输入一个整数:\n");
      scanf("%d",&score);
      // 校验
      if (score >= 90) printf("A\n");
      else if (score >= 80) printf("B\n");
      else if (score >= 60) printf("C\n");
      else printf("D\n");
      }
      // 方式2:不借助执行顺序,做更精确的判断
      int if_test2()
      {
      // 创建一个变量,用来存储输入的成绩
      int score;
      // 通过键盘录入成绩
          printf("请输入一个整数:\n");
      scanf("%d",&score);
      // 校验
      if (score >= 60 && score < 80) printf("C\n");
      else if (score >= 80 && score < 90) printf("B\n");
      else if (score >= 90) printf("A\n");
      else printf("D\n");
      }
      int main(int argc,char *argv[])
      {
      if_test1();
      if_test2();
      return 0;
      }
      
      if…else结构注意点
if语句的嵌套:

语法:

if (..)
    if(..) 语句1else	语句2else
    if (..)语句3else	语句4

注意:

1. else总是与前面最近的未配对的if配对使用
1. 可通过增加{}来确定配对关系

小贴士:

如何拆出一个三位数中的每一位,

实现:123

个位:123%10=3

十位:123%100/10=2

百位:123/100=1

水仙花数

解释:一个数各位数的平方和等于这个数本身复合这种规则的数叫做水仙花数

用switch语句实现分支结构

我们可以使用 实现多分支选择结构(多分支也被称作多路分支)

语法:

switch(表达式) //表达式的结果只能是字符或者整型
{
    case 常量表达式1: // 这里一般使用 字面量 或者 符号常量 或者 枚举
        语句1:
        break;
    case 常量表达式2:
        语句2;
        break;
    ...
     case 常量表达式n:
        语句n;
        break;
    default:
        语句n+1;
        break; // 一般省略
}
     
        
}

在这里插入图片描述

说明:

  1. switch后括号内的表达式可以是任意类型的表达式,但是表达式的值必须是整型,字符型,枚举

  2. 若表达式的值与某个常量表达式的值相等时,执行此case后面的语句:若没有相等的值时,执行default后面的语句

  3. 每个case后面的常量表达式的值必须不相同,否则出现矛盾

  4. 各个case和default出现的次序不影响执行结果

  5. case后面的语句中,如果没有break语句,则执行完本case后的语句后会接着执行下面的case直到遇到下一个break

    案例:

    分析:

    设分段原则如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值