switch语句和分支嵌套

switch语句和分支嵌套

1.switch语句

①形式

...//其他语句
    switch(表达式)
{
    case 常量表达式1:语句或程序块1;
    case 常量表达式2:语句或程序块2;
        ......
    case 常量表达式n:语句或程序块n;
    default:语句或程序块n+1;
}
...//其他语句

②功能

用以下一个问题来进行理解这个语句的内容

如何才能实现用评级来知道大概分数?

-90分以上:A

-80~90分: B

-70~80分 :C

-60~70分 : D

-低于60分: E​

如果像通过自己的等级来知道在自己的分数的话,首先我们要清楚等级中的A,B,C,D,E都是跟字符有关的常量,所以用用char来定义一个字符变量。代码如下

#include<stdio.h>
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;
}

下图为我们随便输入一个有效等级所得到的结果

image-20221117073807955

我们发现输出的并非自己想要的结果,因为它将所有的内容都进行执行了,因为==switch语句是一直往下进行执行的!它不会帮你自动结束。==所以此时需要一个break语句将他自动结束,break的作用是当代码跳转到指定位置的时候,它会自动帮你结束。所以正确的代码如下所示。

#include<stdio.h>
int main()
{
    char ch;
    printf("请输入你的等级:");
    scanf("%c", &ch);
    switch (ch)
    {
    case 'A':printf("你的成绩大概在90分以上!\n");break;
    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;
}

通过以上修改之后就可以实现对于指定等级能够输出指定的分数了,当我们继续输入B时候打印结果如下。

image-20221117074556350

2.分支结构的嵌套

①形式

if(表达式)
   if(表达式)
   ...       
   else     
   ...
else      
  if(表达式)
    ...
    else
    ...

②应用

通过以下一个流程图,我们通过代码将他实现吧!

image-20221117080427205

#include <stdio.h>
int main ()
{
int a , b;
printf("请输入两个数:");
scanf("%d %d",&a,&b);
if(a!=b)
{
    if(a>b)
    {
    printf("%d>%d\n",a,b);    
    }
    else
    {
     printf("%d<%d\n",a,b);   
    }
}  
    else
    {        printf("%d=%d",a,b);
        
    }
return 0 ;
}

通过以上的代码即可完成以上流程图的流程

3.常见BUG

①悬挂else

对于这种类型的bug,我们用一个问题然后再用一串代码来进行演示一遍吧!

如果你要邀请你的朋友出去玩,此时你不确定你的朋友是否有空,而且是否下雨,如果你的朋友有空的话,其他问题都没事,如果下雨的话记得要带伞,请用代码实现这些问题并进行解答

#include <stdio.h>
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\n");
}
return 0 ;
}

我们对于这串代码的第一个问题是否有空回复为N看看会发生什么情况

image-20221117132737196

不难发现,这个输出的结果把后面的printf内的结果甚至else内的结果也给打印出来了!这是为什么呢?

因为对于上面输入’Y’这个字符而言我们是否还输入了一个回车键,其实回车也是一个字符,所以第一个scanf函数接收到的字符是Y,第二个scanf函数接收到的字符是’回车’所以我们需要把回车给过滤掉!

正确的代码如下所示

#include <stdio.h>
int main ()
{
char isRain,isFree;
printf("是否有空?(Y/N)");
scanf ("%c",&isFree);    
getchar();//过滤回车这个字符
printf("是否下雨?(Y/N)");
scanf ("%c",&isRain);
if (isFree == 'Y')
if(isRain == 'Y')
{
printf ("记得带伞哦!\n");
}
else
{
    printf("下次一起去吧!T_T\n");
}
return 0 ;
}

下面就可以根据以上输入结果打印正确的值了

image-20221117133301628

但是,这串代码还是有个问题的,究竟是什么问题呢?如果我们把第一个问题用Y同意,第二问题用N否定或怎么样呢?

下面为输出结果

image-20221117133425923

既然回答了第一个问题有空,第二个未下雨,结果为什么输出的结果却还是否定了第一个问题呢?因为第一个问题是大前提,有空就一定可以出去了,第二个问题只是一个辅助提醒,结合现实生活我们如何将其用代码进行实现呢。简单来说就是把第一个问题当做主要问题来看待,这就要用到我们经常用的”{}“来将它实现了,因为else始终与最接近它的if匹配

#include <stdio.h>
int main ()
{
char isRain,isFree;
printf("是否有空?(Y/N)");
scanf ("%c",&isFree);    
getchar();//过滤回车这个字符
printf("是否下雨?(Y/N)");
scanf ("%c",&isRain);
if (isFree == 'Y')
{
if(isRain == 'Y')
{printf ("记得带伞哦!\n");}
}
else
{
    printf("下次一起去吧!T_T\n");
}
return 0 ;
}

下面为此代码的输出结果

image-20221117134146268

这样这个代码也就算是完成了!

②等于号带来的大麻烦

对于这种类型的bug,我们用一个问题然后再用一串代码来进行演示一遍吧!

你和你的朋友在外面玩的很开心,而且此时你不知道你朋友是否口渴了,请用一串代码实现你朋友对上述问题的回答以及你的回答

#include <stdio.h>
int main ()
{
char Haskk;
printf("好哥们,你口渴了吗?(Y/N)");
scanf("%c",&Haskk);
if (Haskk = 'Y)
    {
     printf("我刚刚好有d那我去买水了哈!\n")
    }
    else
    {
      printf("好吧,我有点渴了,先去买瓶水了。\n")
    }
return 0;
}

对于以上代码说不定细心的人已经发现了其中的问题,就是在if语句括号内的表达式少了一个"="号!这样会带来什么样的结果呢?我们来看下这串代码的输出结果吧!

我们将上述问题回复N

image-20221117140332567

注:对于以上的问题我们发现这种类型的问题在编译器并没有报错,所以要格外小心,当工程量大的时候,代码多的时候就很难找出这种类似的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值