假设现在要求编程实现输出10行'*',每行20个'*',可以使用前面的for循环来实现,通过计算总共输出200个'*',定义循环变量i,初始值为1,终值为200,循环体内首先输出一个'*',并对循环变量i进行判断,当i对20取余为0时,输出一个换行,循环更新变量进行自增运算,具体代码如下所示:
for(int i=1;i<=200;i++){cout<<'*';if(i%20==0){cout<<endl;}
}
那么在代码实现时能不能将10行当成一部分,每行对应的20个'*'看成列,用一个for来表示行,另一个for来表示列呢?这就需要用到for循环语句的嵌套。接下来介绍该内容。
for循环语句嵌套:
当一个循环语句的循环体又包含循环语句时,这种结构称为多重循环,也称为循环的嵌套。外层的循环叫做外循环,内层的循环叫做内循环。各层循环的循环控制变量不能相同。嵌套循环中的变量(如i和j)只在各自的循环中有效,互不干扰。for循环嵌套的基本语法为:
for(循环变量1初始表达式;循环变量1终值条件;循环变量1更新表达式){//循环体11for(循环变量2初始表达式;循环变量2终值条件;循环变量2更新表达式){//循环体2}//循环体12
}
向这种for语句的循环体中有引入循环结构的方式称为循环嵌套,处于外层的循环叫作外循环,处于内层的循环称为内循环,外循环执行一次,内层循环执行一遍,具体执行过程:
1)首先外层循环初始化:执行外层循环的循环变量1初始表达式,为循环变量1赋初始值;
2)其次外层循环条件判断:判断外层循环的循环变量1终值条件,如果条件为真(即循环变量1满足继续循环的条件),则进入外层循环体;如果条件为假,则外层循环结束,整个嵌套循环执行完毕;
3)进入外层循环体:
①执行循环体11的代码,
②紧接着执行内层循环初始化:在外层循环体内,首先执行内层循环的循环变量2初始表达式,为循环变量2赋初始值;
③内层循环条件判断:接着判断内层循环的循环变量2终值条件,如果条件为真(即循环变量2满足继续循环的条件),则进入内层循环体;如果条件为假,则内层循环结束,回到外层循环的下一步;
④进入内层循环体:执行循环体2的代码;
⑤内层循环变量更新:执行内层循环的循环变量2更新表达式,更新循环变量2的值;
⑥重复内层循环条件判断:重新判断内层循环的终止条件。如果条件为真,则继续执行循环体2;如果条件为假,则内层循环结束;
⑦执行外层循环剩余部分:内层循环结束后,执行循环体12的代码。
4)外层循环变量更新:执行外层循环的循环变量1更新表达式,更新循环变量1的值;重复外层循环条件判断:重新判断外层循环的终值条件,如果条件为真,则继续执行外层循环体;如果条件为假,则外层循环结束,整个嵌套循环执行完毕。
总结来说,嵌套循环的执行过程就是外层循环和内层循环交替进行的过程,直到两个循环的终值条件都不再满足为止。
例如将打印10行20列'*'代码使用for嵌套语句来实现:
#include<bits/stdc++.h>
using namespace std;
int main(){for(int i=1;i<=10;i++){for(int j=1;j<=20;j++){cout<<'*';}cout<<endl;} return 0;
}
对于该程序,外循环变量i循环1次,内层循环中的控制变量j要从1循环到20次,外循环变量总共循环10次,所以总的循环次数为10*20=200。即外层循环控制变量i用来表示行变量,意味着总共打印10行,每行末端都有一个换行;在换行之前,需要打印20列'*',内循环变量j来控制列;将内层循环和输出换行语句共同构成了外层循环的循环体。可见,循环嵌套就是一个循环出现在另一个循环里,对于外循环的每次迭代,内循环都要完成它的所有迭代。根据循环嵌套的层数不同,可以有双重循环、三重循环……,如果循环体不仅仅有一条语句时,要用{}括起来,组成复合语句。
实战训练1—字符图形
问题描述:
输入一个整数 n(1≤n≤30),绘制一个由n 行n列的由*号构成的三角形图案,字符图形参照输入输出样例。
输入格式:
一行一个整数n。
输出格式:
由n行构成,每行有n列'*',即由n行n列构成的字符三角形。
输入输出样例:
输入样例1 | 输出样例1 |
3 | * ** *** |
输入样例2 | 输出样例2 |
5 | * ** *** **** ***** |
问题分析:
根据题意,字符图形由行和列构成,所以可以采用for循环语句嵌套,行可以由外层循环来表示,列由内层循环来表示,对于外层循环,字符图形总共由n行构成,所以外层循环变量起始值为1,终值为n,循环更新变量为自增运算,对于内层循环,每行的'*'的个数就是所在的行数,第一行有1个'*',第二行有2个'*'……最后一行有n个'*',所以列数受到行数的限制,即内层循环起始值为1,终值为外层循环变量,更新也为自增运算,内层循环体输出'*',内层循环和每行结束输出换行符共同构成了外层循环的循环体,具体程序代码如下所示:
#include<bits/stdc++.h>
using namespace std;
int main(){int n;//定义字符行数变量n cin>>n;//输入n的值 for(int i=1;i<=n;i++){//外层循环,用i来表示行,从1到n for(int j=1;j<=i;j++){//内层循环,用j来表示列,从1到i cout<<'*';}cout<<endl;//输出换行符 }return 0;
}