设计结构——分支结构

分支结构

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

概念

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

条件构建

  • 关系表达式:含有关系运算符的表达式(>,<,>=,<=,!=,==)
  • 逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的复合条件,比如:
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",a);

例子:

/**
* 需求:从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成小写字母后输出,否则输出原来输入的字符
*/
#include <stdio.h>
int main()
{
// 声明一个变量,存放从键盘录入的字符
    char c;
    printf("请输入一个英文字母:\n");
    scanf("%c",&c);
    // 判断
    if(c >= 'A' && c <= 'Z')
    {
        // c = c + 32;
        c += 32;
    }
    printf("输入的字符是:%c\n",c);
    return 0;
}

双分支

语法:

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

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

例子:

#include <stdio.h>
int main(void)
{
    // 申明三个变量来存放计算数
    double x,a,y;
    // 通过键盘录入x,a
    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()
{
    // 需求:求a,b两个数中最大数
    // 写法1:正常写法
    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;
}

多分支

语法:

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);
}

switch

语法:

switch(表达式) // 不能是布尔型和 浮点型

{

​   case 常量表达式1:

​     语句体1;

​     break;

​   case 常量表达式2:

​      语句体2;

  ​    break;

​   …

​   case 常量表达式n:

   ​    语句体n;

​      break;

​   default:

​     语句体n+1;

     ​ break;// 可以省略

}

说明:

  1. switch后括号内的表达式可以是任何类型的表达式;

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

default后面的语句;

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

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

  3. case后面的语句中如果没有break语句,则执行完本case后的语句会接着执行下面的case(case穿透) ;

  4. 多个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");
    }
}

switch语句的case穿透:

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

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

总结

  • 如果只需要一个判断结果,使用单分支
  • 如果需要两个判断结果,且只能有两个判断结果,使用双分支
  • 如果需要判断N个结果中的某几个,或者所有,使用多分支
  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值