C语言_分支与循环详解

结构

C语言是结构化的程序设计语言,它支持三种结构,分别是顺序结构,选择结构,循环结构。


语句


控制语句

控制语句用于控制程序的执行流程,以实现程序的各种结构方式(顺序结构、选择结构、循环结构),它们由特定的语句定义符组成。

C语言有九种控制语句,可分成以下三类:

1. 分支语句:if、switch;

2. 循环语句:do while、while、for;

3. 转向语句:break、goto、continue、return。


if

  • 单分支

  • 双分支

  • 多分支

  • 例子

这个例子有同学会问,我age能不能写成 18 <= age <= 30 这种形式呢?答案是不能,这种形式在数学上可行,但在代码上不行,因为它会先判断 18 <= age 返回结果为真(1)或假(0),然后才和30进行比较。

其次,有人会问这段代码都去掉else可以吗?答案是可以的,这样的话age会进入每个if判断,效率低下,加else的目的是当一个if成立就不会往下走其他的if了。

还有一点,if默认只能控制一个语句,如果你是多条语句,则需要加上大括号,大括号括起来的代码叫代码块。

C语言中如何表示真假?假(0),真(非0)。

  • 代码规范

悬空else

上图这份代码运行结果大部分人会被误导为haha,首先,这份代码的写法不规范,其次,else的匹配规则是找上面最近的if,而不是看是否对齐。

当一个常量和一个变量在比较相等的时候,可以把常量放在左边,这样万一写少了一个等号可以直接把错误暴露在编译器下。


switch

  

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。

  • 如果你想多个case执行同一个效果,那么可以写以下代码。

switch的执行逻辑是先进入匹配的case,然后往下执行,遇到break才会跳出。

  • 如下图,如果所有case都不匹配但你也想输出东西的话,你可以使用default。

default与case没有顺序位置的要求。

switch允许嵌套使用,遇到break只会跳出一层switch。


while

  • while语句中的break和continue。

如上图,这里的输出结果是1 2 3 4 ,因为到5的时候有break退出了循环,break的作用就是终止循环,不过只能终止一层循环。

如上图,这里的输出结果是1 2 3 4 死循环,因为continue的作用是跳过continue后面的代码,直接去while判断。

  • getchar()与putchar()

getchar(),读取一个字符,无参,返回类型int,读取正常返回字符的ascii码值,读取失败返回EOF,EOF本质是-1。

putchar(),打印一个字符。

上图输出结果是你输入一个东西,它原样打印。        

EOF - end of file,ctrl z 可以让getchar()返回EOF。

  • getchar()清理缓冲区

上图,理论上有两个scanf我应该要输入两次吧,然而实际情况是我只输入了一次就返回结果了,为什么?

因为scanf与键盘之间还有一个输入缓冲区,我们敲打键盘进入输入缓冲区然后scanf在输入缓冲区读取,如果输入缓冲区为空那么scanf会等待,如上图我们输入了123456\n,scanf会读取\n前面的东西也就是123456,接下来第二个scanf看到输入缓冲区有东西就直接读了,所以造成了没有第二次输入的现象。

解决方法:既然多了一个字符那我们把它拿走是不是就可以了呢?

还有一种情况,假如我们第一次输入有空格,scanf只会读空格前面的,那么此时输入缓冲区就会剩下一个或多个字符,这时候就需要用循环getchar()处理了。

比如我们输入的是123456 sdfgsdgd\n,那么第一个scanf拿到123456,剩下空格到回车的内容就交给getchar()处理了。


for

既然有了while为什么还要for?答案:因为while的初始化部分,判断部分,调整部分比较分散,遇到庞杂的代码就不方便了。

我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。

  • for语句的循环控制变量

1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。

2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

  • 一些for循环的变种

下图,for循环中的初始化部分,判断部分,调整部分是可以省略的

但是初始化部分的省略自己得留个心眼,比如一些for循环嵌套,如下图,当第一次外层循环走了一次,内层循环走完后,j的值会一直保留。

下图是表达式可以写多个内容

下图循环多少次?答案:0,因为我直接看判断部分,k=0,将0赋值给k,最后结果为0(假),所以不进入循环。


do while

  • 结构

  • 特点

循环至少执行一次


goto

  • 语法

goto again 就是跳到again的地方。只能在一个函数内跳转,不能跨函数。

  • 适合场景

终止某些深度嵌套的结构,一次跳出多层循环。


 

相关练习

1.

答:B

2.

答:8

3.在屏幕上输出9*9乘法口诀表

补充细节,有些结果是一位数有些是两位数,如何对齐美观?

%2d可以打印两位整数,如果没有两位则左边用空格填充。

%-2d就是右边用空格填充。

4.求10个整数中最大值

思路:输入10个数,从这10个数随便取一个当最大值,遍历比较谁大谁就是最大值。

5.计算1/1 - 1/2 + 1/3 - 1/4 + 1/5 ... + 1/99 - 1/100的值,打印结果。

关键点:这里的1/2, 1/3...整形的话是等于0的。想要小数结果,除号两端至少有一个是浮点数。

6.编写程序数一下1到100的所有整数中出现多少个数字9。

思路:个位为9的:9,19,29,39,49,59,69,79,89,99

十位为9:90,91,92,93,94,95,96,97,98,99

我们可以发现99出现了两次。这里不能用else if, 因为99需要判断两次。

7.小乐乐求和

思路:计算1到n的和。等差数列求和公式:(首项+尾项)*项数 / 2

8.小乐乐找最大数

方法1

方法2

9.判断是不是字母

关键点:注意清理缓冲区的\n。

方法1

方法2

isalpha()可以判断是否是字母,是返回非零,不是返回0。

10.网购

  • 代码仓库

Branch_Loop/Branch_Loop/test.c · 林宇恒/code_c - 码云 - 开源中国 (gitee.com)

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值