学习C语言的第6天

分支结构

分支结构:又被称之为选择结构

概念

选择结构:根据条件成立与否,选择相应的操作

条件构建

关系表达式:含有关系运算符夫人表达式(>,<,>=,<=,!=,==)

逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复制的复合条件,比如:

if(year % 100 == 0 && year % 4 !=0) //这种即含有关系表达式,又含有逻辑表达式的条件叫做复合条件

常量/变量:值是否非0,取值(0|1)

        注意:类似一下写法,是无效的,没有意义的。

if(x+y) //编译通过,但是没有实际意义,不建议这样写
if(5*6)

选择结构的形式

单分支

语法:

if(条件表达式)
{
    语句1;
}

说明:条件表达式成立,执行语句1,否则跳过该分支结构。单分支条件不满足可以不执行。

例子:

int a = 5;
if(a < 0)
{
    a = -a;
}
printf("a=%d\n");

例子:

#include <stdio.h>

int main(void)
{
    char c;
    
    printf("请输入一个英文字母:\n");
    scanf("%c",&c);

    if(c >= 'A' && c <= 'Z')
    {
        c += 32;
    }
    printf("输入的字符啥:%c\n",c);
return 0;
}

双分支

语法:

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

说明:条件表达式成立,执行语句1,否则执行语句2。双分支不管条件是否满足,都需要执行。

例子:

#include <stdio.h>

int main(void)
{
    double x,a,y;

    printf("请输入两个数值:\n");
    scanf("%lf,%lf",&x,&a);

    if(x != 0 && a != 0)
    {
        y = 1.0/x + 1.0/a;
    }
    else
    {
        y = 10000;
    }
        printf("y=%f\n",y);
return 0;
}

三目运算符

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

说明:?:条件运算符,主要可以简化双分支为同一变量赋值操作。

求值过程: 先计算表达式1的值,非0,则将表达式2的结果作为条件运算的最终结果:否则将表达式3的结果作为条件运算符的最终结果。

案例:

#include <stdio.h>

int main(void)
{   //写法1:正常写法语法:表达式1 ? 表达式2 : 表达式3;
    int a = 5,b = 3;
    if(a > b)
    {
        printf("最大数是:%d\n",a);
    }
    else
    {
        printf("最大数是:%d\n",b);
    }
    // 写法2 :省略{}
    int a1 = 5,b1 = 3;
    if(a1 >b1)
        printf("最大数数:%d\n",a1);
    else
        printf("最大数是:%d\n",b1);
    //写法3 :三目运算符
    int a2 = 5,b2 = 3;
    int ret = a2 > b2 ? a2 : b2;
    printf("最大数是:%d\n",ret);
return 0;
}

案例:

 #include <stdio.h>
 
int main()
 {
    // 需求:输入两个实数,按代数值由 小到大的顺序输出这两个实数。
    
    // 申明变量,存储操作数
    int a,b;
    
    printf("请输入两个数值作为操作数:\n");
    scanf("%d,%d",&a,&b);
 
    // 校验
    // 方式1
    if(a > b)
    {
       printf("由小到大的顺序是:%d,%d\n",b,a);
    }
    else
    {
       printf("由小到达的顺序是:%d,%d\n",a,b);
    }
    
 
    // 方式2
    // 创建一个临时变量,用来存放交换信息
    int t = 0;
    if(a > b)
    {
       t = a;
       a = b;
       b = t;
    }   
    printf("由小到大的顺序是:%d,%d\n",a,b);
 
}

案例:

#include <stdio.h>
 int main()
 {
 // 需求:输入3个数a,b,c,要求按由小到大的顺序输出这3个数
// 申明变量,用来存放操作数
int a,b,c,tmp;
 printf("请输入三个整数:\n");
 scanf("a=%d,b=%d,c=%d",&a,&b,&c);
 // 条件判断
if(a > b)
 {
 tmp = a;
 a = b;
 b = tmp;
 }
 if(a > c)
 {
 tmp = a;
 a = c;
 c = tmp;
 }
 if(b > c) 
{
 tmp = b;
 b = c;
 c = tmp;
 }
 printf("a,b,c三个数按照由小到大的顺序是:%d,%d,%d\n",a,b,c);
 return 0;
 }

多分支

语法:

if(条件1)
 {
    语句1;
 } else if(条件2)
 {
    语句2;
 }
 ...
 else {
    语句n+1;
 }    

案例:

#include <stdio.h>
 
int main()
 {
    // 需求:编一程序,要求输入一个x值,输出y值
 
 
    // 方式1:嵌套的if..
    int x,y;
    
    printf("请输入一个整数:\n");
    scanf("%d",&x);
 
    // 条件判断
    if(x < 0)
    {
       y = -1;
    }
    else
    {
       // x >= 0
       if(x == 0)
       {
          y = 0;
       }
       else
       {
    y = 1;
       }
    }
    
    printf("方式1:x=%d,y=%d\n",x,y);
    
    // 方式2:多分支if..else if....else..
    
    // 条件判断
    if(x < 0)
    {
       y = -1;
    }
    else if(x == 0)
    {
       y = 0;
    }
    else
    {
       y = 1;
    }
    
    printf("方式2:x=%d,y=%d\n",x,y);
    
}

案例:

 #include <stdio.h>
 /**
 * 需求:高校要求粤嵌对实训学生根据实训成绩进行评级
         范围:0 <= score <= 100;
         评级:
               score >= 90  优秀
               score >= 80  良好
               score >= 70  中等
               score >= 60  及格
               score < 60   不及格
 */
 int main()
 {
    // 声明一个变量,存储成绩
    int score;
 printf("请录入学生成绩:\n");
    scanf("%d",&score);
 
    // 对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("成绩录入不合法!\n");
    }
 }

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出现次序不影响执行结果;

(4)各个case 和default出现的次序不影响执行结果;
(5)case后面的语句中如果没有break语句,则执行完本case后的语句会接着执行下面的case(case穿 透) ;

(6) 多个case可共用一组语句。

注意:

  1. 表达式一般写一个变量,变量的值是一个确定的常量。
  2. 当遇到break或者switch语句的右大括号时,switch语句结束。
  3. 表达式中的数据类型:char,short,int,long,long long,不能是浮点型。 表达式和常量的数据类型要一致(支持隐式转换),比较是否相同。

案例:

 /*
 需求:根据成绩进行评级
 score <= 100;
评级:
               90 <= score < 100  优秀  90~99/10 == 9 && 100/10 ==10
               80 <= score < 90   良好  80~89/10 == 8
               70 <= score < 80   中等  70~79/10 == 7
               60 <= score < 70   及格  60~69/10 == 6
               score < 60   不及格
 */
 #include <stdio.h>
 
int main()
 {
    int score;// 成绩
 
    printf("请输入实训成绩:\n");
    scanf("%d",&score);
 
    if(score >= 0 && score <= 100)
    {
        // 对成绩进行加工
        int l = score / 10;
        switch(l)
        {
            case 10:// 100分
            case 9:// 90~99分
                printf("优秀\n"); // 这里:多个case共用一块代码
                break;            
            case 8:
                printf("良好\n");
                break;
            case 7:
                printf("中等\n");
                break;
            case 6:
                printf("及格\n");
                break;
            default:
                printf("不及格\n");
 
        }
    }
    else
    {
       printf("成绩录入不合法!\n");
    }
 }

案例:

/*
   需求:实现一个简易计算器,要求实现+,-,×,/运算
 */
 #include <stdio.h>
 
int main()
 {
    printf("简易计算器 v1.0\n");
    printf("请输入两个操作数:\n");
 
    double x,y;// 存放计算数
    char ch;// 运算符
    scanf("%lf,%lf",&x,&y);
    scanf("%c",&ch);// 消除上面产生的最后一个回车符
 
    printf("请输入运算符:(+、-、.*、/)\n");
    scanf("%c",&ch);
 
    // 计算
    switch(ch)
    {
        case '+':
            printf("%.2lf+%.2lf=%.2lf\n",x,y,x+y);
            break;
        case '-':
            printf("%.2lf-%.2lf=%.2lf\n",x,y,x-y);
            break;
        case '.':
        case '*':
            printf("%.2lf*%.2lf=%.2lf\n",x,y,x*y);
            break;
        case '/':
            if(y == 0)
            {
                printf("除数不能为0\n");
            }
            else
            {
                printf("%.2lf/%.2lf=%.2lf\n",x,y,x/y);
            }
            break;
        default:
            printf("输入错误!");
     }
    
    return 0;
 }

switch语句的case穿透:

1. case穿透:当case后的break被省略;就会直接执行它后面紧跟的case中的语句(不会判断表达式是 否和它后面的case常量是否相同),这样的现象称之为case穿透。

2. default语句一般放在所有case之后,表明所有的case都不成立时,执行default中的语句;default语 句可以放在switch语句{}内的任意位置。

总结

  • 如果只需要一个判断结果,使用单分支
  • 如果需要两个判断结果,且只能有两个判断结果,使用双分支
  • 如果需要判断N个结果中的某几个,或者所有,使用多分支

扩展

条件表达式中的运算符优先级

逻辑非(!) > 算数运算符 (+-*/%)>关系运算符(> < >= 逻辑运算符(&&、||)> 赋 值运算符(=、+=)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值