在前面的三种循环结构中,如果一个循环体中还包含另一个完整的循环结构,就构成了循环的嵌套。嵌套着的每一个循环体都是一层循环,处于最外面的循环体被称为外层循环,处于最里面的循环体被称为内层循环。有两层嵌套的循环被称为双重循环,有三层嵌套的被称为三重循环,以此类推。三种循环结构中的任何一种都可以与其他两种或者自身形成循环嵌套。
下面以双重循环为例,来说明循环嵌套的格式。
1.常用格式1
程序分析:
这是一个由for循环组成的双重循环,外层循环变量为i,循环体有两条语句;内层循环变量为j,循环体有1条语句。
注意:不管内循环的循环体有几条语句,对于外循环来讲都是一个整体,按一条语句对待。
外层循环变量i由1到5,每执行一次就是执行一次循环体,第2条语句是一个换行功能,从而可以判断,外层循环的作用是输出5行内层循环的内容,换句话说,就是外层循环控制的是共有几行的问题。
内层循环变量j由1到3,每执行一次都会输出3个“∗”,即j=1输出第一个“∗”,j=2输出第二个“∗”,j=3输出第三个“∗”,也就是内层循环控制的是每行有几列的问题。
综上分析,上述程序段是输出一个5行3列由“∗”组成的长方形图形。这里需要注意的是,每当外层循环执行一次时,内层循环都要完成一次自身的循环周期。即当i=1时,内层循环要执行3次,从j=1到j=3,在条件j<=3不成立时,退出内层循环,完成一个内循环的循环周期,执行与内循环并列的下一条语句即输出换行语句,此时外循环的第一次循环结束,然后才进入i=2的循环周期,如表5-7所列。
表5-7 内外循环的输出情况
2.常用格式2
程序分析:
外层循环结构由while语句组成,内层循环结构由for语句组成,每种循环执行时都遵循与单循环一样的执行顺序和原则,只不过内循环作为外循环的循环体中的一条语句而已。
根据格式1的分析,已知外层循环控制行的输出情况,循环条件为i<=5,初值为1,所以是5行;内层循环控制列的情况,for结构的循环变量由1到3,即每行输出3列,循环体为cout<<j,即j=1,输出1;j=2,输出2;j=3,输出3;j不仅是循环变量,还是每一列上输出的数值,所以完成一个内循环周期的执行,就输出一个123。
由上分析可知,此程序段输出5行123。
3.常用格式3
程序分析:
外层循环结构由while语句组成,内层循环结构由do-while语句组成,整个的内循环结构是外循环的循环体中的第2条语句,内循环体本身有2条语句。
内循环体的功能没有变化,仍是输出j值,但是内循环的循环条件不再是j小于等于某个具体的数值,而是随着i的变化而变化,这说明外循环每执行一次时,内循环完成一个循环周期要执行的循环次数都将不一样。当i=1时,内循环完成一个生命周期只需要执行一次,输出j=1的结果,然后退出do-while循环;当i=2时,内循环完成一个生命周期需要输出1和2两个值才退出内循环,即执行两次内循环体;当i=3时,内循环完成一个生命周期需要执行3次内循环体,输出1、2、3三个值才退出内循环;当i=4时,内循环完成一个生命周期需要执行4次内循环体输出1、2、3、4四个值才退出内循环;当i=5时,内循环完成一个生命周期需要输出1、2、3、4、5五个值才退出内循环,继续向下执行。
不难得出此程序段的输出结果为:第1行输出1;第2行输出1 2;第3行输出1 2 3;第4行输出1 2 3 4;第5行输出1 2 3 4 5。
在使用循环结构的时候,可以根据具体要求,结合每个循环的特点,选择使程序更简洁的方法,比如上面的程序段功能相似,用for循环结构就会少很多行。在输出图形的时候,只要清楚外层循环控制行的情况,内层循环控制列的情况,再加之对控制变量及循环条件的灵活运用就能达到不同的效果。
例5-11 打印乘法口诀。
思路分析:
(1)可以把乘法口诀表理解为有行有列的图形,用双重循环的外层循环i控制行数,从1到9,用内层循环j控制列的情况也是从1到9,这样可以得到一个由乘法口诀表中的积组成的9行9列的方形,如图5-5所示。内循环输出代码中的“\t”表示两个数字之间的间隔,外循环有两条语句,一个是内循环语句,计算口诀中的乘积,也就是图形中每一列上放的数值;另一条语句是换行。
图5-5 乘法口诀表之由积组成的方形
程序段代码如下:
(2)但在乘法口诀中,图形是一个三角形,相当于刚才的图形只需要左下部分,即右上部分不需要输出,也就是图形中的行数没变,但是每行输出的列数发生变化,所以要修改控制列的输出值即j,如图5-6所示。
图5-6 乘法口诀表之由积组成的三角形
将上述程序代码段修改为:
(3)既然是乘法口诀表,图形中放数字的位置除了有乘积外还应有表示口诀的式子,继续对上述代码段进行修改,得到结果如图5-7所示。
图5-7 乘法口诀表之输出变形
(4)此时的输出效果与常规形式还是有区别的,常见的口诀表中算式一般是小数在前大数在后,如图5-8所示。
图5-8 乘法口诀表
程序清单:
例5-12 解方程组。《孙子算经》中有一题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?翻译为:笼子里有若干只鸡和兔,从上面数有35个头,从下面数有94只脚,鸡和兔各有多少只?
思路分析:
(1)这是典型的鸡兔同笼问题,设笼中有鸡x只,有兔子y只,则可以列方程组为:x+y=35,2x+4y=94,这就转化为求解方程组问题。(www.xing528.com)
(2)可以一一列举x、y的所有可能解,并对其进行判断,看是否能同时满足方程组中各个方程式,若同时满足则为所求的解,x和y的取值范围分别即为变量x和y的循环条件。
程序清单:
输入结果为:23 12
一、选择题1.设有如下程序段:
1.解析:while后的条件中k=1,此处的=号是赋值号,相当于while(1),所以循环条件永远为真,循环体会被一直执行下去。
则下面描述正确的是( )。
A.while循环执行2次 B.无限循环
C.循环体语句一次也不执行 D.循环体语句执行一次
2.下面程序段的运行结果是( )。
2.解析:“while(n++<=2);”后面有分号,说明循环体是空语句。n++是后置++,相当于n<=2,n++两句。
A.2 B.3 C.4 D.语法错误
3.while(!x)中的(!x)与下面哪个条件等价?( )。
A.x==1 B.x!=1 C.x!=0 D.x==0
4.下列循环语句的循环次数是( )。
A.0 B.1 C.2 D.3
5.已知:int i=5,下列循环语句的循环次数为( )。
5.解析:每次循环,i值减少2,因为执行了两个i--,初值为5,所以永远不会为偶数,更不会为0,循环条件永远成立,跳不出来,会一直执行下去。
A.0 B.1 C.5 D.无限
6.for(int x=0,y=0;!x&&y<=5;y++)语句执行循环的次数是( )。
A.0 B.5 C.6 D.无限
7.分析下面的c++代码:
为使程序不陷入死循环,从键盘输入的数据应该是( )。
A.任意正奇数 B.任意负偶数
C.任意正偶数 D.任意负奇数
7.解析:a不等于b时循环,要想不执行循环,就让a恒等于b,b初值为1,循环时每次减去2,所以b为负奇数,a、b相等,即等于负奇数即可。
8.下面程序的输出结果是( )。
8.解析:输出用了三目运算来决定是输出0还是#。
A.0#0 B.0000
C.0#00 D.0#000
二、阅读程序写结果
三、写程序
1.最高的分数:请你写程序帮老师找出“信息技术”这门课程期中考试的最高分数。
输入:输入两行,第一行为整数n(1<=n<100),表示参加这次考试的人数。第二行是这n个学生的成绩,相邻两个数之间用单个空格隔开。所有成绩均为0到100之间的整数。
输出:输出一个整数,即最高分的成绩。
2.计算星期几:假设今天是星期日,那么过ab天之后是星期几?其中,Monday是星期一,Tuesday是星期二,Wednesday是星期三,Thursday是星期四,Friday是星期五,Saturday是星期六,Sunday是星期日。(小学奥数)
输入:两个正整数a、b,中间用单个空格隔开。0<a<=100,0<b<=10000。
输出:一个字符串,代表过ab天之后是星期几。
3.水仙花数是指一个三位数,其各位数的立方和等于该数,即如果三位数ABC是水仙花数,则ABC=A3+B3+C3,比如153,13+53+33=1+125+27=153,所以153就是一个水仙花数。求100~999中的水仙花数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。