热门网游活动集合_每日福利更新_玩家互动论坛 - hfhzlhj

嵌套循环参考资料

一、 嵌套循环的概念

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;

}