目录
三个循环语句
while循环
下面是while循环结构的结构示意图
do while循环
循环的注意事项
强大的最常使用的for循环
1.for使得循环体更加简洁
2.for循环提高了循环的容错率
使用for循环的两个建议
建议1
建议2
特殊语句goto
多层for循环
while循环是三种循环的一种,并且三种循环的循环结构是相似的,都是由表达式,循环体构成的,再无break和return的情况下只有表达式为假才能到达出口,break在上文讲到了是循环和开关的传送门,而return是整个函数的传送门。
do while循环和while循环的结构极其类似,唯一区别是do while循环会先进入循环,执行一次循环之后再判断表达式,这里并不过多介绍
看过我的C语言初阶函数详解的小伙伴们应该知道递归是为了减少代码量,让少数的代码执行大量的工作,循环也是如此,递归有两个限制条件,存在限制条件和每一次递归之后越来越接近限制条件,为了避免出现死循环,我们同样有这两条限制条件,大家一定要牢记,同时,使用循环关键字continue时也需要小心可能出现死循环的状况
在C语言中,我们经常会说用for循环就能解决所有的循环,同样,在我看来for循环就是while循环的升级,为什么会这么说呢,我们来对比一下while循环和for循环的差别
基本使用格式 //while循环 while(表达式){ 循环体; } //for循环 for(语句1;语句2;语句3) { 循环体; } for循环的语句1是初始化语句,语句2用语判断循环是否进行,语句3是循环结束后的调整语句
for循环相比于while循环多了一个初始化语句和每次循环结束后执行的调整语句,为了写出死循环,调整语句是必要的,至于为什么说for循环是while循环的升级,我总结了两点
//如果要打印从1到10的整数,for和while循环都是怎么做到的呢? //while循环 #include<stdio.h> int main(){ int i=0; i=1; while(i<=10){ printf("%d ",i); i++; } printf("\n"); return 0; } //for循环 #include<stdio.h> int main(){ int i=0; for(i=1;i<11;i++) printf("%d ",i); printf("\n"); return 0; }
观察这两种写法,我们可以明显的发现,for循环比while循环更加整洁
前面我们说到了,continue关键字一定要谨慎使用,使用不当容易出现死循环,简单分析一波。在while循环调整语句都是放在循环体的末尾的,但是continue的出现很容易使在某次循环时跳过了调整语句,从而出现死循环,话不多说,上代码
如果要打印1-10的整数,但不打印6,该怎么做? 这个时候while循环很容易出现死循环 //while循环 #include<stdio.h> int main(){ int i=1; while(i<=10) { if(i==6) continue; printf("%d ",i); i++; } printf("\n"); return 0; } //因为for循环的调整语句在循环体之外,所以不容易出现死循环 //提高了循环的容错 #include<stdio.h> int main(){ int i=1; for(i=1;i<11;i++) { if(i==6) continue; printf("%d ",i); } printf("\n"); return 0; }
程序1的执行结果是死循环,而程序2可以达到目的
既然for循环那么强大,我们是不是就可以随便使用了呢?当然不可以,接下来送上使用for循环时的两个建议
不要在for循环内改变循环变量,很容易使循环失去控制
建议for循环的控制变量的取值采用“前闭后开写法”,这样可以很清晰的计算到循环的次数
那么什么是前闭后开的写法呢? 例如for(i=0;i<10;i++) 这就是标准的写法 这个时候我们可以很清晰的注意到循环最多进行10-0=10次 而这个i就是我们口中的控制变量
同时,大家也可以注意到,我上面的几个for循环的代码都是采用了这种形式
接下来给大家介绍最后一个语句,goto语句也是一种传送门,break是一个只能指向出口的传送门,而goto是一个可以任意选择目的地的传送们
goto语句的基本使用方法就是 again: 语句 语句 语句 语句 if(表达式) goto again; 当表达式为真时,程序为直接执行goto语句然后到达 again:后面的语句
因为goto语句没有任何的限制条件,所以我们需要谨慎使用,所以建议大家配套if语句来进行使用goto,goto语句的跳跃性太强,使用不当很有可能出现整个程序崩溃的情况,大家使用时一定要谨慎
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ char arr[30]={0}; system("shutdown -s -t 60"); a: printf("您的电脑即将关机,如果于一分钟内输入我是猪则停止关机\n请输入>:"); scanf("%s",&arr); if(strcmp(arr,"我是猪")==0) { system("shutdown -a"); } else goto a; return 0; } //这是一个非常有趣的使用goto语句的小程序,同时使用了strcmp字符串比较函数和system系统函数 //当用户输入的不是我是猪时,会利用goto的特性让不断的提示用户输入我是猪 //只有当用户输入的是我是猪时,才会停止关机 //大家可以用来整蛊小伙伴们
和switch和if一样,循环同样可以嵌套使用,在培养了一定的程序思维之后,相信大家对于循环的嵌套并不难理解,但是我们必须掌握多层的for循环,这是学会数组的基础,数组的学习总是伴随着多层的for循环
将下来通过两个简单的程序来简单学习多层的for循环
//经典的百元买百鸡问题 //公鸡5元一只,母鸡3元一只,小鸡一元三只 //请问用一百元买一百只鸡的所有方案 #include<stdio.h> int main() { for (int i = 0; i <= 100; i++) { //用三层循环去不断的列举 for (int j = 0; j <= 100; j++) { for (int k = 0; k <= 100; k++) { //找到合适的情况打印 if (5 * i + 3 * j + k / 3 == 100 && k % 3 == 0 && i + j + k == 100) { printf("公鸡有%d只 母鸡有%d只 小鸡有%d只\n", i, j, k); } } } } return 0; } //用三层for循环我们可以简单的实现,但是如果要列举的话十分复杂 //这就是程序设计之美,运用程序轻松的解决实际问题
接下来是一个九九乘法表
#include<stdio.h> int main() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { printf("%d*%d=%2d ", i, j, i * j); } printf("\n"); } return 0; } //这是我们学习数组前一定要掌握的两层循环,在这个九九乘法表中 //i代表行,j代表列,行列思想在数组中也十分的重要
这个程序的打印结果是 左下角的九九乘法表,为了加强两层循环的理解,小伙伴们一定要去尝试写出自己的九九乘法表,并且将其他三个角的九九乘法表的程序也设计出来,提示我们可能需要借助循环打印空格,来实现我们的目的,希望大家在设计这四个程序之后能熟练的掌握两层甚至多层for循环。
这次的分享结束,希望大家在看完这篇博客之后对自己的学习有帮助
如果想要知道九九乘法表答案的人,可以在我码云的代码仓库中寻找
最后附上我的码云仓库链接
C语言代码: 储存一些认真编写的C语言代码 (gitee.com)https://gitee.com/build-xiaochunbao/c-language-code