2.1 for循环

2.1 for 循环

这章我们主要学习的方面是循环结构程序设计,那什么叫做循环结构程序呢?我们在学习1.3顺序结构程序设计时已经有所提及,事实上就是编写比较少量的语句,让计算机做很多次重复的,或者类似的工作,这就是循环结构程序设计的基本思路。


for 的格式和基本用法

首先看一下 for 循环的格式:
for (初始化;初始值循环变化的限定条件;循环一次初始值的变化)
光看文字是非常难理解的,我们直接上代码:

#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
		printf("%5d",i);
}

看一下结果:

在这里插入图片描述
这个代码的for循环中,int i=1即为这个循环中的初始化,i<=n为初始值循环变化的限定条件,i++代表着每经过一次循环初始值发生的变化。

就是说在这个循环中初始定义了一个变量i,每经过一次循环,进行一次i++(就是i每次循环加1),然而每次进入循环前,这个i的值都必须满足限定的条件,就是i<=n。事实上,显而易见这个循环就是对{ }中的操作重复操作了n次。

需要注意的是,对于这三个语句,我们每次先进行限定条件的判断,然后在循环体中的所有语句执行完毕后,进行循环初始值(有时候也可能是别的变量)的变换。

我个人觉得for循环和python里面的enumerate函数在使用的方法上感觉是非常相似的(C里面有个enum类型不过感觉和enumerate不大一样)。


于是我们改一下循环初始值的变化方式

#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	for (int i=1;i<=n;i+=2)
		printf("%5d",i);
}

让 i 每次循环增加2,结果变成了这样
在这里插入图片描述
输出了1-n之间所有的奇数


我们再改一下i的初始值:

#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	for (int i=2;i<=n;i+=2)
		printf("%5d",i);
}

在这里插入图片描述
结果变成1-n中所有的偶数。


然而事实上在for循环中,这三个条件并不定要写在括号中。
如果说初始量的初始化定义在for循环外部已经写好了,初始化的变量的变化在循环的内部中进行,又或者说循环的限定条件在for循环的内部中进行判定。

那么这三个条件的任意一个都可以省略掉。

先举一个比较简单的例子:

7744问题:

输出所有形如aabb的 4 位完全平方数。

我们为了避免可能出现的浮点误差,顺便看一下for循环的条件是如何隐蔽的,所以选择介绍书本上的第二种方法

#include<stdio.h>
int main(){
	for (int x=1; ;x++){//注意这个for循环就是残缺的
		int n = x*x;
		if (n<1000) continue;
		//continue表示代码运行到这里,这一次循环直接结束,进行下一个循环
		if (n>9999) break;
		//break表示代码运行到这里,整个循环全部结束,直接退出这个循环,进行这整个循环下别的代码
		//break和continue的区别就在于都是结束本次循环,break退出整个循环,continue进入下一次循环
		//这两个判断就是这个循环的限定条件,表示列举出1000-9999所有的完全平方数
		int hi = n/100;//n的前两位
		int lo = n%100;//n的后两位
		if (hi/10==hi%10 && lo/10==lo%10)//n前两位和后两位分别相等
			printf("%d\n",n);
	}
	return 0;
}

这里continue和break的用法如下(其实和我介绍的差不多啦):

continue的用法

break的用法


所以我们可以用for循环做一些比较简单的while循环:

#include<stdio.h>
int main(){
	int n,tot=0;
	scanf("%d",&n);
	for (;n!=1;n%2==1?n=3*n+1:n/=2)
		tot++;
	printf("%d",tot);
	return 0; 
}

这是用for循环做冰雹猜想的检验。代码比较简单,大家就自行阅读吧(如果看不懂的话后面也会介绍用while的写法)


版权声明:本文为weixin_55835175原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。