C语言初阶分支与循环(3)

目录

三个循环语句

while循环

下面是while循环结构的结构示意图

do while循环

 循环的注意事项

强大的最常使用的for循环

1.for使得循环体更加简洁

2.for循环提高了循环的容错率

使用for循环的两个建议

建议1

建议2

特殊语句goto

多层for循环


三个循环语句

while循环

下面是while循环结构的结构示意图

C语言初阶分支与循环(3)

 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代表列,行列思想在数组中也十分的重要

C语言初阶分支与循环(3)

这个程序的打印结果是 左下角的九九乘法表,为了加强两层循环的理解,小伙伴们一定要去尝试写出自己的九九乘法表,并且将其他三个角的九九乘法表的程序也设计出来,提示我们可能需要借助循环打印空格,来实现我们的目的,希望大家在设计这四个程序之后能熟练的掌握两层甚至多层for循环。

这次的分享结束,希望大家在看完这篇博客之后对自己的学习有帮助

如果想要知道九九乘法表答案的人,可以在我码云的代码仓库中寻找

最后附上我的码云仓库链接

C语言代码: 储存一些认真编写的C语言代码 (gitee.com)C语言初阶分支与循环(3)https://gitee.com/build-xiaochunbao/c-language-code

上一篇:“21天好习惯“第一期——12


下一篇:Python基础7 面向对象编程进阶