目录
三个循环语句
while循环
下面是while循环结构的结构示意图
while循环是三种循环的一种,并且三种循环的循环结构是相似的,都是由表达式,循环体构成的,再无break和return的情况下只有表达式为假才能到达出口,break在上文讲到了是循环和开关的传送门,而return是整个函数的传送门。
do while循环
do while循环和while循环的结构极其类似,唯一区别是do while循环会先进入循环,执行一次循环之后再判断表达式,这里并不过多介绍
循环的注意事项
看过我的C语言初阶函数详解的小伙伴们应该知道递归是为了减少代码量,让少数的代码执行大量的工作,循环也是如此,递归有两个限制条件,存在限制条件和每一次递归之后越来越接近限制条件,为了避免出现死循环,我们同样有这两条限制条件,大家一定要牢记,同时,使用循环关键字continue时也需要小心可能出现死循环的状况
强大的最常使用的for循环
在C语言中,我们经常会说用for循环就能解决所有的循环,同样,在我看来for循环就是while循环的升级,为什么会这么说呢,我们来对比一下while循环和for循环的差别
基本使用格式
//while循环
while(表达式){
循环体;
}
//for循环
for(语句1;语句2;语句3)
{
循环体;
}
for循环的语句1是初始化语句,语句2用语判断循环是否进行,语句3是循环结束后的调整语句
for循环相比于while循环多了一个初始化语句和每次循环结束后执行的调整语句,为了写出死循环,调整语句是必要的,至于为什么说for循环是while循环的升级,我总结了两点
1.for使得循环体更加简洁
//如果要打印从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循环更加整洁
2.for循环提高了循环的容错率
前面我们说到了,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循环时的两个建议
建议1
不要在for循环内改变循环变量,很容易使循环失去控制
建议2
建议for循环的控制变量的取值采用“前闭后开写法”,这样可以很清晰的计算到循环的次数
那么什么是前闭后开的写法呢?
例如for(i=0;i<10;i++)
这就是标准的写法
这个时候我们可以很清晰的注意到循环最多进行10-0=10次
而这个i就是我们口中的控制变量
同时,大家也可以注意到,我上面的几个for循环的代码都是采用了这种形式
特殊语句goto
接下来给大家介绍最后一个语句,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的特性让不断的提示用户输入我是猪
//只有当用户输入的是我是猪时,才会停止关机
//大家可以用来整蛊小伙伴们
多层for循环
和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