返回 课程

信奥AC之路-2级

0% 完成
0/0 步骤
  1. 第一课:字符
    5 主题|小节
  2. 第二课 嵌套循环与矩形图案(一)
    4 主题|小节
  3. 第三课 嵌套循环与矩形图案(二)
    3 主题|小节
  4. 第四课:矩形三
    5 主题|小节
  5. 第五课:字符矩形
    7 主题|小节
  6. 第六课:直角三角形
    6 主题|小节
  7. 第七课:倒三角形
    7 主题|小节
  8. 第八课:字符三角形
    8 主题|小节
  9. 第九课:字符倒三角形
    7 主题|小节
  10. 第十课:平行四边形
    6 主题|小节
  11. 第十一课:字符直角三角形
    5 主题|小节
  12. 第十二课:左斜三角形
    6 主题|小节
  13. 第十三课:等腰三角形
    6 主题|小节
  14. 第十四课:倒置等腰三角形
    7 主题|小节
  15. 第十五课:上下对称图形
    4 主题|小节
  16. 第十六课:复杂对称图形
    5 主题|小节
  17. 第十七课:左右对称图形
    5 主题|小节
  18. 第十八课:空心图形
    5 主题|小节
  19. 第十九课:空心图形
    3 主题|小节
  20. 第二十课:嵌套应用
    4 主题|小节
  21. 第二十一课:嵌套应用二
    4 主题|小节
  22. 第二十二课:嵌套应用三
    3 主题|小节
  23. 第二十三课:嵌套应用四
    3 主题|小节
课 19, 主题|小节 2
进行中

19.2 空心图形实验

2026年1月15日
课 进展
0% 完成

“小朋友们,让我们通过一系列有趣的实验来掌握空心图形的创建!”我兴奋地说,”我们将创建各种不同的空心图形!”

19.2.1 打印Z图形

题目描述:输入一个正整数n,输出一个n×n的Z形图案。

样例输入

5

样例输出

aaaaa
bbbab
bbabb
babbb
aaaaa

在这个Z形图案中,第一行、最后一行全部是字符’a’,其他行只在对角线位置(从右上到左下)打印字符’a’,其余位置打印字符’b’。

代码实现

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;  // 读入图形的大小n
    
    // 外循环:控制行数,从第1行到第n行
    for(int i=1; i<=n; i++) {
        // 内循环:控制每行的列数,从第1列到第n列
        for(int j=1; j<=n; j++) {
            // 判断条件:如果是第一行(i==1)或最后一行(i==n)或对角线位置(j==n+1-i)
            // 对角线位置的计算公式n+1-i表示从右上到左下的斜线
            if(i==1 || i==n || j==n+1-i) {
                cout << 'a';  // 满足条件,输出字符'a'
            } else {
                cout << 'b';  // 不满足条件,输出字符'b'
            }
        }
        cout << endl;  // 每行结束后换行
    }
    return 0;
}

思考

  • 第一行和最后一行是完整的一行’a’字符:使用条件i==1 || i==n
  • 对角线位置的计算是j==n+1-i,代表从右上角到左下角的斜线
  • 注意对角线的计算公式,它表示行号与列号之和等于n+1的位置

19.2.2 打印X图形

题目描述:输入一个正整数n,输出一个n×n的X形图案。

样例输入

5

样例输出

abbba
babab
bbabb
babab
abbba

在这个X形图案中,只在两条对角线位置打印字符’a’,其余位置打印字符’b’。

代码实现

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;  // 读入图形的大小n
    
    // 外循环:控制行数,从第1行到第n行
    for(int i=1; i<=n; i++) {
        // 内循环:控制每行的列数,从第1列到第n列
        for(int j=1; j<=n; j++) {
            // 判断条件:如果位置在主对角线(j==i)或副对角线(j==n+1-i)上
            // 主对角线:从左上到右下,行列索引相等
            // 副对角线:从右上到左下,行列索引之和等于n+1
            if(j==i || j==n+1-i) {
                cout << 'a';  // 满足条件,输出字符'a'
            } else {
                cout << 'b';  // 不满足条件,输出字符'b'
            }
        }
        cout << endl;  // 每行结束后换行
    }
    return 0;
}

思考

  • 主对角线:j==i,代表从左上角到右下角的斜线
  • 副对角线:j==n+1-i,代表从右上角到左下角的斜线
  • X图形是由两条对角线组成的

19.2.3 H图形

题目描述:输入一个正整数n,输出一个n×n的H形图案。

样例输入

5

样例输出

|   |
|   |
|---|
|   |
|   |

在这个H形图案中,左右两边是竖线’|’,中间行是横线’-‘,其余位置是空格’ ‘。

代码实现

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;  // 读入图形的大小n
    
    // 外循环:控制行数,从第1行到第n行
    for(int i=1; i<=n; i++) {
        // 内循环:控制每行的列数,从第1列到第n列
        for(int j=1; j<=n; j++) {
            // 判断条件1:如果位置在左边界(j==1)或右边界(j==n)上
            if(j==1 || j==n) {
                cout << '|';  // 在左右边界位置输出竖线'|'
            } 
            // 判断条件2:如果位置在中间行(i==(n+1)/2)上
            // (n+1)/2 计算中间行的索引,确保在奇数行数时正确计算中间位置
            else if(i==(n+1)/2) {
                cout << '-';  // 在中间行位置输出横线'-'
            } 
            // 其他位置
            else {
                cout << ' ';  // 不满足以上条件,输出空格' '
            }
        }
        cout << endl;  // 每行结束后换行
    }
    return 0;
}

思考

  • 左右边界:j==1 || j==n,打印竖线’|’
  • 中间行:i==(n+1)/2,打印横线’-‘
  • 使用(n+1)/2计算中间行的索引,确保在奇数行数时正确计算中间位置

19.2.4 日字形

题目描述:输入一个正整数n,输出一个n×n的日字形图案。

样例输入

5

样例输出

|---|
|   |
|---|
|   |
|---|

在这个日字形图案中,左右两边是竖线’|’,第一行、中间行和最后一行是横线’-‘,其余位置是空格’ ‘。

代码实现

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;  // 读入图形的大小n
    
    // 外循环:控制行数,从第1行到第n行
    for(int i=1; i<=n; i++) {
        // 内循环:控制每行的列数,从第1列到第n列
        for(int j=1; j<=n; j++) {
            // 判断条件1:如果位置在左边界(j==1)或右边界(j==n)上
            if(j==1 || j==n) {
                cout << '|';  // 在左右边界位置输出竖线'|'
            } 
            // 判断条件2:如果位置在第一行(i==1)、最后一行(i==n)或中间行(i==(n+1)/2)上
            else if(i==1 || i==n || i==(n+1)/2) {
                cout << '-';  // 在三条横线位置输出'-'
            } 
            // 其他位置
            else {
                cout << ' ';  // 不满足以上条件,输出空格' '
            }
        }
        cout << endl;  // 每行结束后换行
    }
    return 0;
}

思考

  • 日字形是在H形的基础上增加了第一行和最后一行的横线
  • 条件判断使用i==1 || i==n || i==(n+1)/2来确定所有需要打印横线的位置

19.2.5 N图形

题目描述:输入一个正整数n,输出一个n×n的N形图案。

样例输入

5

样例输出

+---+
++--+
+-+-+
+--++
+---+

在这个N形图案中,左右两边和主对角线位置打印字符’+’,其余位置打印字符’-‘。

代码实现

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;  // 读入图形的大小n
    
    // 外循环:控制行数,从第1行到第n行
    for(int i=1; i<=n; i++) {
        // 内循环:控制每行的列数,从第1列到第n列
        for(int j=1; j<=n; j++) {
            // 判断条件:如果位置在左边界(j==1)、右边界(j==n)或主对角线(i==j)上
            // 主对角线:从左上到右下,行列索引相等
            if(j==1 || j==n || i==j) {
                cout << '+';  // 满足条件,输出字符'+'
            } else {
                cout << '-';  // 不满足条件,输出字符'-'
            }
        }
        cout << endl;  // 每行结束后换行
    }
    return 0;
}

思考

  • N形由左边界、右边界和主对角线组成
  • 使用条件j==1 || j==n || i==j来确定这三部分的位置
  • 注意N形的主对角线是从左上到右下,使用i==j判断