> 亲爱的小伙伴们大家好啊!if语句后面的练习题大家看了没有啊,是不是感觉写代码也是一件十分有意思的事情,那么这篇文章我们接着上篇文章后面继续来学习分支语句,这篇文章我们主要讲解switch,废话不多说我们开始这篇文章的内容。
在生活中我们经常遇到到多分支的选择,比如我们的高考填志愿,我们平时的购物,我们假期去旅游的时候都会遇到许多许多复杂的选择,当然面对这些情况我们可以使用一系列的嵌套的if语句完成我们上述的情况,但是等大家去写的时候,我们就会遇到一个问题就是,随着我们的情况越来越复杂,分支也就变得越来越多,我们的if语句也就会嵌套的越来越深,程序冗余,可读性大大降低,所以我们c语言就有了switch语句用来直接处理多分支的选择的情况,将程序代码的可读性大大的提高。那么接下来我就来带着大家一步一步的了解switch语句,从发现错误中学习switch语句。
首先啊这不是完整的形式,因为我们这篇文章的思路是带着大家从错误中学习switch语句,那么我们这里先看这个最基本的形式如何来理解?switch语句后面的表达式就是要进行判断的条件,然后使用case关键字表示检验条件的各种情况,其后的各语句块是相应的操作。我们来看一个例子大家就应该能够明白,我们就拿我们的一个星期的七天来举例子,比如说我们国庆放假了要给这七天做一个安排,我们这时就设计一个程序,该程序可以根据我们自己输入这是第几天来提醒我们应该干的事情,比如说今天是国庆的第四天那我们输入一个4就可以自动显示今天应该干的事情。那我们假设第一天:去看电影,第二天:去商场,第三天:去游乐园,第四天:去钓鱼,第五天:去爬山,第六天:去露营,第七天:在家里陪家人。那么这里我们来看这个小程序如何实现?首先我们得提示一下使用者应该干嘛,那我们这里就得用printf函数来打印一些信息给使用者,使用者这时就得输入一个值,那么这里我们就再使用scanf函数来接收这个值,并且我们还得创建一个变量来储存这个数据的内容那么这里我们的代码实现如下:
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int day = 0;//初始化
printf("请输入今天是国庆假期的第几天-》\n");//告诉读者一些信息
scanf("%d", &day);//输入一个值
return 0;
}
那我们我们这里输入了之后我们就要进入了判断的阶段因为我们这里题目比较简单所以我们这里的表达式就可以直接写变量day,然后我们一共有7种情况,所以我们这里就对应着有7个case,我们的case的功能就是检验条件符合的各种情况,比如说我们写成case 1:,那么这个case就会检验switch后面括号里的表达式的结果是不是1,如果是1的话就会执行case 1下面的语句,那么语句块的内容就是printf函数打印出对应的那一天应该干嘛,大家这里应该能明白这里应该怎么写,那么我们的代码如下:
#include
int main()
{
int day = 0;//初始化
printf("请输入今天是国庆假期的第几天-》\n");//告诉读者一些信息
scanf("%d", &day);//输入一个值
switch (day/*表达式*/)
{
case 1://检验表达式的结果是否为1
printf("去看电影\n");
case 2://检验表达式的结果是否为2
printf("去商场\n");
case 3://检验表达式的结果是否为3
printf("去游乐园\n");
case 4://检验表达式的结果是否为4
printf("去钓鱼\n");
case 5://检验表达式的结果是否为5
printf("去爬山\n");
case 6://检验表达式的结果是否为6
printf("去露营\n");
case 7://检验表达式的结果是否为7
printf("在家里陪家人\n");
}
return 0;
}
看到 这里我们代码就完成的差不多了,我们的小伙伴就开开心心的运行了起来输入了一个7发现非常的不错
程序运行成功了,于是又运行了一边,这次输入了一个1 然后就发现不对,有问题我们来看看运行的结果是什么:
这里我们就发现他好像把所有的情况都打印出来了,这是为什么呢?我们输入七的时候就打印一种情况,但是我们输入1的时候却打印了7种情况,并且这情况的顺序还跟我们编写程序的一模一样,这就很难受,我们再输入一个3试一试
这时我们发现他打印了5种情况,也跟我们想的不一样,但是这里我们似乎发现了一个规律:我们输入1时他是一下子把所有的情况都打印出来了,我们输入7的时候他就打印了一种情况,我们输入2的时候打印了5种情况,但是这5种情况中是没有第一种和第二种情况,并且他的顺序也是从第三种情况开始一直往下按着我们之前编程设计的顺序往下执行,那么我们这里能不能猜测一下,之所以出现这种情况的原因是:按照我们目前的结构,我们输入了一个数,他会直接跳到所对应的情况然后依次往下执行,直到往下所有的情况都执行完中途不会停。那么如何验证我们这个猜测呢?我们这里再输入几个值如果我们输入4的话,那么他应该会打印情况4和情况4以下的情况,如果我们输入2的话,那么他就应该会执行情况2和情况2 以下的所有情况,我们来运行以下看结果是不是我们猜测的一样
这里我们看到结果跟我们猜测的一模一样,那么我们的猜测就是成立,那我们这里如何来解决这个问题呢?那么这里我们就要讲到break语句。
我们上面说到按照我们上述所说的基本形式,他会出现一个很严重的错误就是在我们输入了一种情况之后,电脑不仅会把该情况给执行了,还会执行该情况以下的所有情况,那我们这里是不是就得需要一个东西,这个东西的作用就是在执行完一种情况后,他能使其中断停止跳出switch语句,不再执行剩余情况,如果有这个东西的话,我们这里也就不会出现上述的问题,有没有呢?当然有就是break语句。
我们的break一般都将其放到语句块的最下面,用于跳出switch循环,又因为我们这道题的情况我们在每个语句块的最下面都加上一个break,那么我们将上面的例子进行修改可得:
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int day = 0;//初始化
printf("请输入今天是国庆假期的第几天-》\n");//告诉读者一些信息
scanf("%d", &day);//输入一个值
switch (day/*表达式*/)
{
case 1://检验表达式的结果是否为1
printf("去看电影\n");
break;
case 2://检验表达式的结果是否为2
printf("去商场\n");
break;
case 3://检验表达式的结果是否为3
printf("去游乐园\n");
break;
case 4://检验表达式的结果是否为4
printf("去钓鱼\n");
break;
case 5://检验表达式的结果是否为5
printf("去爬山\n");
break;
case 6://检验表达式的结果是否为6
printf("去露营\n");
break;
case 7://检验表达式的结果是否为7
printf("在家里陪家人\n");
break;
}
return 0;
这里我们再运行以下输入一个1我们就会发现不会打印情况1 以下的情况
那么这里我们就解决了这么一个问题,
这时候小伙伴就非常的高兴认为这段代码已经十分的完美了,于是就拿去给其他的小伙伴们看,这些小伙伴们就很调皮,他们看到提示信息要我们输入今天是国庆节的第几天,他们就想:啊国庆节,在我心中国庆有14天,于是他就输入了一个14那我们来看会出现怎么样的结果
我们发现这时编译器没有任何反应,如果这里没有反应的话是什么原因呢?我们这里就有两种猜测:第一种就是他会一直卡在switch语句里面,类似于死循环的状态,一直寻找14所对应的情况,第二种就是直接跳出switch语句。那我们如何来判断究竟是哪种情况呢?那么这里我们就在这个switch语句后面面再加上一个printf函数来打印一个hehe,如果是第一种情况这个hehe就不会打印,因为在switch语句里面产生了死循环,如果打印了hehe就说明跳出了switch语句,那我们看一下运行的结果
我们发现他直接跳出来switch语句,那么我们如何来解决表达式的结果没有对应的情况来对应的问题呢?那么这里有了default语句。
我们上面讲了有时候我们表达式的结果并没有case对应,那么这时候我们为了提醒一下使用者,就有了default语句。那么我们这里就可以将上面的switch语句的基本形式进行修改,在最后加个default
那么我们的代码也就可以修改一下,加入default再运行一下,输入14我们就发现这里会进入default语句给出一个提醒
所以我们这里的default语句的作用就是:在switch语句中,如果所有的case后面的值都不能匹配switch语句的条件,就执行default语句后面的代码。那么看到这里我们的switch语句就差不多结束了,那么接下来我们来看看switch语句的一个例子。
这里我们就举一个例子:
模拟拨打10086服务热线。内容如下:给10086移动客服中心打电话,如果输入的号码不是110086,则提示输入的号错误无法提供服务,如果是10086,则提示:查询话费请拨1,人工服务请拨0,用户输入1,之后显示话费的余额。
首先我们得用printf函数告诉使用者一些基本的信息,其次我们这里要输入电话号码所以得使用scanf函数,那么我们这里得创建一个变量来储存这个电话号码,那我们的代码实现如下:
#include
int main()
{
printf("请输入电话号码-》\n");//打印基本信息
int telephone_number = 0;//创建变量初始化
scanf("%d", &telephone_number);//输入一个值
return 0;
}
完成了上述步骤之后,我们这里首先就有一个判断的过程,判断你输入的号码是不是10086,那么这里就只有两种结果,一个是:是10086,另外一个就是:不是10086,所以我们这里就可以使if…else语句,括号里面的表达式就可以写上其中的一种情况那我们的代码如下:
#include
int main()
{
printf("请输入电话号码-》\n");//打印基本信息
int telephone_number = 0;//创建变量初始化
scanf("%d", &telephone_number);//输入一个值
if (10086 == telephone_number )//输入的号码正确
{
printf("你好,欢迎致电中国移动,客服将会为你提供以服务\n");
printf("查询话费请拨 1\n");
printf("充值话费请拨 2\n");
printf("人工服务请拨 3\n");
}
else//输入的号码错误
{
printf("您输入的号码错误,中国移动无法提供服务\n");
}
return 0;
}
我们完成了输入的电话的判断之后,我们就可以继续往下读题目,因为我们输入号码正确之后,会有更多的功能需要我们去选择,因为这里的功能众多所以我们可以使用switch语句来执行选择的功能,这里我们创建一个新的变量a来储存这里的功能选择的值,switch语句中的表达式也就可以直接填入a,因为有三种功能,我们就可以写3个case语句,case下面的语句块也可以根据对应的功能来填入,最后再加一个default语句其代码如下:
#include
int main()
{
printf("请输入电话号码-》\n");//打印基本信息
int telephone_number = 0;//创建变量初始化
scanf("%d", &telephone_number);//输入一个值
if (10086 == telephone_number )//输入的号码正确
{
printf("你好,欢迎致电中国移动,客服将会为你提供以服务\n");
printf("查询话费请拨 1\n");
printf("充值话费请拨 2\n");
printf("人工服务请拨 3\n");
int a = 0;//
printf("请输入-》\n");
scanf("%d", &a);
switch (a)
{
case 1 ://
printf("你的话费余额为:5201314元\n");
break;
case 2://
printf("你好使用话费充值功能,我们自动打开充值网页请勿关闭\n");
break;
case 3://
printf("你好,欢迎致电移动客服业务,为保证通话质量,您的通话将被录音,谢谢合作\n");
break;
default://
printf("对不起,展示没有该业务\n");
break;
}
}
else//输入的号码错误
{
printf("您输入的号码错误,中国移动无法提供服务\n");
}
return 0;
}
那么这里这道题就结束了想必大家应该能明白。接下来我们来看看switch语句中的易错点。
第一点:
任意两个case语句都不能使用相同的常量值。我们来看个例子
#include
int main()
{
int a = 1;
switch (a)
{
case 1 :
printf("hello\n");
break;
case 1:
printf("world\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
这里我们运行以下就可以发现编译器报错了原因就是我们使用两个相同的常量
第二点:
每个switch语句结构都只能有一个default语句,而且default语句是可以省略的。我们来看个例子这里我们就将上一个例子进行修改再加上一个default语句:
#include
int main()
{
int a = 1;
switch (a)
{
case 1 :
printf("hello\n");
break;
case 2:
printf("world\n");
break;
default:
printf("输入错误\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
然后我们运行以下就可以看到我们的编译器报错了原因就是我们上面说的default语句只能有一个。
第三点:
在case语句表示的条件后有一个冒号“ :”,在编写程序的时候不要忘记写了。
第四点:
switch后面括号里面的表达式的运行结果必须是整形,如果是浮点型的话就会报错。我们可以看一下下面的代码:
#include
int main()
{
float a = 1.0f;
scanf("%f", &a);
switch (a)
{
case 1:
printf("hehe\n");
break;
}
return 0;
}
我们会发现运行一下就会报错,说switch后面的表达式不是整型,大家记得注意一下哈。
第五点:
switch后面的括号里面的运算结果不能是浮点型,那么与之对应的case的后面也不能是浮点型我们看下面的一个例子:
#include
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1.0:
printf("hehe\n");
}
return 0;
}
我们运行一下就会发现错误原因就是case后面的类型为浮点型。
第六点:
在我们初学switch语句的时候,很容易认为break是switch语句的一部分,是switch语句的必要条件。但是并不是这样,break语句可以不和switch语句进行匹配。那我们这里如何来理解呢?我们来看一个例子:我们国庆节结束了进入了上班的时间那么我们的一个星期从星期一到星期五是工作,星期六到星期天是在家里陪伴家人。那根据我们讲的就得这么写:
#include
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1 :
printf("上班\n");
break;
case 2:
printf("上班\n");
break;
case 3:
printf("上班\n");
break;
case 4:
printf("上班\n");
break;
case 5:
printf("上班\n");
break;
case 6:
printf("陪伴家人\n");
break;
case 7:
printf("陪伴家人\n");
break;
defualt:
printf("输入错误\n");
break;
}
return 0;
}
但是这么写的话我们就会发现一个问题就是我们这里好多内容就是一样的,那么我们能不能将代码进行简化,所以就有了我们这里所说的break有时候没必要加,我们这里星期五后面的内容就与前面的不一样,那么我们这里就可以改一下,我们将情况5前面的内容和break全部去掉,情况6的内容和break也去掉,这样就算我们输入了1他也会继续往下执行到了情况5打印上班然后跳出break。那我们的代码如下:
#include
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("上班\n");
break;
case 6:
case 7:
printf("陪伴家人\n");
break;
defualt:
printf("输入错误\n");
break;
}
return 0;
}
我们这么看的话,是不是代码更加的简便,可读性又增加了。
杂谈一:
我问大家一个问题,case后面能接整形常量表达式,那你说case 'a’这样的写法对吗?答案是对的,虽然字符是一个字符常量,但是我们的电脑在存储字符的时候,存的是对应的ascall码值,那么这里的字符常量不就是整形常量了吗,所以这里是可以填字符。另外你觉得case后面能填表达式吗?答案也是可以的,但是必须得是常量表达式或者常量运算。我们看一下下面的代码:
#include
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1 :
printf("hehe\n");
break;
case 1+1:
printf("haha\n");
break;
case 'b':
printf("hello world\n");
break;
}
return 0;
}
我们输入b对应的ascall码值发现结果跟我们预测的一模一样
我们输入2发现结果也跟我们预测的一模一样
杂谈二:
switch语句检验的条件必须是一个整型表达式,这也就意味着其中也可以包含运算符和函数的调用。这里我们首先创建一个add函数用来算出两个整形相加的结果,然后把这个add函数放到switch语句后面的括号里面我们来看一段代码的运行结果:
#include
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
scanf("%d", &b);
switch (add(a, b))
{
case 1:
printf("hehe\n");
break;
case 2:
printf("haha\n");
break;
}
return 0;
}
我们发现着段代码没有任何问题,运行结果正常,所以我们的switch后面的括号里面是可以写函数的。
通过这篇文章我们学习了switch语句的基本形式,switch语句的易错点,以及有关于switch语句的例子,那么switch语句学完了,我们的分支语句也就结束了,接下来我们就进入了循环语句,我们不见不散。
这里为了方便大家学期我把这章的所有链接放到了这个链接里面大家点击链接就可以看到所有的代码
点击此处查看代码
这篇文章结束了,那么为了让大家学的更好,我还在c语言习题这个专栏里面写了几道有关switch语句的习题奖讲解的文章方便大家学习,谢谢阅读,我们一起加油。