前言
上一篇讲了变量,输入输出等基本的内容。
不知道聪明的同学是否认真完成作业了~
下面公布作业的答案~
-
设计一个程序,让用户依次输入两个数,输出这两个数的加减乘除四则运算的结果。
-
设计一个程序,让用户依次输入两个数,将两个变量互换以后输出。
如果之前没有写出来,这里看完思路之后记得自己去重新写一遍~
今天我们将会讲一些新的概念。
分支
我们的宾馆建好了,里面也有了各种房型以及形形色色的顾客,警示标语也贴的到处都是,但是这个宾馆还是评级不高,为啥啊?
你说为啥?你见过给你一块地让你建宾馆,结果你建了一座笔直笔直的建筑?这不浪费吗?有的顾客想找房间还得走出好远~
所以这里引入一个新的概念,分支。
众所周知,如果没有特殊情况,程序是按顺序从上至下一条一条执行的。
而如果我们想改变一些程序的执行顺序,必然要有一些分支。
比如我们把昨天的作业题改一下。
- 设计一个程序,让用户依次输入两个数,然后再让用户输入1、2、3、4四个数的其中一个,当用户输入这四个数中任意一个的时候,依次显示a+b,a-b,a*b,a/b的值。当用户输入其他数字的时候,输出输入错误。
卧槽这是什么,怎么忽然变得这么难了?大佬放我走吧我不学了!
别急,我先随便写一下代码,你再来感受一下这个是不是传说中那么难。
int a,b,operation;
printf("请输入数字a:");
scanf("%d",&a);
printf("请输入数字b:");
scanf("%d",&b);
printf("请选择你要执行的运算,1-加法,2-减法,3-乘法,4-除法:");
scanf("%d",&operation);
if (operation == 1){
int d = a+b;
printf("a+b=%d",d);
}else if (operation == 2){
int d = a-b;
printf("a-b=%d",d);
}else if (operation == 3){
int d = a*b;
printf("a*b=%d",d);
}else if (operation == 4){
int d = a/b;
printf("a/b=%d",d);
}else{
printf("输入有误");
}
怎么样,根据你所学的知识理解一下,是不是也不难,只不过里面加了if else之类的语句。
if 和 else
在上面的程序中,我们也认识了一个新朋友,if和else。
把这俩哥们好好组合起来,就可以成为最简单的分支结构。
if (条件){
执行的语句;
}else{
否则执行的语句;
}
当然,有一些条件比较复杂,我们可以用else if来做衔接
if (条件1){
执行的语句;
}else if(条件2){
不满足条件1且满足条件2执行的语句;
}else{
否则执行的语句;
}
一些需要注意的
- else和if是逻辑对立的,是互相排斥的。就像上面的图,if和else刚好把红色的圆给平分,且互相没有交集。
- else和if之间可以夹杂无限个else if 但是每个条件不能有交集
比如
if (猫){
}else if(小白猫){
}else{
}
就是错误的逻辑,因为小白猫属于猫的一种,所以不可以用else if。条件2里面的else已经把条件1的猫给排除了。
- 可以只有if没有else。
if (猫) {
}
- 多个if和else可以嵌套,else将会和距离他最近的if配对
if (猫){
if (小白猫){
}else{
//这个else和上面的if (小白猫)配对
}
}else if(狗){
}else{
//这个else和上面的 if (猫)以及else if(狗)配对
}
- 如果if里面只有一行语句,if后面的大括号{}可以省略(但是我不建议这样做,因为会乱套)
if (猫) printf("喵");
所以if后面的条件咋写啊?
写了这么多伪代码,只是希望聪明的同学能明白if的结构。
那么现在我们来具体说一下if后面括号里的条件该怎么写。
比较运算符
我们用这些运算符来比较变量的大小,从而作为条件
- 大于号> ,小于号<
if (a > 0) {
//如果a大于0则执行
}
- 大于等于>=,小于等于<=
if (a >= 0) {
//如果a大于等于0则执行
}
- 相等 ==
if (a == 0) {
//如果a等于0则执行
}
这里相等是比较特殊的。据我所知,大部分编程语言都是用连等号来表示相等。用以和赋值区分。
比如上面的a==0是a等于0的意思,而a=0是把0赋值给a的意思。
- 不等于 !=
if (a != 0) {
//如果a不等于0则执行
}
逻辑运算符
我们用这些运算符来进行一些逻辑运算,从而把比较运算符关联起来。
- 逻辑且 &&
if (a > 0 && b>0) {
//如果a>0且b>0则执行,必须要a>0和b>0两个条件都满足,才可以
}
- 逻辑或 ||
if (a > 0 || b>0) {
//如果a>0或b>0则执行,满足a>0或b>0任意一个条件即可
}
- 逻辑非 !
if (!a > 0) {
//如果不满足a>0则执行,说白了就是a不大于0,也就是a<=0
}
注意事项
- 逻辑与逻辑之间是可以嵌套的,也有一定的运行优先级,不过我建议直接无视优先级,把单一的逻辑用括号括起来。
比如
if (a > 0 || (b == 0 && c > 0)) {
//如果 a大于0 或 b等于0且c大于0 则执行
}
事实上 a > 0 || b == 0 && c > 0 不加括号和上面的结果是一样的。&&的优先级比||要高,不过我依然建议加括号,方便自己看得更明白。
一些好玩的东西
//这两个是等价的,是省略写法
if (a) {
}
if (a!=0) {
}
//这两个也是等价的,是省略写法
if (!a) {
}
if (a==0) {
}
大括号与变量的作用域
我们再来回看一下本篇开篇用于演示的代码
if (operation == 1){
int d = a+b;
printf("a+b=%d",d);
}else if (operation == 2){
int d = a-b;
printf("a-b=%d",d);
}else if (operation == 3){
int d = a*b;
printf("a*b=%d",d);
}else if (operation == 4){
int d = a/b;
printf("a/b=%d",d);
}else{
printf("输入有误");
}
可以看到,每个大括号里都有一个整形变量d。
由此可见,在大括号里定义的变量,最大范围只能在本括号里使用。
所以定义变量的时候需要格外注意,在最合适的地方定义,才是正确的选择。
int a;
if (a){
//这里可以调用a
a = 0;
int b;
}
//这里不能调用b
b = 0;//这句会报错
三段式(我也不知道这玩意叫啥)
有一些简单的分支关系,用if来写太麻烦了。
比如
int a = 0
if (a == 0){
a = 1
}else {
a = 2
}
printf("%d",a);
有没有简单一点的写法呢?
事实上,我们可以这样写。
int a = 0;
a == 0 ? a = 1: a = 2;
printf("%d",a);
这个就是三段式,可以写一些很简单的分支结构。
格式就是
条件?满足条件执行:不满足条件执行;
三段式可以简化代码,但是会降低代码的可读性。所以建议分清使用场合。
switch 和 case
switch和case是另一种分支写法。
一般用于变量的固定数值写分支。
switch (变量){
case 数值1:{
//变量为数值1则执行
}break;
case 数值2:{
//变量为数值2则执行
}break;
default:{
//变量的值上面没包含,则执行
}break;
}
比如还是开篇的那个问题,1-加法,2-减法,3-乘法,4-除法,更适合使用switch case来写。
int a,b,operation;
printf("请输入数字a:");
scanf("%d",&a);
printf("请输入数字b:");
scanf("%d",&b);
printf("请选择你要执行的运算,1-加法,2-减法,3-乘法,4-除法:");
scanf("%d",&operation);
switch (operation) {
case 1:{
int d = a+b;
printf("a+b=%d",d);
}break;
case 2:{
int d = a-b;
printf("a-b=%d",d);
}break;
case 3:{
int d = a*b;
printf("a*b=%d",d);
}break;
case 4:{
int d = a/b;
printf("a/b=%d",d);
}break;
default:{
printf("输入有误");
}break;
}
注意事项
- 注意每条后面都要接一个break,如果不加break会有神奇的事情发生~
- switch和if有各自的使用场景,在很多时候是也是可以通用的。
- 结尾的default可以不写。就像if没有写else一样。
以上便是分支的全部内容。
这节课内容虽然没有上一节多,但是需要更多的练习才能做好。
这边留几个思考题~
- 写一个程序,判断用户输入的年份是否是闰年,并输出结果。
- 写一个程序,让用户给定月份,输出该月有多少天。
- 进阶:写一个程序,让用户输入年月日,输出该天是当年的第几天。
- 写一个程序,判断用户输入的数字是否是7的倍数或者含有7的数。