嵌入式学习Day5 C语言 --- 分支语句

前记

C语言中如何表示“真”和“假”?          // 0 -- 假 
                                                          // 1 -- 真 


 系统如何判断一个量的“真“和“假"?   // 0 -- 假  
                                                          //非0 -- 真 

 eg: 
     -1 //数值角度看非0 -- 真
      0 //数值角度看0 -- 假
   '\0' //数值角度看是0,0 -- 假
    'a' //数值角度看是97,非0 -- 真


    (优先级)算术 > 关系运算 > 逻辑运算 > 赋值 > 逗号
    

分支结构的概念

功能:做选择,做选择的核心是判断

判断的过程:通过关系运算构造出判断的条件

语句对比:        if           //条件判断
                        switch   //值的计算与匹配 

关系运算 (大小关系)

>
>=
<
<=
==
!=

eg: 
    1 > 2 //这是关系运算表达式  
          //是表达式就会有结果和数据类型 

 关系运算的结果:
 真为1
 假为0 
 

 eg:
    int a = 2;
    1<a<3
    //由结合性可知,从做向右进行关系运算
    //step1: 1<a  //结果是1
    //step2:1<3  //结果是1
    //所以最终的结果是


 eg:
    练习:
    a = 1, b = 2 ,c = 3
    a>b==c  //0  
    a+b>c   //0
    a=(b>c) //给a赋值0 
    a=b>c   //由优先级知,这步是给a赋值0

逻辑运算 

作用:用来 组合 多个关系
内容
与(&&)
  规则: 一假则假 
  格式:表达式1 && 表达式2 
  
或(||)
  规则: 一真则真 
  格式:表达式1 || 表达式2  
  
非(!) 
  规则:真假相对 
  格式:!表达式

重点,易错!!!!!!!!!
  &&截断特性:表达式从左往右执行,左侧表达式为假,右侧的表达式就不计算了
  ||截断特性:表达式从左往右执行,左侧表达式为真,右侧的表达式就不计算了
  

1、 表达式 10!=9 的值是__1__

2、 设x,y,z和t均为int型变量,执行以下语句:
    x=y=z=1;
    
    t=++x||++y&&++z; 
    
    后t的值为___1___
        
        t = (++x) || ((++y) && (++z)); 
              
3、
int a = 0,b = 1;
int value = 0;
value = a && b; //0  
value = a || b;  //1
value = a++ && b++; //0 1 1  
value = --a || b --; //1 -1 1 
value = (a + b) || (a - b); //1 
value = (a - b) && (a + b); //1
value = !a;   //1 
printf("value = %d a = %d b = %d",value,a,b);


一、if语句

形式1:

  if (表达式) //表达式 做判断的条件 
  {
    语句
  } 

含义:
    首先,判断 "表达式"
    真
       执行 语句
       语句执行完,表示if语句结束,程序继续往下
    假
       表示不执行if语句,程序继续往下 
       
注意:
   if (表达式) ;  //格式error,因为这里不加(;)
   {
     语句;
   }
   

形式2:

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


 含义:
   首先 判断"表达式"
   
   真:
     执行 ”语句1"
     语句1 执行完,表示if语句结束,程序继续往下
   假:
      执行 ”语句2"
     语句2 执行完,表示if语句结束,程序继续往下

     

练习:
    输入两个数,找出最大值 
    找出三个中的最大值 
    
eg:找出三个中的最大值 

#include<stdio.h>
 
int main()
 {
     int a,b,c,d;
 
     scanf("%d%d%d",&a,&b,&c);
 
     if(a>b)
      {
         d = a;
         if(d>c)
         {                                                                       
             printf("%d\n",d);
         }
          else
             printf("%d\n",c);
      }
      else
       {
         d=b;
         if(d>c)
         printf("%d\n",d);                                                       
         else
         printf("%d\n",c);
       }

    return 0;
 }


形式3: 多分支语句

if (表达式1) //注意: 不能加分号
{
   语句1
}else if (表达式2) //注意: 不能加分号
{
   语句2;
}else if (表达式3)//注意: 不能加分号

   语句3;
}else if (表达式n)//注意: 不能加分号
{
   
}else
{
  
}

含义:
判断 "表达式1"
真 执行 "语句1"   语句1 执行完,表示if语句结束,程序继续往下 
假 
   判断"表达式2" 
   真 执行 "语句2"   语句2 执行完,表示if语句结束,程序继续往下 
   假 
       判断"表达式3" 
       真 执行 "语句3"   语句3 执行完,表示if语句结束,程序继续往下 
       假 
         ...
         判断"表达式n" 
         真 执行 "语句n"   语句n 执行完,表示if语句结束,程序继续往下 
         假  
            执行 else后面语句 ,执行完,程序继续往下

注意:
   1.不存在单独的else语句 ,else出现一定有一个if与之对应 
   2.else 与 if匹配规则: 
     a. 一定从最里面开始匹配 
     b. else 与 最近 前面一个if匹配 

--------------------------练习1-------------------------

学生成绩:
90-100 --- A 
80-89  --- B
70-79  --- C
60-69  --- D 
<=59   --- E     

#include<stdio.h>                                                               
 
int main()
 {
 
     int score;
 
      scanf("%d",&score);
 
     if(90 <= score && score <= 100)
     {
         printf("A");
     }
     else if(80 <= score && score < 90)
     {
         printf("B");
     }
     else if(70 <= score && score < 80)
     {
          printf("C");
     }
      else if(60 <= score && score < 70)
     {
         printf("D");
     }
     else
     {
         printf("E");
     }                                                                           
 
     return 0;
 }

--------------------------练习2-------------------------

判断一个年份是不是闰年   
 
注: 
普通闰年:
         公历年份是4的倍数的,且不是100的倍数,为普通闰年(如2004年、2020年就是闰年)。
世纪闰年:
         公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)。
条件:    
         1. 能被4整除  同时 不能被100 整除
         2. 能被400整除 

#include<stdio.h>
                                                                                 
int main()
 {
 
     int year,Y1,Y2,Y3;
 
     scanf("%d",&year);
      
     Y1 = year%400;
 
     Y2 = year%4;
     Y3 = year%100;
 
     if(Y1 == 0 ||(Y2 == 0 && Y3 != 0))
         printf("Is leap_year\n");
     else
         printf("Not leap_year\n");
         
     return 0; 
 }     


--------------------------练习3----------------------------

   输入一个月份,输出对应月份的天数 
   
   1 3 5 7 8 10 12  -- 31天 
   4 6 9 11         -- 30天 
   2                -- 29
                       28 
    
#include<stdio.h>

int main()
{    
     int year,month,Y1,Y2,Y3;
     scanf("%d%d",&year,&month);
 
     if(1 <= month && month <=7)
     {
         if(month%2 != 0)
         {
             printf("30\n");
         }
         else if((month%2 == 0) && month != 2)
         {
             printf("31\n");                                                     
         }
         else
         {
              Y1 = year%400;                                                     
              Y2 = year%4;
              Y3 = year%100;
 
                 if(Y1 == 0 ||(Y2 == 0 && Y3 != 0))
                 printf("29\n");
                 else
                 printf("28\n");
         }
 
     }
     else if(8 <= month && month <=12)
     {                                                                           
         if(month%2 != 0)
         {
             printf("31\n");
         }
          else
             printf("30\n");
     }
     else
     {
         printf("请输入1-12的数字\n");
     }
                                                                                
     return 0;
}

二、switch语句(多分支的情况)

switch(表达式) //整型表达式 
{
    case 常量表达式:  //1+b(error,因为b是变量)
         语句;         //可在不带花括号的情况下,使用使用多条语句,甚至也可不放语句
         break;    
    case 常量表达式:
         语句;
         break;
    case 常量表达式:
         语句;
         break;
     default: //默认 
         语句;
         break;
}
 

含义:
  求解 "表达式"
  根据 结果 ,匹配 下面case后面的值 
  匹配上后,
  则执行对应case下的语句 ,
  直到遇到了break 或者是switch 右} (花括号)     //所以就可以实现一下效果,在3456情况下打印3 

注意:
  1.switch 后表达式 需要是一个整型表达式 
  2.case后面是,常量表达式,不能出现变量  

注意:
1.case 其实是一个 标签 lable //类似书签 
2.switch 只会匹配一次 
3.default 写错,不会报语法问题,但是写错后,就起不到default的作用
4.default 书写的位置,没有明确规定,如果default写到前面,一定要把break写上  

写出下面程序的输入结果:
int a = 5;
switch(a)
{
    case 2: printf("2\n");
    default: printf("不存在该选项\n");
    case 4:
    case 1: printf("1\n");
    case 3: printf("3\n");break;
    case 0: printf("0\n");
}

答:打印 不存在该选项

问:
如果default写错了,
假设把default换成dafualt,会是什么结果?
在default写错的情况下 int a = 2;
写出相应的结果,并思考原因。

答:打印 2
        不存在该选项

练习:

练习1: 四则运算
计算器程序。
用户输入运算数和四则运算符,输出计算结果。

练习2:百分制度 --- 等级制 
  switch实现
 
    学生成绩:
    90-100 --- A 
    80-89  --- B
    70-79  --- C
    60-69  --- D 
    <=59   --- E     
    
练习3:获取月份的天数 
   switch实现一下 
   
   
  1 #include<stdio.h>                                                               
  2 
  3 int main()
  4 {
  5 --------------练习1--------------------
  6     int a,b;
  7     char ch;
  8     scanf("%d %c %d",&a,&ch,&b);
  9 
 10     switch(ch)
 11     {
 12     case '+':
 13          printf("%d\n",a+b);
 14          break;
 15     case '-':
 16          printf("%d\n",a-b);
 17          break;
 18     case '*':
 19          printf("%d\n",a*b);
 20          break;
 21     case '/':
 22          printf("%g\n",(float)a/b);
 23          break;
 24     default:
 25          printf("输入错误,请重新输入:>\n");
 26          break;
 27 
 28     }
 29                                                                          
 30 ---------------练习2------------------
 31 
 32     int score,ret;
 33     scanf("%d",&score);
 34 
 35     ret = score/10;
 36 
 37     switch(ret)
 38     {
 39     case 10:
 40     case 9:
 41         printf("A\n");
 42         break;
 43     case 8:
 44         printf("B\n");
 45         break;
 46     case 7:
 47         printf("C\n");                                                          
 48         break;
 49     case 6:
 50         printf("D\n");
 51         break;
 52     case 5:
 53     case 4:
 54     case 3:
 55     case 2:
 56     case 1:
 57     case 0:                                                                     
 58         printf("E\n");
 59         break;
 60     default:
 61         printf("error\n");
 62     
 63     }
 64 
 65 ---------------练习3--------------------
 66     int month,year,Y1,Y2,Y3;
 67 
 68     scanf("%d%d",&year,&month);
 69 
 70     switch(month)
 71     {
 72     case 1:
 73     case 3:
 74     case 5:
 75     case 7:
 76     case 8:
 77     case 10:
 78     case 12:
 79         printf("31");
 80     case 4:
 81     case 6:                                                                     
 82     case 9:
 83     case 11:
 84         printf("30");
 85     case 2:
 86         Y1 = year%400;
 87         Y2 = year%4;
 88         Y3 = year%100;
 89 
 90         if(Y1 == 0 ||(Y2 == 0 && Y3 != 0))
 91             printf("29\n");
 92         else
 93             printf("28\n");
 94     }
 95                                                                                 
 96     return 0;
 97 }


 四、三目运算符(条件运算)


 表达式1 ? 表达式2 : 表达式3
 
 问一问 表达式1 ? --是真 还是 假 
 
 真 ,执行 表达式2 
 假 ,执行 表达式3 

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值