嵌套循环参考资料
一、 嵌套循环的概念
1. 嵌套循环的功能
● 在一个循环里写另一个循环
● 多个嵌套的循环应保证循环变量各不相同
2. 嵌套循环的常见应用场景
● n行m列的数据处理,类似矩阵
● n行,第i行i列的数据处理,类似直角三角形
● 列举出所有的情况,例如鸡兔同笼可以列举出所有鸡兔的可能
3. 强调输出原理,从上到下是行输出,每行从左往右是列输出
4. 强调输出程序的处理格式为:
for(i行循环){ for(j列循环){ cout << 输出第i行第j列的数据 } cout << 换行,代表结束第i行的输出 }
二、 嵌套循环的应用演示
1. 演示1:1到n的每一个数(复习for)
样例输入:
5
样例输出:
1 2 3 4 5
2. 演示2:输出n行的*****
样例输入:
3
样例输出:
***** ***** *****
3. 演示3:输出n行*号,每行m个
样例输入:
3 4
样例输出:
**** **** ****
答案:
int n,m; cin >> n >> m; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ cout << "*"; } cout << endl; }
4. 演示4:输出n行*号,第i行i个
样例输入:
5
样例输出:
*
**
***
****
*****
5. 演示5:n * n乘法表(留作提高)
样例输入:
9
样例输出:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
答案:
int n; cin >> n; for(int i = 1; i <= n; i++) { for(int j = 1; j <= i; j++){ printf("%d*%d=%d\t",j,i,i * j); } printf("\n"); }
课堂例题
1. 例题1:
问题描述:完成以下n行n列的规律矩阵输出
样例输入:
3
样例输出:
123
234
345
样例输入:
6
样例输出:
123456
234567
345678
456789
567890
678901
答案:
int n; cin >> n; for(int i = 1; i <= n; i++) { int x = i; //第i行的第1个数字是从i开始 for(int j = 1; j <= n; j++){ cout << x; x++; if(x > 9) x = 0; //超过9重置为0 } cout << endl; }
2. 例题2:(15分钟,同上)
问题描述:如果告诉你char c = 'A'; c++;后c = 'B',你能根据n行n列输出以下图形吗?
样例输入:
3
样例输出:
ABC
BCD
CDE
样例输入:
5
样例输出:
ABCDE
BCDEF
CDEFG
DEFGH
EFGHI
答案:通过
i = 1,A = 65;
i = 2,B = 66;
i = 3,C = 67...
发现每一行要输出的首字母应该为
char x = i - 1 + 65;
int n; cin >> n; for(int i = 1; i <= n; i++) { char x = i - 1 + 65; //获取第i行要输出的首个字母 for(int j = 1; j <= n; j++){ cout << x; x++; if(x > 'Z') x = 'A'; //超过Z重置为A } cout << endl; }
3. 例题3:(10分钟,同上)
问题描述:如果例题2的n最大是<=40,那么当你输入30时就会发现最后几行的输出不对,思考如何解决(10分钟)

解决方法:
int n; cin >> n; for(int i = 1; i <= n; i++) { char x = i - 1 + 65; //获取第i行要输出的首个字母 if(x > 'Z') x -= 26; //检测获取的x是否超出最大Z,如果超出那么-=26,也可以使用while替换if for(int j = 1; j <= n; j++){ cout << x; x++; if(x > 'Z') x = 'A'; //超过Z重置为A } cout << endl; }
4. 例题4:(15分钟,同上)
问题描述:输入一个正整数 n,请使用大写字母拼成一个这样的三角形图案
样例输入:
3
样例输出:
A
BC
DEF
样例输入:
7
样例输出:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
VWXYZAB
答案:和上一题的区别是本题的每一行输出首字母不需要重新计算,而是继承上一行末尾字母的下一个字母,同样的,如果下一个字母 > Z,则变换A
int n; cin >> n; char x = 'A'; for(int i = 1; i <= n; i++) { for(int j = 1; j <= i; j++){ cout << x; x++; if(x > 'Z') x = 'A'; //超过Z重置为A } cout << endl; }
5. 例题5:输出N字、H字、X字等等类型的矩形,这类题目可以理解为是N行N列的矩形输出,但是对于双重循环里的i行j列要判断当前i行、j列来决定输出什么
例如,要求输出5 * 5的N字矩阵
样例输入:
5
样例输出:
*...* **..* *.*.* *..** *...*
像这种矩阵输出,都遵循以下代码格式:
int n; cin >> n; for(int i = 1;i <= n; i++){ for(int j = 1; j <= n; j++){ if(判断i、j等于多少的时候要输出*号) cout << "*"; else cout << "."; } cout << endl; }
像N字打印的话,观察可以发现列数j = 1或者j = n时,要输出*号,斜对角的判断则是i == j时要输出*号,所以N字打印代码为:
int n; cin >> n; for(int i = 1;i <= n; i++){ for(int j = 1; j <= n; j++){ if(j == 1 || j == n || i == j) cout << "*"; else cout << "."; } cout << endl; }

浙公网安备 33010602011771号