零基础通关C语言——chapter 4——分支和循环上

前言:

我们在chapter2中提到过语句的分类,知道在五种语句当中 控制语句 的重要性,而控制语句又可以分为三类语句,即分支语句,循环语句和转向语句

它们的关系可以看一下下面的思维导图

afbd880064e6462eba6c72d634e4fb9d.png

今天我们就来先讲讲其中的分支与循环语句的一部分

ok,明确了本篇博客的目标,我们就开始吧!

一.if语句

经过前面知识的学习,我们已经知道了要实现分支我们可以使用 if 和 switch 语句

首先来看一下if语句吧!

1.if

if语句的语法形式如下

6ae9413058a44ebcb6927ffa5816353d.png

当表达式成立(为真),语句执行

当表达式不成立(为假),语句不执行

举个例子  当我们要写一个代码,当输入一个整数时要能判断是否为奇数

示例如下

1414a107d1514bafb9b16994a12161b5.png

2.else 和else if

当我们需要多条分支时,我们就需要引入else 和else if

它的语法如下

c2709839673748e3b63a94a6da3b5a38.png

ad85971016e04f3398fe7522d080b6b8.png

比如上面的那个例子,如果我们输入一个整数需要判断是奇数或是偶数,那么就要用到else语句

请看下面的代码示例

a070d6a15ef64bbe9a63b5f8b45e8dc3.png

对于else if 逻辑也是如此,这里就不再赘述了,留给大家去写吧!

3.分支中包含多条语句

在默认情况下 if 和else都只能控制一条语句

如果我们在一个分支中输入多条语句而不做任何处理,可能会出现以下的问题

请看下面的代码示例

0b2ca9c9229745e58c0bc4412d24c73e.png

乍一试好像没什么问题,但当我们输入一个小于18的值时,就暴露了问题!        

请看下面的结果

a6ab6875b8e74553b4fb877890ed3eca.png

我们发现对于下面的那条语句,不管条件是否成立,它都会被执行,那如果我们需要让一条分支下执行多条语句,该怎么办呢?

这时候,就要使用{ } 将代码括起来

4.嵌套if

在 if else 语句中,我们可以嵌套if,构成多重判断

比如,要求输入一个整数,判断输入的数是0,还是正数或者是负数

请看以下代码

6ea5179bfb24424087ea670e096f09f6.png

其实嵌套跟用else if 有着异曲同工之妙,请看以下代码

0e2ffc1d6cf44c17b7af7697a120779a.png

大家可以多感受一下

5.悬空else问题

这个问题,我们从以下代码看起

大家先思考一下,这里代码的结果是多少 ?

b82de151241b4320a1fff1020dfb6d56.png

如果你的答案是haha  那么恭喜你成功踩坑了

其实代码的输出结果是:啥也不输出

为什么呢?

这就是悬空else问题。我们可以记住这样一条规则。如过有多个if和else,else总是跟最接近的if匹配

如果我们吧代码改成下面形式,大家很容易就可以理解这个问题了

6ce12251b3604e7ea5c3514304afd665.png

所以我们以后在写代码的时候要注意括号的使用,让代码的可读性更高

二.关系操作符(运算符)

我们在chapter3(即上一篇博客, 大家可以从结尾的专栏进入)中提到过操作符的分类,并且我们已经粗略的讲过了算术操作符,赋值操作符和单目操作符

今天我们再讲一下关系操作符,条件操作符和逻辑操作符

先看一下关系操作符吧

关系操作符主要包括以下6个

1.>

2.<

3.>=

4.<=

5.==

6.!=

关系操作符通常返回 0 或 1 ,表示真假

而关系操作符也常运用我们上面讲的 if 以及接下来会讲的while结构

cd3fdabb58294308aa6a1454a2bde340.png

注意 运算符== 和赋值操作符的=是两个运算符,两者不能替代!

还有一个容易出现的错误就是 多个关系操作符不宜联用!

7ece163bf191414dbda0c6bf2a5cdc28.png

这个式子虽然不会报错,但是通常不会达到想要的效果

因为这里的i<j返回0或者1,所以最终的结果是0或1与变量k比较

如果想要判断j的值是否在i和k之间,应该使用下面的 写法

e69f084792404d5da937c648c2ccbd9e.png

那么以上就是关系操作符,我们需要掌握的。剩下的按字面意思理解就行,没什么特别注意的

三.条件操作符(运算符)

条件操作符也叫三目操作符,需要接受三个操作符,形式如下

exp1 ?exp2:exp3

条件操作符的计算逻辑是:如果exp1为真,exp2计算,其计算的结果为整个表达式的结果,如果exp1为假,exp3计算,计算的结果是整个表达式的结果

下面有两个练习

练习一:使用条件操作符表达下面代码的逻辑

401e5dc130ed4b44a1ecc5d572b8f0a6.png

参考代码如下

223893e59f694a29ab4b783d9dafd583.png

练习二:使用条件操作符实现找两个数中较大值

参考代码如下

a127039be4c34604a22d845a1f1805a7.png

四.逻辑操作符(运算符)

逻辑操作符主要有下面的三个运算符

!  逻辑取反运算符,,用于改变单个表达式的真假

&& 与运算符,就是并且的意思

| | 或运算符,就是或者的意思

理解了这个操作符后我们做一个练习,闰年的判断

输入一个年份year 判断year是否为闰年

闰年判断的规则:

1. 能被4整除并且不能被100整除是闰年

2. 能被400整除是闰年

下面是参考代码

1eaa13816ffd4f63a9384f0cac3a08a4.png

97b5b3d5b33e4d94ac4a61f2b912a9dd.png

下面讲以下逻辑操作符的另一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的

如果,左边的表达式满足逻辑操作符的条件,就不再对右边的表达式求值,这种情况我们称之为短路

如下面的代码:

if(month >= 3 && month <= 5)

表达式中&& 的左操作数是 month >= 3,右操作数是 month <= 5。

当左操作数的结果为零时,即使不判断右边,整个表达式的结果也是零

所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行

对于 || 操作符是怎么样呢? 

其实原理是一样的,我这边直接下结论了,大家可以自己去想一下推导的过程

结论如下:

| |操作符的左操作符结果不为0时,就无需执行右操作数

像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数计算的运算称为短 路求值

练习:阅读代码,计算代码输出的结果

140df25dd78c45f2be7ec7e7ff4fadf7.png

五.switch语句

开头我们提到过。除了 if 语句外,C语言还提供了 switch 语句来实现分支结构

它的语法如下

0cb3fb6fece34856b469231f85c4b45c.png

上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值, 就执行 default 分支

特别注意:

1. switch 后的 expression 必须是整型表达式 

2.  case 后的值,必须是整形常量表达式

1.if语句和switch语句的对比

练习:输入任意一个整数值,计算除3以后的余数

如果我们用if语句完成,代码如下

69db28e62eb34fafb291e6ee18fa773b.png

如果使用switch语句写,代码示例如下

b6e79cbe5e9d4945978adc10bca10111.png

上述代码中,我们要注意的点有

1.case 和后面的数字之间必须有空格

2.每一个case语句中的代码执行完成后 ,需要加上break 才能跳出这个switch语句

2.switch语句中的break

前面的代码中, 如果我们去掉break,会出现什么情况呢?

测试一组,看以下结果

86f80267e42740ef8dae510a71c09a51.png

我们发现,7除以3本来余数是1,但是我们发现程序的结果多了“余数是2”的打印。

这是为什么呢?

原因是 switch 语句也是分支效果的

只有在 switch 语句中使用 break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上面的代码就执行了 case 2 中的语句。 所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。 当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了

那是不是每个case下面都必须加上break呢?

我们来看下面的例子

练习: 输入一个1~7的数字,打印对应的星期几

 例如: 输入:1 输出:星期一

参考代码如下

4c351dffc40c4871ac75d6e0927cb6b2.png

b9f5365dcdde485ab8382872269de0c5.png

而如果需求发生变化,变为:

1. 输入1-5,输出的是“工作日”;

2. 输入6-7,输出“休息日”

那参考代码如下:

1bbf83544546484caef949a726672534.png

从上面的练习中,我们发现应该根据实际的情况,来在代码中觉得是否使用 break ,或者在哪里使用 break ,才能正确完成实际的需求

3.switch语句中的default

在使用 switch 语句的时候,我们经常可能遇到⼀种情况,比如 switch 后的表达式中的值无法匹 配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入default 子句

0cb3fb6fece34856b469231f85c4b45c.png

switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行 default 子句

就比如前面做的打印星期的练习,如果 day 的输入不是1~7的值,如果我们要提示:输入错误,则可以这样完成代码

575675283f5144198bd2f4c9948c9b55.png

73733877097a4d94bdd0554426d79981.png

 4.switch语句中的case和default的顺序问题

在 switch 语句中 case 子句和 default 子句有要求顺序吗?

default 只能放在最后吗?

其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足需求就可以

六.while循环

经过前面知识的学习,我们已经知道了要实现循环我们可以使用while 或 for 或者do while语句

接下来就介绍一下while语句   

1.if和while的对比

其实while语句的语法结构和if语句非常相似

请看它们的语法形式

if(表达式)

     语句;

while(表达式)

    语句;

他们的区别就在于while语句是可以实现循环效果的

2.while循环的实践

  

练习:在屏幕上打印1~10的值

参考代码

七.for循环

1.语法形式

for 循环是三种循环中使用最多的, for 循环的语法形式如下

for(表达式1; 表达式2; 表达式3)

    语句

表达式1 用于循环变量的初始化

表达式2 用于循环结束条件的判断

表达式3 用于循环变量的调整

2.for 循环的实战

练习:在屏幕上打印1~10的值 (记得用刚学的for语句呀)

参考代码如下

3. while循环和for循环的对比

请看下面两张对比图

可以看出,for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部 分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形 式上 for 循环要更优⼀些

4.练习

练习:

计算1~100之间3的倍数的数字之和

参考代码如下

课后习题

1.三角形判断_牛客题霸_牛客网

2.乘法口诀表  要求:在屏幕上输出9*9乘法口诀表(这个没有链接,可以在自己的编译器调试)

3.输⼊⼀个正的整数,逆序打印这个整数的每⼀位

例如: 输⼊:1234,输出:4 3 2 1 输⼊:521,输出:1 2 5(这个也没有链接,可以在自己的编译器调试)

结语:

好了今天的分享就到这里了

哦,对了,如果大家觉得博客在哪里需要改正,可以在评论区留言呀,感谢感谢

也希望大家给这个萌新博主点个赞吧(求求)

让我们在接下来的时间里一起成长,一起进步吧!

ae13b983358a40f8957b3d3e5eb2aad3.jpg

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃肉的Humble

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值