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的用法如下(其实和我介绍的差不多啦):
所以我们可以用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的写法)