一.if语句
1.单分支
1.结构
if(表达式) 语句;
表达式:如果表达式结构为真,则会执行语句(默认执行后面跟的一条语句,若是想要执行多条语句,需要自行加大括号),为假则什么都不会执行。另一种判断方式:若表达式的结果为0,则为假;若结果非0,为真,也会执行语句。
我们看代码
#include<stdio.h> int main() { int a=0; scanf("%d",&a);//输入一个数 if(a>0) printf("a为正数");//如果a>0则会在屏幕打印这句话,反之什么也不打印 return 0; }
2.双分支
结构:二选一
if(表达式) 语句1; else 语句2;
表达式为真执行语句1,为假执行语句2
1.我们看例子:
#include<stdio.h> int main() { int a=0; scanf("%d",&a);//输入一个数 if(a>0) printf("a为正数");//如果a>0则会在屏幕打印这句话 else printf("a表示正数");//表达式为假则会打印这句话 return 0; }
2.可以嵌套使用
if(条件1) { //语句1 } else { if(条件2) { //语句2 } else { //语句3 } }
一般可以用嵌套都可以同多分支结构,所以嵌套一般不用,比较的繁琐。
3.错误案例
一般是if跟else的错误用法,跟条件的写法。
if跟else匹配问题
//错误写法 #include <stdio.h> int main() { int a = 0; int b = 2; if (a == 1) if (b == 2)//是这个if和下面的else匹配,与对齐不对齐没有关系 printf("hehe\n");//所以会输出hehe else printf("haha\n"); return 0; } //正确写法 #include <stdio.h> int main() { int a = 0; int b = 2; if (a == 1)//这里a!=1不会进入括号,就是什么都不会输出 { //需要自己加大括号把想要匹配的if和else括起来 if (b == 2) printf("hehe\n"); else printf("haha\n"); } return 0; }
条件写法问题
//如果年龄在18-30岁之间就输出青年,反之什么也不输出 //错误写法 #include<stdio.h> int main() { int age = 0; scanf("%d", &age); if (18<=age<=30)//错误写法 printf("青年\n");//只要输入>18的都会输出青年 return 0; } //分析:我们输入50,理论上什么也不会输出。但是,它会先执行前面的表达式:18<50,显然 //18<50是成立的,也是就真,那就是1(真默认1,假为0);然后再执行后面表达式:1<30, //显然这个也是成立的,也就是真,那就会执行后续语句,这就是也会输出青年的原因! //正确写法 #include<stdio.h> int main() { //如果年龄大于等于18-成年人 int age = 0; scanf("%d", &age); if (age>=18 && age<=30)//括号里面的条件我们需要写成逻辑结构,需要同属满足才会为真 printf("青年\n"); return 0; } //还有一种错误写法 //本应该是这样写 if(a==1) //却写成if(a=1),这样是错误的!
3.多分支
我们先看结构
if(表达式1) 语句1; else if(表达式2) 语句2; else 语句3
在多分支里面,可以有多个else if(表达式),但是开头的If和结尾的else只有一个。
else if 后面要跟条件,else后面不能跟条件
我们看一道题
//按照不同年龄输出不同数据 //age<18 - 未成年 //18~30 - 青年 //31~50 - 中年 //51~70 - 中老年 //71~99 - 老年 //>99 - 老寿星 #include<stdio.h> int main() { int age = 0; scanf("%d", &age); if (age < 18) printf("未成年\n"); else if (age <= 30) printf("青年\n"); else if (age <= 50) printf("中年\n"); else if (age <= 70) printf("中老年\n"); else if (age <= 99) printf("老年\n"); else printf("老寿星\n"); return 0; }
不同的年龄输出不同的数据,因为条件比较多,所以适合多分支结构。
最上面的条件都不满足的时候,就会执行最后else的语句。
二.switch语句
结构:
switch(整形表达式) { 语句项; }
整形表达式可以是数字或者字符,不能为小数。
switch(整形表达式) { case 整形常量表达式:语句;//case和整形常量表达式中间要用空格隔开,跟语句中间要用冒号 default:语句; }
switch语句要与break语句相互搭配,但是不能使用continue语句。
switch语句允许嵌套
一般用于输入数字或者字符就输出什么
我们看一个例子:
输入1,输出星期一,以此类推,输入7,输出星期天
#include<stdio.h> int main() { int day = 0; scanf("%d", &day);//4 switch (day) { case 1: printf("星期1\n"); break; case 2: printf("星期2\n"); break; case 3: printf("星期3\n"); break; case 4: printf("星期4\n"); break; case 5: printf("星期5\n"); break; case 6: printf("星期6\n"); break; case 7: printf("星期天\n"); break; } return 0; }
我们可以看到,每一个分号前面都有一个break,break的意思就是跳出该程序,不会再执行其他。
比如,我们输入4,此时day=4,然后就会选择case后面为4的语句,就会在屏幕上打印星期四,然后会执行break,跳出循环。所以输入一个4,只会打印星期四,其他的一律不打印。
那有同学就有疑问了,我就要输入1-7之外的数字,看你怎么办!那也不怕,满足你的需求,我们对程序改进一下。
#include<stdio.h> int main() { int day = 0; scanf("%d", &day);//4 switch (day) { case 1: printf("星期1\n"); break; case 2: printf("星期2\n"); break; case 3: printf("星期3\n"); break; case 4: printf("星期4\n"); break; case 5: printf("星期5\n"); break; case 6: printf("星期6\n"); break; case 7: printf("星期天\n"); break; default:printf("抱歉啦,输入错误!"); break; } return 0; }
我们在最后面加了default,只要你输入的数据没有跟case后面的匹配,通通会交给default处理。
格式:
default:语句;//注意,default和语句之间用冒号隔开,结尾要用分号 break;
同学疑问又来了,那能不能输入不同的数据输出同一个结果呢?那当然也是可以的,我们把题目改一下
例子二:
输入1-5,输出工作日;输入6-7,输出休息日。
#include<stdio.h> int main() { int day = 0; scanf("%d", &day);//4 switch (day) { case 1://输入1,会从这里进入,因为没有break会继续往下执行,直到遇到break结束 case 2: case 3://输入3,会从这里开始,也是遇到break才结束 case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; default:printf("抱歉啦,输入错误!"); break; } return 0; }
由此可见,我们可以根据break灵活控制语句的执行。
顺序可以不一样,如case 1到case 4可以换顺序;case1-5也可以跟case6-7换顺序;但是其他的不可以随便调换。最好也不要调换