【C】分支结构

分支结构

if 语句

if语句(1)

格式:

...... // 其他语句

if (表达式)

{

...... // 逻辑值为真所执行的语句、程序块

}

...... // 其它语句

int main()
{
    int i;
    printf("您老贵庚啊:");
    scanf("%d",&i);//接收用户输入的整型数据
    
    if (i>=18)
    {
        printf("进门左拐!\n");
    }
    
    return 0;
}

if语句(2)

格式:

...... // 其他语句

if (表达式)

{

...... // 逻辑值为真所执行的语句、程序块

}

else

{

......  // 逻辑值为假所执行的语句、程序块

}

....... // 其它语句

int main()
{
    int i;
    printf("您老贵庚啊:");
    scanf("%d",&i);//接收用户输入的整型数据
    
    if (i>=18)
    {
        printf("进门左拐!\n");
    }
    else
    {
        printf("慢走,不送!");
    }
    
    return 0;
}

if语句(3)

格式:

...... // 其他语句

if (表达式1)

{

...... // 逻辑值为真所执行的语句、程序块

}

else if (表达式2)  {   ......   }

else if (表达式3)  {   ......   }

.

.

.

else if (表达式n) { ...... }

else  { ...... }

....... // 其它语句

实践

  • 做一个按分数评级的程序,按以下标准评分:

    • 90分及以上: A
    • 80 ~ 90分: B
    • 70 ~ 80分: C
    • 60 ~ 70分: D
    • 低于60分: E
    int main()
    {
        int i;
        printf("请输入分数:");
        scanf("%d",&i);//接收用户输入的整型数据
        
        if (i>=90)
        {
            printf("A级!\n");
        }
        else if (i>=80 && i<90)
        {
            printf("B级!\n");
        }
        else if (i>=70 && i<80)
        {
            printf("C级!\n");
        }
        else if (i>=60 && i<70)
        {
            printf("D级!\n");
        }
        else
        {
            printf("E级 \n");
        }
        return 0;
    }
    

switch语句 以及 break语句

格式:

......   //其他语句

switch (表达式)

{

case 常量表达式1: 语句或程序块1; break;

case 常量表达式2: 语句或程序块2; break;

......

case 常量表达式n: 语句或程序块n; break;

default: 语句或程序块n+1; break;

}

...... // 其他语句

注意每个case和default后面的语句中,末尾都有一个break语句,它用与跳出switch语句。如果没有break语句,程序在执行完相匹配的case后面的语句后,还会继续执行之后的其他分支的语句。

注意

  • switch后面括号内的”表达式“,其值的类型应为整数类型(包括字符型)

  • switch语句中的casedefault都是起一个标签的作用,用来标志一个位置。执行switch语句时,先计算表达式的值,然后将它与各case标签比较,如果和某一个case标签中的常量相同,流程就跳转到此case标号后面的语句。如果没有一个case标签的常量与它相匹配,流程再转去执行default标签后面的语句。

  • 可以没有default语句,此时如果没有与表达式的值相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句

  • 每一个case常量必须互不相同,否则会出错

  • case标签只起到标记的作用,在执行switch语句时,程序是根据switch表达式的值找到相匹配的入口标签。在执行完一个case标签后面的语句后,就从此标签开始执行下去,不进行判断。所以case标签后面的语句末如果没有break语句,程序就会连续执行之后的其它标签的语句。

    int main()
    {
        char ch;
        
        printf("请输入成绩评级:");
        scanf("%c", &ch); 
        switch (ch) 
        {
            case 'A': printf("你的成绩在90分以上!\n");
            case 'B': printf("你的成绩在80~90分之间!\n"); 
            case 'C': printf("你的成绩在70~80分之间!\n"); 
            case 'D': printf("你的成绩在60~70分之间!\n");
            case 'E': printf("你的成绩在60分以下!\n");          
            default: printf("请输入有效的成绩评级! \n"); 
        }
        return 0;
    }
    

    运行结果

    请输入成绩评级:  C
    你的成绩在70~80分之间!
    你的成绩在60~70分之间!
    你的成绩在60分以下!
    请输入有效的成绩评级!
    

    所以一般情况下,在执行一个case子句后,应当用break语句是流程跳出switch结果,即终止switch语句的执行。在最后的一个default子句中(如果没有default标签,则为最后一个case子句)可以不加break语句,因为流程已经到了switch结构的结束处。

  • case标签后面的语句可以不加花括号”{}“,多个case标签可以共用一组执行语句。如:

    case 'A':
    case 'B':
    case 'C': printf("及格\n"); break;
    ...
    

实践

改善程序,通过评级输出分数范围

int main()
{
    char ch;
    
    printf("请输入成绩评级:");
    scanf("%c", &ch); //接受用户输入的字符

    switch (ch) //将接收到的字符与各个case给定的值进行比较
    {
        case 'A': printf("你的成绩在90分以上!\n"); break;//若接收的字符为'A',则跳转到此case标签
        case 'B': printf("你的成绩在80~90分之间!\n"); break;
        case 'C': printf("你的成绩在70~80分之间!\n"); break;
        case 'D': printf("你的成绩在60~70分之间!\n"); break;
        case 'E': printf("你的成绩在60分以下!\n"); break;
            
        default: printf("请输入有效的成绩评级! \n"); break;//若接收的字符不符合以上五种情况,则输出
    }
    return 0;
}

运行结果

请输入成绩评级:  C
你的成绩在70~80分之间!

分支结构的嵌套

如果说在一个if语句中包含另一个if语句,像这种情况下我们称之为if语句的嵌套,也称之为分支结构的嵌套

if (表达式)

if (表达式)

......

else

......

else

if (表达式)

......

else

......

根据流程图写代码

start=>start: 开始
input=>inputoutput: 输入两个整数到变量a和b中
condition=>condition: a!= b
condition2=>condition: a>b
output=>inputoutput: 输出a=b
output2=>inputoutput: 输出a<b
output3=>inputoutput: 输出a>b
end=>end: 结束

start->input->condition
condition(no,bottom)->output->end
condition(yes,right)->condition2
condition2(no,bottom)->output2->end
condition2(yes,right)->output3->end
int main()
{
    int a, b;
    printf("请输入两个数:");
    scanf("%d %d", &a, &b); //两个数用空格隔开
    //    也可以分开输入
    //    printf("请输入第一个数:");
    //	  scanf("%d",&a);
    // 	  printf("请输入第二个数:");
    //    scanf("%d",&b);
    
    if (a != b)
    {
        if (a > b)
        {
            printf("%d > %d\n", a, b);
        }
        else
        {
            printf("%d < %d\n", a, b);
        }
    }
    else
    {
        printf("%d = %d\n", a, b);
    }
    
    return 0;

}

运行结果

请输入两个数:5 6
5 < 6

程序bug

谈谈初学者在编写程序中,有时会出现的一些bug

悬挂else

int main()
{
    char isRain, isFree;
    printf("是否有空(Y/N):");
    scanf("%c",&isFree);
    printf("是否下雨(Y/N):");
    scanf("%c",&isRain);
    
    if (isFree == 'Y')
        if (isRain == 'Y')
            printf("记得带伞噢^_^\n");
    else
    {
        printf("女神没空!T_T");
    }

    return 0;
}

运行结果

是否有空(Y/N):Y
是否下雨(Y/N):女神没空!T_T

注意:我们可以看到程序运行结果出现了问题。因为此程序中,scanf接收的是两个字符,我们在输入第一个字符后按下的回车会被视为第二个字符被接收。改进程序,我们需要使用 getchar()将回车过滤掉。

printf("是否有空(Y/N):");
scanf("%c",&isFree);
getchar(); //过滤回车接收第二个输入
printf("是否下雨(Y/N):");
scanf("%c",&isRain);

运行结果

是否有空(Y/N):Y
是否下雨(Y/N):Y
记得带伞噢^_^
//再运行一遍,尝试其他结果   
是否有空(Y/N):Y
是否下雨(Y/N):N
女神没空!T_T

可以发现,运行第二遍时我们得到的结果与我们预期的并不相符。这是因为if,else结合是根据就近原则else始终与同一对括号内最近的未匹配if结合。程序本意是想让else与第一个if相匹配,但程序却将else与第二个if匹配在一起,造成悬挂else问题。解决问题只需要将属于第一个if的全部语句用大括号{}封装起来,这样else与第二个if不在同一括号内,就不会匹配在一起了。所以在编写程序时,在if和else后边,无论是一个语句还是多个语句,最好养成用大括号括起来的习惯。

    if (isFree == 'Y')
    {
        if (isRain == 'Y'){
           printf("记得带伞噢^_^\n");
        }
    }
    else
    {
        printf("女神没空!T_T");
    }

等于号带来的问题

int main()
{
    char hasBF;
    
    printf("小花有男朋友吗?(Y/N):");
    scanf("%c", &hasBF);
    
    if (hasBF = 'Y')
    {
        printf("那......祝福你们咯!\n");
    }
    else
    {
        printf("那我们在一起吧!\n");
    }
    return 0;
}

运行结果:

小花有男朋友吗?(Y/N):N
那......祝福你们咯!

运行结果与预期的情况并不相符。这是因为if后面的关系表达式为hasBF = 'Y',意思是将'Y'赋值给hasBF,因为非0的值都为,所所以程序会执行if里的语句。我们需要将赋值号(=)改成等号(==)

if (hasBF == 'Y')
{
	printf("那......祝福你们咯!\n");
}
else
{
	printf("那我们在一起吧!\n");
}
return 0;
}

运行结果

小花有男朋友吗?(Y/N):Y
那我们在一起吧!

注意:但在日常编写代码时,有时也可能因为疏忽而没有发现等号(==)写成了赋值号(=),导致运行结果有问题,我们却没有及时发现。为了避免这种情况,我们也可以将变量与常量位置互换,如

if ('Y' == hasBF)
{
	printf("那......祝福你们咯!\n");
}

这样如果等号(==)写成了赋值号(=),就变成了将变量赋值给常量,程序就会报错,因为左值不能被右值给赋值。

posted @   芝麻凛  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示