GESP2024年3月认证C++二级( 第三部分编程题(2)小杨的日字矩阵 )



一、🎬 小杨要画“日”字
有一天,小杨想用电脑画一个大大的“日”字。
比如当 n = 5 时,他想画成这样:
|---| |xxx| |---| |xxx| |---|是不是很像“日”字? 😄
二、🌟 题目规则
给你一个奇数 n(比如 5、7、9…)
你要打印一个 n × n 的正方形。
规则:
① 最左列 和 最右列 全部是 |
② 第一行、最后一行、中间一行 全部是 -(但两边还是 |)
③ 其他位置全部是 x
三、🧠 先理解结构
假设 n = 7
行号从 0 到 6:
0 ← 第一行(横线) 1 2 3 ← 中间行(横线) 4 5 6 ← 最后一行(横线)四、🎯 判断逻辑三步走
在每个位置 (i, j):
1、第一步:是不是最左或最右列?
if (j == 0 || j == n-1) 输出 '|'优先判断!因为边框最重要。
2、第二步:是不是特殊横线行?
else if (i == 0 || i == n-1 || i == n/2) 输出 '-'注意:
n/2 就是中间行比如 n=5:
5/2 = 23、第三步:其他情况
else 输出 'x'五、🎨 为什么要按这个顺序判断?
因为边框优先!
比如第一行:
如果你先判断横线,
两边就会变成 '-',而不是 '|'
所以顺序不能乱!
六、🧩 参考程序
#include <iostream> using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { char ch; if (j == 0 || j == n - 1) { //第一步:是不是最左或最右列? ch = '|'; } else if (i == 0 || i == n - 1 || i == n / 2) { //第二步:是不是特殊横线行? ch = '-'; } else { //第三步:其他情况 ch = 'x'; } cout << ch; } cout << endl; } return 0; }七、🌈 理解技巧
把矩阵想成:
🎂 三层蛋糕结构
第一层(顶层)——横线
中间层 —— 横线
底层 —— 横线
两边是柱子 |
八、🎯 本题考察知识点
| 知识 | 重要程度 |
|---|---|
| 双重 for 循环 | ⭐⭐⭐⭐⭐ |
| 行列坐标判断 | ⭐⭐⭐⭐⭐ |
| 条件判断顺序 | ⭐⭐⭐⭐ |
| 图形打印规范 | ⭐⭐⭐⭐ |
九、课后训练:
(一)、🌟 训练题 1(⭐)—— 空心正方形
1、📝 题目
输入一个整数 n,打印一个 n × n 的空心正方形。
例如 n=5:
***** * * * * * * *****2、🧠 思路
判断边界:
i == 0 i == n-1 j == 0 j == n-1是边界 → *
否则 → 空格
3、💻 参考程序
#include <iostream> using namespace std; int main() { int n; cin >> n; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(i == 0 || i == n-1 || j == 0 || j == n-1) cout << "*"; else cout << " "; } cout << endl; } return 0; }4、📌 易错点
❌ 忘记输出空格
❌ 少写换行
(二)、🌟 训练题 2(⭐⭐)—— 对角线矩阵
1、📝 题目
输入 n(n为奇数),打印:
- 主对角线是
\ - 副对角线是
/ 中心是 X- 其他是
.
n=5:
\.../ .\./. ..X.. ./.\. /...\ (中间可以用 X 或任选)
2、🧠 思路
中心:
i == n/2 && j == n/2主对角线:
i == j副对角线:
i + j == n - 13、💻 参考程序
#include <iostream> using namespace std; int main() { int n; cin >> n; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(i==n/2&&j==n/2) cout<<"X"; else if(i == j) cout << "\\"; else if(i + j == n - 1) cout << "/"; else cout << "."; } cout << endl; } return 0; }4、📌 易错点
⚠ \ 要写成 "\\ "
(三)、🌟 训练题 3(⭐⭐⭐)—— 十字矩阵
1、📝 题目
输入奇数 n,打印十字形:
n=5:
..*.. ..*.. ***** ..*.. ..*..2、🧠 思路
中间行:
i == n/2中间列:
j == n/23、💻 参考程序
#include <iostream> using namespace std; int main() { int n; cin >> n; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(i == n/2 || j == n/2) cout << "*"; else cout << "."; } cout << endl; } return 0; }4、📌 关键理解
这题和“日字矩阵”本质一样
只是判断条件不同。
(四)、🌟 训练题 4(⭐⭐⭐)—— 数字边框
1、📝 题目
输入 n,打印边框为数字 n,其余为 0。
n=4:
4444 4004 4004 44442、🧠 思路
边界输出 n
其他输出 0
3、💻 参考程序
#include <iostream> using namespace std; int main() { int n; cin >> n; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(i == 0 || i == n-1 || j == 0 || j == n-1) cout << n; else cout << 0; } cout << endl; } return 0; }4、📌 易错点
注意输出的是数字 n,不是字符。
(五)、🌟 训练题 5(⭐⭐⭐⭐)—— 菱形图案
1、📝 题目
输入奇数 n,打印菱形:
n=5:
* *** ***** *** *2、🧠 思路
分两部分:
上半部分 + 下半部分
利用:
abs(i - n/2)控制空格数。
3、💻 参考程序
#include <iostream> #include <cmath> using namespace std; int main() { int n; cin >> n; for(int i = 0; i < n; i++) { int space = abs(i - n/2); int star = n - 2 * space; for(int s = 0; s < space; s++) cout << " "; for(int k = 0; k < star; k++) cout << "*"; cout << endl; } return 0; }4、📌 核心理解
行号决定空格数量
空格决定星号数量
十、总结:
🧠 图形打印万能三步法
第一步:找边界 第二步:找特殊行列 第三步:剩下填默认