目录
简介
上次已经说了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的阶乘。![](https://img-blog.csdnimg.cn/bf7eb6e4bb164e8f9139884fbd8190f6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP56qB56qB56qB,size_20,color_FFFFFF,t_70,g_se,x_16)
但是,我们要注意的一点是,计算机输入的数是有范围的,如果你把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语句,则可以使用循环:
最近因为忙了些其他事情,加上学习状态又不对,所以耽搁了很多天,文章可能草草了事,请读者见谅接下来一定加倍用心。 如有错误,请大家多多指正。