6.4 循环的嵌套
考点4 循环的嵌套
真考链接
在选择题考试中考点4也是必考内容,属于重点理解重点掌握的知识点,考查形式主要是读程序题,要求选择程序运行结果,考核概率为60%。在上机考试中的考查形式主要有修改题和编程题。考核概率为10%。
在某一个循环体内部又包含了另一个完整的循环结构,称为循环的嵌套。前面介绍的3种类型的循环都可以互相嵌套,循环的嵌套可以多层,但要保证每一层循环在逻辑上必须是完整的。
例如,下面都是合法的形式。
(1)while()
{
…
while()
{…}
…
}
(2)for(;;)
{
…
while()
{…}
…
}
(3)do
{
…
for(;;)
{…}
…
}
while();
常见问题
程序是如何执行嵌套循环的?
执行多重循环时,对外层循环变量的每一个值,内层循环的循环变量都要从初值变化到终值。每执行一次外层循环,内层的循环就要完整执行一遍。
真题精选
【例1】以下程序的输出结果是( )。
#include <stdio.h>
main()
{ int k=0,m=0;
int i,j;
for(i=0;i<2;i++)
{ for(j=0;j<3;j++)
k++;
k- =j;
}
m=i+j;
printf("k=% d,m=% d",k,m);
}
A.k=0,m=3 B.k=0,m=5 C.k=1,m=3 D.k=1,m=5
【答案】B
【解析】本例考查一个二重循环结构。只要留意在一个循环终止时循环控制变量的变化即可。很明显,外层循环执行两次。这两次执行循环的情形如下:在i=0时,内层循环执行3次(j=0,1,2),直到j=3时终止。由于每次内层循环使k加1,故循环结束时k=3。再执行k-=j语句,在i=1时,内层循环仍执行原操作,使j=3,k=0。现在,计算表达式i=2,表达式i<2为假,外层循环结束,执行m=i+j=2+3=5。
【例2】以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算出每位学生的平均分并输出,程序如下:
#include <stdio.h>
main()
{ int n,k;
float score,sum,ave;
sum=0.0;
for(n=1;n< =10;n++)
{ for(k=1;k< =4;k++)
{ scanf("% f",&score);
sum+ =score;
}
ave=sum/4.0;
printf("NO% d:% f\n",n,ave);
}
}
上述程序运行后结果不正确,调试中发现有一条语句出现在程序中的位置不正确。 这条语句是( )。
A.sum=0.0; B.sum+=score;
C.ave=sum/4.0; D.printf("NO%d:%f\n",n,ave);
【答案】A
【解析】本题考查的是for循环语句的嵌套结构。
【例3】以下程序的输出结果是( )。
int i,j,m=0;
for(i=1;i< =15;i+ =4)
for(j=3;j< =19;j+ =4)
m++;
printf("% d\n",m);
A.12 B.15 C.20 D.25
【答案】C
【解析】本题所示的程序段包含了一个双重循环。外层的循环控制变量是i,其初值是1,每循环一次,i的值增4。在执行时,i的值依次是1、5、9、13,当i的值达到17时,外层的循环就结束,去执行最后的printf语句,因此外层循环执行4次。外层的循环体内只包含了一条语句,也是一个for循环,此内层的循环控制变量是j,其初值是3,每循环一次,j的值增4,j的值依次为3、7、11、15、19,内循环体执行5次。内循环体也只包含一条语句m++;,即每执行一次内循环体,m的值增1。因为m的初值为0,所以m的值就是内循环总的循环次数。内循环总的执行次数是4 (外循环执行次数)×5(内循环次数)=20,所以 m的值为20。
【例4】请编写函数fun(),其功能是:找出2 ×M整型二维数组中最大元素的值,并将此值返回调用函数。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。
试题程序
#define M 4
#include <stdio.h>
int fun(int a[][M])
{
}
void main()
{ int arr[2][M] ={5,8,3,45,76,-4,12,
82};
printf("max=% d\n",fun(arr));
}
【答案】int fun(int a[ ][M])
{ int i,j,max=a[0][0];
for(i=0;i<2;i++)
for(j=0;j<M;j++)
if(max<a[i][j])
max=a[i][j];
return max;
}
【解析】本题要求数组的最大值,需要运用循环语句,因为数组是二维数值,所以应使用二层加for循环嵌套。使用for循环语句时需要注意循环变量的取值范围。
此类求最大值或最小值的问题,我们可以采用逐个比较的方式,要求对数组中所有元素遍历一遍,并且从中找出数组最大值或最小值。首先定义变量max存放数组中的第一个元素的值,然后利用for循环逐个找出数组中的元素,并与max比较,如果元素值大于max,则将该值赋予max,循环结束后max的值即为数组最大值,最后将该值返回。