1、循环结构嵌套形式
上面三种循环语句结构可以相互嵌套,组合非常灵活。循环嵌套需要记住最重要的一点:”外循环执行一次,内循环要完整执行一遍”,要通过实例加深对这一句话的理解。
注1:一个循环结构由四个要素构成:循环初始条件、循环判定条件、循环体和循环修正条件。循环初始条件就是循环结构的一些变量定义和初始化值设置。循环判定条件就是循环的判定表达式。循环体就是循环执行部分。循环修正条件就是为了进入下一轮循环,需要改变循环条件。
注2:不管怎么嵌套,仍然只需要分析出每一层循环结构的四要素,然后套用各种循环语句结构形式就行。因此,最为关键的还是分析出每一层循环结构的四要素,还要注意内层和外层的关系。
2、循环结构嵌套示例
对于求解1+(1+2)+(1+2+3)+...+(1+2+3+...+n)。
对于这个问题,首先分析外层的四个要素如下:
循环初始化条件:i=1, sum=0; //从上面问题来看,主要有要加的项(对于第一项,i=1)和加的结果(在加之前结果为0,即sum=0)。
循环判断条件:i<=n; //从上面问题来看,要加的项有n项,也就是小于等于n,即i<=n,这个n没有指定值,就需要赋值或者输入。
循环体: sum+=t; // 从上面问题来看,对于每一项t,都要加进sum中,即sum+=t,其中t由内层计算得到的。
循环修正条件: i++; //从上面问题来看,每一项都要加进sum,所以i要+1,即i++。
这时,我们可以写下如下代码:
#include "stdio.h"
int main()
{
int i,j,n;
long t,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++) //外层循环的初始条件、判定条件和修正条件
{
...; //内层循环部分,计算t,目前缺失
sum+=t; //外层循环的循环体
}
printf("sum=%ld",sum);
return 0;
}
内层就是为了计算每一项得到结果t,而对第n项是1+2+3+...+n,这样内层的四个要素如下:
循环初始化条件:j=1, t=0; //从上面问题来看,主要有要加的数(对于第一个数,i=1)和加的结果(在加之前结果为0,即t=0)。
循环判断条件:j<=i; //这里要建立与外层的关系,这里的i是指第i项。从上面问题来看,第i项是1+2+3+...+i,也就是j小于等于i,即j<=i。
循环体: t+=j; // 从上面问题来看,对于每一个数j,都要加进t中,即t+=j。
循环修正条件: j++; //从上面问题来看,每一个数都要加进t,所以j要+1,即j++。
这时,套用for语句循环结构形式,则内层循环代码如下:
t=0;
for(j=1;j<=i;j++) //内层循环的初始条件、判定条件和修正条件
t+=j; //内层循环的循环体
这样最终代码和结果如下:
#include "stdio.h"
int main()
{
int i,j,n;
long t,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++) //外层循环的初始条件、判定条件和修正条件
{
t=0;
for(j=1;j<=i;j++) //内层循环的初始条件、判定条件和修正条件
t+=j; //内层循环的循环体
sum+=t; //外层循环的循环体
}
printf("sum=%ld",sum);
return 0;
}
注:不管是两重、三重还是更多重的循环嵌套,都可以这样分析和编写代码,从最外层开始,逐步内层实现,而且外层循环变量可以用于内层循环判定条件,以建立内层与外层的关系。当然,也有内外层变量没有明显约束关系,只有“外层执行一轮次而内层执行所有轮次”的循环嵌套关系。例如:鸡兔问题。
问题:鸡和兔共30只,有90条腿,问鸡多少只?兔多少只?
#include "stdio.h"
int main()
{
int ji,tu;
for(ji=0;ji<30;ji++)
for(tu=0;tu<23;tu++)
{
if(ji+tu==30 && ji*2+tu*4==90)
printf("ji=%d,tu=%d\n",ji,tu);
}
return 0;
}
注1:外循环就是循环鸡的只数,内循环就是循环兔的只数(4*23=88,所以兔最多22只)。
注2:循环体就是输出符合条件的鸡只数和兔只数的组合。