分支与循环语句(二)

目录

简介

for循环

for循环中的break和countinue

for语句的循环控制变量

一些for循环的变种

do...while循环

do...while循环中的break与continue 

练习题

1.计算 n的阶乘。​

2.计算 1!+2!+3!+……+10!

3.在一个有序数组中查找具体的某个数字n。(讲解二分查找)

4. 编写代码,演示多个字符从两端移动,向中间汇聚。

5.goto语句


简介

上次已经说了if语句和while循环,这次我们接着往下来学习。

for循环

首先为什么会有for循环呢?

答:为了使初始化、判断、调整不分家,控制起来更加的方便,形式上更加地方便,于是就有了for循环。

这个代码是怎么执行的呢?等价于while循环那样去想就可以了。

for循环依次执行1,2,3,4,注意上述标的第一步执行完就不在执行,也就是i=1后,后面说要做的事就是第2,3,4步了。接着2,3,4依次循环,4调整完后就到了2,然后到3,直到判断条件不满足了,结束循环。

for循环中的break和countinue

break的作用就是结束循环语句,i==5时,循环语句就结束了。

continue语句是跳过本次循环,直接到调整的部分, 在5==i后,原本执行的是 printf("%d ", i);接着是i++,但是printf语句被跳过了,所以执行的是i++,接着i=6,于是循环就继续了下去,也就得到了图示的结果。这里要注意的点是在while语句中,continue是回到判断部分,而for循环中是回到调整部分。

for语句的循环控制变量

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

这是一个死循环,这种情况说明什么呢? 一个人想写bug是拦不住的。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

我这种写法相当于[0,10),增加了代码的可读性,因为我们要循环10次。 

一些for循环的变种

for循环中,初始化、判断、调整,都是可省略的。for循环的判断部分省略了,这意味着判断恒为真。所以图中代码一直循环。注意初学者千万不要瞎省略,看图。

 这打印了100个hello world,但是如果我们省略了呢?

这就变成了10个hello world。

大家可以看一下这道题,思考一下答案是多少。答:循环次数是0次。因为for循环中判断的是k=0,这个表达式为假,故不会进入循环,所以循环是0次。

do...while循环

循环至少执行一次,不管它是什么,上来就干。

打印数字1-10

首先,进入do里面,执行语句,然后进行while判断,当i=11时,结束while循环。此时,1-10已经打印出来了。

do...while循环中的break与continue 

先来看break,和其他中的一样,break立即结束循环。

i==5时,结束了整个do..while循环,所以打印出来的是1,2,3,4.

再来看continue,也与其他循环中的一样,continue结束的是本轮循环,也就是continue后的语句不执行(循环体内的)。

图中的代码出现死循环了,原因是i==5后,后面的语句被跳过(循环体内的),i 的值一直不变了,也就是一直会卡在while循环那里,不在往后打印。

练习题

1.计算 n的阶乘。

但是,我们要注意的一点是,计算机输入的数是有范围的,如果你把n输出成10000,那么的出来的结果可能是错的,因为数据类型也有他的取值范围,各个数据类型的范围多大呢?我们以后会说到。

这就错了,我输的是10000,得出的结果却是0。

2.计算 1!+2!+3!+……+10!

当然还有一种时间复杂度更低的写法.

 因为要求的是1!+2!+3!+……+10!,比如3! = 2! * 3,所以就有了上述的写法。读者可以自行分析一下。

3.在一个有序数组中查找具体的某个数字n。(讲解二分查找)

首先,我们要聊一下什么是二分查找,二分查找只适用于有序表,举个例子,一个元素1-10的数组,我要你找到元素7所在的位置,你可能一下子就可以找到,但计算机这个东西,它很呆的,如果你不给予它更好的算法,它就真的会一个接一个地按顺序遍历。那计算机就要查找七次,但是如果用了二分查找呢?

 

 不要怪博主字写的丑,懒得打字了,以后遇到这种需要解释的,也用这种方式解释给大家听吧。

我们可以看到,原来的需要7次查找的情况被减少到了4次。如果说这个元素更多的话,二分查找的优越性不就体现出来了嘛。接下来上代码。

这是查找成功的。

这是查找失败的。 

4. 编写代码,演示多个字符从两端移动,向中间汇聚。

int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
这里这样写是因为字符串中,还以'\0'为结束,
比如,"abc",实际上他是 'a','b','c','\0',
而数组下标是从0开始的,数组里的元素个数是从1开始的,
所以要将字符数组的个数减2,才是最右边元素的下标。

还有一种写法  int right = strlen(arr1) - 1;  strlen是一个函数,计算字符串长度的,但是并不会把'\0'给算进去。

图中,我所使用的函数,包含在我画的里面,想了解详情请自己查询。 

5.goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

 关机程序
只要程序运行起来,电脑就在1分钟内关机,如果输入:我是猪,就取消关机。

而如果不适用goto语句,则可以使用循环:

最近因为忙了些其他事情,加上学习状态又不对,所以耽搁了很多天,文章可能草草了事,请读者见谅接下来一定加倍用心。 如有错误,请大家多多指正。

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

早点睡觉1.0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值