经过前面题目的洗礼,相信大家对if语句已经有一个大概的了解了。如果还没能熟练掌握if语句的建议先选择以往的文章进行学习
那么这期,不妨让我们来学习一个因果类语法的另一种表达,switch语句。
首先,让我们先来看一下switch语句的基本构造:
switch(表达式){
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
…
case 常量表达式n: 语句n;
default: 语句n+1;
}
- 其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
简单点来说,switch()括号内填的是要判断的参数。而case后则在表达式内进行判断,例如switch(a)里 case 2 的意思等同于if(a==2),后面语句1则是这个判断成立后,要输出的值。而default的作用和if语句中的else一样。
下面来看例子:
#include<stdio.h>
main()
{
int a;
switch(a){
case 1:printf("2");
default: printf("3");
}
}
#include<stdio.h>
main()
{
int a;
if(a==1){
printf("2");
}
else{
printf("3")
}
}
以上两个代码要表达的意义是一样的。
下面我们根据实际例题来使用和学习这一语句的运用。
1036:某年某月有多少天
- 题目描述
给你一个年份和月份,求该月有多少天 - 输入
一个年份(正整数),一个月份(1-12),中间有一个空格隔开 - 输出
该月的天数,单独占一行。 - 参考代码:
#include<stdio.h>
main()
{
int a,b,c;
scanf("%d %d",&a,&b);
switch(b)
{
case 4:
case 6:
case 9:
case 11: c=30;break;
case 2:
if(a%4==0&&a%100!=0||a%400==0)
c=29;
else
c=28;
break;
default:c= 31;
}
printf("%d",c);
}
- 代码解析:
首先我们看到题目要求判断的是某年某月有多少天。然后我们先直接想,这里面所需要判断的条件在哪里。首先是月份:4.6.9.11月是小月,是30天,并且不会随着年份变化,我们先列出来。接着是1.3.5.7.8.10.12月是大月,是31天,也不会随着年份变化,我们也先列出来,最后还有一个比较特殊的是2月,它会随着年份的改变而改变,平年28天,闰年29天,所以我们在2月分要分两个判断进行。
表格大致如下:
4月 6月 9月 11月 : 30天
1月 3月 5月 7月 8月 10月 12月: 31天
2月: 平年:28天 闰年:29天
我们可以看到,这里面需要判断的条件是非常多的, 如果用if语句写的话,代码量会非常的多,而且容易乱,特别是2月需要判断平年和闰年,会用到if的嵌套,容易导致判断的重复和混乱,所以,在这道题里,更适合使用switch语句。
- 由于这里的判断主要条件是月份,所以我们把定义的b作为switch的主要判断语句。因为4.6.9.11的天数都是30天,所以把这几个条件放在一起判断,当其符合其中一个时,c=30,并且break; 退出判断。然后在 b=2的时候,我们要在这里判断闰年平年。把if的判断放到case 2:里面运行。然后除了以上月份外,其他月份都为31天,所以在最后加上default:c=31; 即可。
要注意的是,switch语句中,每执行完一段语句都要在后面加上break,表明退出整个switch语句。
- 在使用switch语句时还应注意以下几点:
1.在case后的各常量表达式的值不能相同,否则会出现错误。
2.在case后,允许有多个语句,可以不用{}括起来。
3.各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
4.default子句可以省略不用。