c语言基础:第05天笔记

内容提要

  • 分支结构

    • 条件判断

    • 用if语句实现分支结构

    • 用switch语句实现分支结构

分支结构

问题抛出

我们在程序设计往往会遇到如下问题,

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

条件判断

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

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

面试题:

①c语言中,条件表达式支持任意类型的表达式,也就是支持关系、逻辑、赋值、算术等表达式,但实质上有意义的表达式只有关系表达式和逻辑表达式。

②C语言中,条件表达式中,可用非0表示,用0表示假,但是底层是使用0和1表示真假。

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

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

关系表达式

关系表达式 = 关系运算符 + 表达式(操作数)。

在C语言中,用1(非0)表示关系表达式的值为真(条件成立),0表示关系表达式的值为假(条件不成立),即关系表达式的值要么为1(条件成立),要么为0(条件不成立)

问题抛出

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

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

逻辑运算及其表达式
逻辑运算符及其优先级
  • 逻辑运算符是构成复杂的复合条件的运算符。

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

逻辑表达式
ab!a!ba&&ba||b
110011
100101
011001
001100

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

 求闰年:(year % 4 == 0 && year % 100 !=0) || year % 400 == 0

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

①!(逻辑非)

②算术运算符(*、/、%>+、-)

③关系运算符(>、<、>=、<=>==、!=)

④&&(逻辑与)和||(逻辑或)

⑤赋值运算符(=、+=、-=、*=、/=、%=)

c编译系统在表示逻辑运算符运算结果时,返回的也是逻辑值;用1表示真,用0表示假。

案例:

假设a=4,b=5则:

 !a           -- 0  这里是对 非0取反
 a && b       -- 1  && 两边都是  非0
 a || b       -- 1  || 两边都是  非0
 !a || b      -- 1  || 右边是    非0
 4 && 0 || 2  -- 1  || 右边是    非0 同级别的运算符,一般都是从左往右

小贴士:

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

'c'&&'d'结果为1

用if语句实现分支结构

单分支:if

语法:

 if(条件表达式)
 {
     语句;
 }
 //如果是单语句,可以省略{},以下两种写法完全等价举例如下:
 if(条件表达式)语句;
 ​
 if(条件表达式)
     语句;

流程图:

功能:

  • 若表达式值为真(非0)则执行表达式后面的语句,执行完该语句后继续执行if语句后的其他语句。

  • 若表达式值为假(0),则不执行表达式后面的语句直接执行if语句后面的其他语句

说明:

  • 如果表达式后面的是复合语句(超过1条)则要用一段{}括起来,单语句可有可无。

  • 代码

     /*************************************************************************
       > File Name:    demo01.c
       > Author:       
       > Description:  
       > Created Time: 2025年03月07日 星期五 10时41分08秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         //创建一个变量,存储数据
         int x,y = -1;
         //从控制台输入x;
         printf("请输入一个整数:\n");
         scanf("%d",&x);
         //校验
         if(x >= 0) y = 2;
         //输出y值
         printf("y=%d\n",y);
         printf("x=%d\n",x);
         return 0;
     }
    
    

案例:

  • 需求:a,b,c三个数,要求从控制台输入,求出最大最小

  • 分析:

    ①首先创建5个变量,其中abc用来接收控制台输入,max和min保存最大最小

    ②默认a是max和min

    ③让max分别和bc比较,如果bc比max大就将bc赋值给max

    ④让min分别和bc比较,如果bc比min小就将bc赋值给min

  • 代码:

     /*************************************************************************
       > File Name:    demo02.c
       > Author:       
       > Description:  
       > Created Time: 2025年03月07日 星期五 10时58分19秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         //创建5个变量,abc接收输入,max和min存放最大最小
         int a,b,c,max,min;
     ​
         //控制台输入
         printf("请输入三个整数:");
         scanf("%d%d%d",&a,&b,&c);
     ​
         //必须等abc获取之后,才能为max和min赋值
         max = min = a;//
     ​
         //最大值校验
         if(max < b) max = b;
         if(max < c) max = c;
         //最小值校验
         if(min > b) min = b;
         if(min > c) min = c;
     ​
         printf("%d,%d,%d最大值%d,最小值%d",a,b,c,max,min);
         return 0;
     }
     ​

有可能产生的问题:

①scanf()同时输入多个用空格、Tab,回车隔开

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

小贴士:

if(flag == 1)建议写作if(flag)

if(flag == 0)建议写作if(!flag)

双分支:if..else

语法:

 if(条件表达式)
 {
     语句1;
 }
 else
 {
     语句2;
 }
 //如果是单语句,可以省略{},以下两种写法完全等价举例如下:
 if(条件表达式)语句;
 else 语句2;
 ​
 if(条件表达式)
     语句1;
 else
     语句2;

注意:else语句本身不能单独存在,必须和距离自己最近的未配对的if配对。

功能:

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

说明:

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

案例:

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

  • 代码

     /*************************************************************************
       > File Name:    demo03.c
       > Author:       
       > Description:  
       > Created Time: 2025年03月07日 星期五 11时38分44秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         //创建两个变量,存储数据
         int x,y;
     ​
         //通过控制台给x赋值
         printf("请输入一个整数\n");
         scanf("%d",&x);
         
         //通过条件判断给y赋值
         if(x < 0)
             y = -2;
         else
             y = 2;
         
         //打印输出
         printf("x=%d,y=%d",x,y);
         
         return 0;
     }
     ​

案例:

  • 需求;判断闰年

  • 分析:

    • 判断条件:(year % 4 == 0 && year % 100 != 0) || year % 400 == 0

       /*************************************************************************
         > File Name:    demo04.c
         > Author:       
         > Description:  
         > Created Time: 2025年03月07日 星期五 11时47分26秒
        ************************************************************************/
       ​
       #include <stdio.h>
       ​
       int main(int argc,char *argv[])
       {
           //创建一个变量
           int year;
           //提示
           printf("请输入\n");
           //接收
           scanf("%d",&year);
           //校验
           if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
               printf("%d是润年\n",year);
           else
               printf("%d是平年\n",year);
           
           return 0;
       }
       ​

注意:对于单语句的双分支,我们可以使用三目(三元)运算的写法简化

双分支:三目运算符

三目运算符,又被称之为三元运算符。

语法:

表达式1 ? 表达式2 : 表达式3;

说明:

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

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

案例:

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

  • 代码:

    /*************************************************************************
      > File Name:    demo03.c
      > Author:       
      > Description:  
      > Created Time: 2025年03月07日 星期五 11时38分44秒
     ************************************************************************/
    
    #include <stdio.h>
    
    int main(int argc,char *argv[])
    {
        //创建两个变量,存储数据
        int x,y;
    
        //通过控制台给x赋值
        printf("请输入一个整数\n");
        scanf("%d",&x);
        
        //通过条件判断给y赋值
        x < 0 ? y = -2 : y = 2
        //打印输出
        printf("x=%d,y=%d",x,y);
        
        return 0;
    }
    
    /*************************************************************************
      > File Name:    demo04.c
      > Author:       
      > Description:  
      > Created Time: 2025年03月07日 星期五 11时47分26秒
     ************************************************************************/
    
    #include <stdio.h>
    
    int main(int argc,char *argv[])
    {
        //创建一个变量
        int year;
        //提示
        printf("请输入\n");
        //接收
        scanf("%d",&year);
        //校验
        (year % 4 == 0 && year % 100 != 0) || year % 400 == 0?
         printf("%d是润年\n",year):
         printf("%d是平年\n",year);
        return 0;
    }
课堂练习

需求:从键盘录入一个整数,判断这个数是偶数还是奇数

要求:单分支,双分支,三目

多分支:if...else if...else

语法:

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

//写法2:并列if...else if...else...(推荐)
if(表达式1) 语句1;
else if(表达式2)语句2;
...
[else if(表达式n) 语句n;]
[else 语句n+1;]
//语法中出现[]代表可选

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

案例:

  • 需求:根据成绩分级

    • 成绩>=90

    • 成绩>=80

    • 成绩>=70

    • 成绩>=60

    • 成绩<60

    • 代码

      /*************************************************************************
        > File Name:    demo05.c
        > Author:       
        > Description:  
        > Created Time: 2025年03月07日 星期五 14时39分54秒
       ************************************************************************/
      
      #include <stdio.h>
      
      int main(int argc,char *argv[])
      {
          //创建一个变量
          int score;
          //从控制台输入成绩
          printf("请输入成绩:\n");
          scanf("%d",&score);
          if(score>=90)
              printf("优秀\n");
          else if(score>=80)
              printf("良好\n");
          else if(score>=70)
              printf("中等\n");
          else if(score>=60)
              printf("及格\n");
          else 
              printf("不及格\n");
          return 0;
      }
      
    • 代码:

      /*************************************************************************
        > File Name:    demo05.c
        > Author:       
        > Description:  
        > Created Time: 2025年03月07日 星期五 14时39分54秒
       ************************************************************************/
      
      #include <stdio.h>
      /**
      *方式1:借助顺序执行
      */
      int if_test1()
      {
          //创建一个变量
          int score;
          //从控制台输入成绩
          printf("请输成绩:\n");
          scanf("%d",&score);
          if(score >= 90)
              printf("优秀\n");
          else if(score >= 80)
              printf("良好\n");
          else if(score >= 70)
              printf("中等\n");
          else if(score >= 60)
              printf("及格\n");
          else 
              printf("不及格\n");
          return 0;
      }
      /**
      *方式2:不借助顺序执行
      */
      int if_test2()
      {
          //创建一个变量
          int score;
          //从控制台输入成绩
          printf("请输成绩:\n");
          scanf("%d",&score);
          if(score >= 60 && score < 70)
              printf("及格\n");
          else if(score >= 70 && score < 80)
              printf("中等\n");
          else if(score >= 80 && score < 90)
              printf("良好\n");
          else if(score >= 90)
              printf("优秀\n");
          else 
              printf("不及格\n");
          return 0;
      }
      int main(int argc,char *argv[])
      {
          if_test1();
          if_test2();
          return 0;
      }
      
if...else结构注意点
  • if...else结构中的语句1和语句2都可以是复合语句。

  • 在if...else结构中,语句1和语句2都可以是空语句。举例:if(...;)else;

    if()
        ;
    else
        ;
课堂练习

要求:计算并输出下列分段函数值,其中x从键盘输入

  • 代码

    
    
if语句嵌套

语法:

if(...)
    if(...)语句1;
    [else   语句2;]
[else
    if(...)语句3;
    else   语句4;]        //根据情况可选

注意:

①else总是与前面最近的未配对的if配对使用

if(...)
    if(...)
    else ..

②可通过增加{}来确定配对关系

③只要if中包含if,都属于if语句的嵌套

案例:

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

    • 成绩 >= 90 A

    • 成绩 >= 80 B

    • 成绩 >= 60 C

    • 成绩 < 60 D

  • 代码

    /*************************************************************************
      > File Name:    demo05.c
      > Author:       
      > Description:  
      > Created Time: 2025年03月07日 星期五 14时39分54秒
     ************************************************************************/
    
    #include <stdio.h>
    
    /**
    *方式1:借助顺序执行
    */
    int if_test1()
    {
        //创建一个变量
        int score;
        //从控制台输入成绩
        printf("请输成绩:\n");
        scanf("%d",&score);
    
        if(score >=0  && score <= 100)
        {
            if(score >= 90)
                printf("优秀\n");
            else if(score >= 80)
                printf("良好\n");
            else if(score >= 70)
                printf("中等\n");
            else if(score >= 60)
                printf("及格\n");
            else 
                printf("不及格\n");
        }
        else
        {
            printf("请输入0-100之间的整数!\n");
        }
        return 0;
    }
    
    /**
    *方式2:不借助顺序执行
    */
    int if_test2()
    {
        //创建一个变量
        int score;
        //从控制台输入成绩
        printf("请输成绩:\n");
        scanf("%d",&score);
    
        if(score < 0  || score > 100) printf("请输入0-100之间的整数!\n");
        if(score >= 60 && score < 70)
            printf("及格\n");
        else if(score >= 70 && score < 80)
            printf("中等\n");
        else if(score >= 80 && score < 90)
            printf("良好\n");
        else if(score >= 90)
            printf("优秀\n");
        else 
            printf("不及格\n");
        return 0;
    }
    
    /**
    *方式3:
    */
    int if_test3()
    {
        //创建一个变量
        int num;
        //从控制台输入成绩
        printf("请输成绩:\n");
        scanf("%d",&num);
    	
        //偶数校验
        if(num !=0)
        {
            if(num % 2 == 0)
            {
                printf("%d是偶数\n",num);
            }
            else
            {
                printf("%d是奇数\n",num);
            }
        }
        else
        {
            printf("0既不是偶数也不是奇数!")
        }
        return 0;
    }
    
    int main(int argc,char *argv[])
    {
        if_test1();
        if_test2();
        if_test3();
        
        return 0;
    }
    

小贴士:

如何拆出一个三位整数的个位、十位、百位的数

举例:123

拆个位:123% 10=3

拆十位:123/ 10 % 10=2

拆百位:123/ 10 / 10 % 10=1

什么是:水仙花数

用switch语句实现分支结构

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

语法:

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

说明:

①switch后括号内的表达式可以是任意类型的表达式,建议表达式的结果是整型、字符型

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

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

④各个case出现的次序不影响执行的结果。

⑤case后面的语句中没有break语句,则执行完本case后的语句会接着执行下面娥case,直到遇到下一个break或者switch执行完毕为止,演示:

int num = 1;
switch(num)    //表达式的结果建议是   字符  或者 整型
{
    case 1:    //这里一般使用字面量、符号常量、枚举
		printf("A\n");
    case 2:    //这里一般使用字面量、符号常量、枚举
		printf("B\n");
		break;
     case 3:    //这里一般使用字面量、符号常量、枚举
		printf("C\n");
		break;
	 default:
		语句 n+1;
		break;
}
运行结果:
    A
    B

⑥多个case公用一组语句,演示:

//根据月份判断季节
//分析
//    春季:2-4
//    夏季:5-7
int month;  //月份
printf("请输入月份\n");
scanf("%d",&month);
switch(month)    //表达式的结果建议是   字符  或者 整型
{
    case 2:  //检测没有break,执行下一个case
    case 3:  //检测没有break,执行下一个case
    case 4:  //检测没有break,执行下一个case
        printf("春季\n");
        break;
    case 5:  //检测没有break,执行下一个case
    case 6:  //检测没有break,执行下一个case
    case 7:  //检测没有break,执行下一个case
        printf("夏季\n");
        break;
    default:
        printf("其他季节\n");
        break;
}

案例:

  • 需求:按照成绩输出百分制

  • 分析:

    • 设置分数段如下:

      • A级:85~100

      • B级:70~84

      • C级:60~69

      • D级:<60

    • 输出其他字符错误

  • 代码

    /*************************************************************************
      > File Name:    demo06.c
      > Author:       
      > Description:  
      > Created Time: 2025年03月07日 星期五 16时58分15秒
     ************************************************************************/
    
    #include <stdio.h>
    
    int switch_test1()
    {
        //定义变量
        char grade;
        
        //控制台输入
        printf("请输入\n");
        scanf("%c",&grade);
    
        //校验
        switch(grade)
        {
            case 'A':
                printf("85~100\n");
                break;
            case 'B':
                printf("70~84\n");
                break;
            case 'C':
                printf("60~69\n");
                break;
            default:
                printf("Error\n");
                break; //如果default在所有case下面,default中的break是可以省略:否则不能省略
        }
    
    }
    
    int main(int argc,char *argv[])
    {
        switch_test1();    
        return 0;
    }
    

案例:

  • 需求:按照成绩输出百分制

  • 分析:

    • 设置分数段如下:

      • A级:90~100

      • B级:80~89

      • C级:70~79

      • D级:60~69

      • E级 :其他

  • 解析:

    • case score >= 90 && score <= 100,在switch是错误的

    • 规律:90~100的数/10=9 | 10,80~89 的数/10=8,

  • 代码

    /*************************************************************************
      > File Name:    demo06.c
      > Author:       
      > Description:  
      > Created Time: 2025年03月07日 星期五 16时58分15秒
     ************************************************************************/
    
    #include <stdio.h>
    
    int switch_test1()
    {
        //定义变量
        char grade;
        
        //控制台输入
        printf("请输入\n");
        scanf("%c",&grade);
    
        //校验
        switch(grade)
        {
            case 'A':
                printf("85~100\n");
                break;
            case 'B':
                printf("70~84\n");
                break;
            case 'C':
                printf("60~69\n");
                break;
            default:
                printf("Error\n");
                break; //如果default在所有case下面,default中的break是可以省略:否则不能省略
        }
    
    }
    
    int switch_test2()
    {
        //定义变量
        int score;
        
        //控制台输入
        printf("请输入\n");
        scanf("%d",&score);
    
        if(score <0 || score > 100)
        {
            printf("Error\n");
        }
        else
        {
            //校验
            switch(score/10)
            {
                default://其他
                    printf("E级\n");
                    break;
                case 10://100
                case 9://90-99
                    printf("A级\n");
                    break;
                case 8://80-89
                    printf("B级\n");
                    break;
                case 7://70-79
                    printf("C级\n");
                    break;
                case 6://60-69
                    printf("D级\n");
                    break;
            }
        }
    
    }
    int main(int argc,char *argv[])
    {
       // switch_test1();
        switch_test2();
        return 0;
    }
    

章节作业

  1. 输入你的身高和体重,测试你的健康状况。

计算bmi的值, bmi = (体重(kg)/身高(m)的平方) 如果bmi 小于18.5,则显示“偏瘦,注意加强营养” 如果bmi 在18.5和23.9之间,则显示“体重指数良好,注意保持” 如果bmi值大于23.9 ,则显示“你有点偏胖,注意锻炼”

  1. 西安市对安装“一户一表”的居民用户按阶梯式累进电价进行计收电费,具体方案是:

月用电量低于50千瓦时部分,电价不调整,仍为0.538元/千瓦时;51~200千瓦时部分, 单价为0.568元/千瓦时;超过200千瓦时部分,电价为0.638元/千瓦时。市区徐某家4月份 的用电量为96千瓦时,其电费计算如下:基本电费部分:96千瓦时×0.538元/千瓦时=51.65元; 超出50千瓦时的调价电费:(96~50)千瓦时×0.03元/千瓦时=1.38元;电费合计51.65+1.38=53.03元 。“阶梯式电价”机制可有效地抑制电力浪费现象,引导居民节约用电,合理用电,比纯粹“口号倡导型” 节约用电更加有效。 编写一个程序根据输入的用电量,计算电费。

  1. 设计一个计算个人所得税的软件

应纳税所得额 = 工资收入金额 - 各项社会保险费(650元) - 起征点(3500元)

应纳税额 = 应纳税所得额 x 税率 - 速算扣除数

通过输入工资总额和社保费用计算应纳税额

  1. 设计TVM(地铁自动售票机)机软件。

输入站数,计算费用,计费规则,6站2元,7-10站3元,11站以上为4元。 输入钱数,计算找零(找零时优先找回面额大的钞票),找零方式为各种面额张数,可识别面额:100,50,20,10,5,1

  1. 出租车费计算程序,起步公里数3公里,车费8元,超出3公里,每公里1.8元,不足一公里,按照1公里计算。 如果输入一个钱数,计算最多能坐多少公里,该如何实现?

  2. 通过键入输入一个年份和月份,输出显示该月有多少天。(考虑润年情况)

闰年计算规则:(year % 400==0) || (year % 4 == 0 && year % 100 != 0)

  1. 实现一个简单的计算器,要求根据输入的运算符实现相应的运算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值