嵌套循环参考资料

 

一、  嵌套循环的概念

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;
    } 

 

posted @ 2025-04-19 12:53  CRt0729  阅读(52)  评论(0)    收藏  举报