C语言程序设计-[11] 循环结构嵌套

 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:循环体就是输出符合条件的鸡只数和兔只数的组合。

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值