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;
}
下图为我们随便输入一个有效等级所得到的结果
我们发现输出的并非自己想要的结果,因为它将所有的内容都进行执行了,因为==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时候打印结果如下。
2.分支结构的嵌套
①形式
if(表达式)
if(表达式)
...
else
...
else
if(表达式)
...
else
...
②应用
通过以下一个流程图,我们通过代码将他实现吧!
#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看看会发生什么情况
不难发现,这个输出的结果把后面的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 ;
}
下面就可以根据以上输入结果打印正确的值了
但是,这串代码还是有个问题的,究竟是什么问题呢?如果我们把第一个问题用Y同意,第二问题用N否定或怎么样呢?
下面为输出结果
既然回答了第一个问题有空,第二个未下雨,结果为什么输出的结果却还是否定了第一个问题呢?因为第一个问题是大前提,有空就一定可以出去了,第二个问题只是一个辅助提醒,结合现实生活我们如何将其用代码进行实现呢。简单来说就是把第一个问题当做主要问题来看待,这就要用到我们经常用的”{}“来将它实现了,因为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 ;
}
下面为此代码的输出结果
这样这个代码也就算是完成了!
②等于号带来的大麻烦
对于这种类型的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
注:对于以上的问题我们发现这种类型的问题在编译器并没有报错,所以要格外小心,当工程量大的时候,代码多的时候就很难找出这种类似的问题。