一、 嵌套循环的概念
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
样例输出:
ABCDEFGHIJKLMNOPQRSTUVWXYZAB
答案:和上一题的区别是本题的每一行输出首字母不需要重新计算,而是继承上一行末尾字母的下一个字母,同样的,如果下一个字母 > 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;
}