为什么要学习选择结构
大家都知道,程序是为了解决生活中的问题,而生活中处处是选择,例如:
对于这种我只想说
好了,话不多说,进入正题
到了现在这个年纪,这个选择早就已经过去,很不幸,我选的是右边这个,如果有初高中的同学看到此篇文章,此路不通。 生活处处是选择,所以在程序中要有对应的结构来实现,这便是今天的主角。 选择结构分为两种实现,各有特点 if else / switch case
if else 详解
1.将上图用代码实现
#include <stdio.h>
int main(void){
int input = 0;
printf("好好学习输入1 \n 天天打游戏输入2");
scanf("%d",&input);
if(1 == input){
printf("上岸985/211);
}else{
printf("大专/普通本科");
}
return 0;
}
解析: 这就是最简单的if - else 结构, if 一个分支 ,else 一个分支, 只会走其中一条路线
2.注意事项 : else匹配问题 —> 悬空else
话不多说,直接上代码
#include <stdio.h>
int main(void){
int a = 2;
int b = 3;
int c = 4;
if(a > b)
if(b < c){
printf(" b < c ");
}
else{
printf(" 呵呵 ");
}
return 0;
}
上述代码,大家认为的运行结果是什么呢? 打印 b< c? 还是只打印 呵呵
可能出乎你的意料,看结果
结果什么也没有打印
解析: else是和它离的最近的if匹配的,并且此if没有被其他else匹配 可能大家还没有理解,把代码缩进一下就明白了 else和这个if相结合,因为a>b为假,所以什么也不输出
3.典型案例 : 输入年龄,判断状态
eg: 18岁以下为少年 ,18~35为青年 , 35~60中年 60以上为老年 输入年龄,输出状态
#include <stdio.h>
int main(void){
int age = 0;
scanf("%d",&age);
if(age <= 18)
printf("少年);
else if(age > 18 && age <= 35)
printf("青年");
else if(age > 35 && age <= 60)
printf("中年");
else
printf("老年");
return 0;
}
简单看出,if - else 结构适合范围类型的选择
如果有这样一个案例 :
如果输入1 表示星期1 , 2 表示星期二 …1 -7 输出 星期一-七
我们当然可以使用if-else来实现
有没有觉得简单而又冗余的逻辑,一篇有一篇,这只是7个,如果更复杂的呢?
所以让我们来看一下 swith -case 结构
switch-case详解
1.将if-else结尾的需求用switch-case实现
#include<stdio.h>
int main(void) {
int num = 0;
scanf("%d", &num);
switch (num) {
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期七");
break;
}
return 0;
}
看起来是不是好多了,swith-case 更适合于处理具体数据的选择,
2.switch-case注意事项
让我们来看看switch的注意事项吧
2.1 switch后边的括号只能是 整形表达式(包括短整/长整) 或者 字符型
这是一个最基本的switch结构 1.switch是把括号中变量的值(即1处) 去下边case所列举的值去匹配 如果成功匹配,执行3处的语句 如果匹配不上,那就成顺序结构 ,啥也不干
case后必须是整型常量表达式
2.设想一下: 如果可以为浮点型的话 那么,3.14 可以匹配的有: 3.140 , 3.1400 , 3.14000… 故只能为整形或字符型
这就有人问了,为什么可以是字符型呢? 字符型在内存中以ASCII码的形式存储,简单来说,就是一个字符对应一个数字 所以说,字符可以说是特殊的整形
2.2switch中的default
这段代码中,如果输入不是 a / b ,那产生的结果是什么呢 显然,default代表默认,意味着如果所有的case子句都匹配不上的话,就执行default下的语句
注意: 与default的位置无关,default子句可以放在开头,或者case子句之间,也可以是结尾
2.3 break
在前边的switch-case子句中,基本都出现的break子句,为什么呢
再匹配到一个case子句执行完了,如果不执行break,会继续向下执行,直到碰到break或者到结尾才会跳出
这个代码就可以看出,我输入的是a ,但是 把下面所有的结果都输出来了,这是一个非常要注意的地方 一定要添加break子句
case后边的值决定从哪里进去,而break决定从哪里出去
我们有时可以利用这个小技巧
eg: 判断小写字母是否为元音字母
int main(void) {
char ch = getchar();
switch (ch) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
printf("是元音字母");
break;
default:
printf("不是元音字母 ");
}
return 0;
}
多个值为一个处理结果的时候,可以起到很大的帮助
switch-case嵌套
#include <stdio.h>
int main() {
int m = 1;
int n = 3;
switch (m) {
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
大家可以计算一下这个,学校一般爱考这种题,注意是否有break就可以
总结
接下来我们使用 if - else 和switch-case 实现同一个案例
输入整数分数,60分 以下不及格,60-70 及格 70 -80 80-90 良好 90-100优秀
使用if-else实现
#include <stdio.h>
int main(void) {
int score = 0;
scanf("%d", &score);
if (score < 60)
printf("不及格");
else if (score < 70)
printf("及格");
else if (score < 80)
printf("中等");
else if (score < 90)
printf("良好");
else
printf("优秀");
return 0;
}
使用switch-case实现
int main(void) {
int score = 0;
scanf("%d", &score);
switch (score / 10) {
case 1:
case 2:
case 3:
case 4:
case 5:
print("不及格");
break;
case 6:
printf("及格");
break;
case 7:
printf("中等");
break;
case 8:
printf("良好");
break;
case 9:
case 10:
printf("优秀");
}
return 0;
}
综上
以上对比显而易见,并无优劣,各有千秋,谁好用用谁 个人观点如下
- 碰到范围类型的选择,优先考虑 if-else
- 碰到具体数据的选择,优先考虑switch-case,switch-case最大缺陷是只能整型
注:
- 本文所有见解,为本人拙见,如有误导,请多指教
- 如果对您有所帮助,点赞支持一下
|