



一、🎬 小杨要画"日"字
有一天,小杨想用电脑画一个大大的"日"字。
比如当 n = 5 时,他想画成这样:
cpp
|---|
|xxx|
|---|
|xxx|
|---|
是不是很像"日"字? 😄
二、🌟 题目规则
给你一个奇数 n(比如 5、7、9...)
你要打印一个 n × n 的正方形。
规则:
① 最左列 和 最右列 全部是 |
② 第一行、最后一行、中间一行 全部是 -(但两边还是 |)
③ 其他位置全部是 x
三、🧠 先理解结构
假设 n = 7
行号从 0 到 6:
cpp
0 ← 第一行(横线)
1
2
3 ← 中间行(横线)
4
5
6 ← 最后一行(横线)
四、🎯 判断逻辑三步走
在每个位置 (i, j):
1、第一步:是不是最左或最右列?
cpp
if (j == 0 || j == n-1)
输出 '|'
优先判断!因为边框最重要。
2、第二步:是不是特殊横线行?
cpp
else if (i == 0 || i == n-1 || i == n/2)
输出 '-'
注意:
cpp
n/2 就是中间行
比如 n=5:
cpp
5/2 = 2
3、第三步:其他情况
cpp
else
输出 'x'
五、🎨 为什么要按这个顺序判断?
因为边框优先!
比如第一行:
如果你先判断横线,
两边就会变成 '-',而不是 '|'
所以顺序不能乱!
六、🧩 参考程序
cpp
#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:
cpp
*****
* *
* *
* *
*****
2、🧠 思路
判断边界:
cpp
i == 0
i == n-1
j == 0
j == n-1
是边界 → *
否则 → 空格
3、💻 参考程序
cpp
#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:
cpp
\.../
.\./.
..X..
./.\.
/...\
(中间可以用 X 或任选)
2、🧠 思路
中心:
cpp
i == n/2 && j == n/2
主对角线:
cpp
i == j
副对角线:
cpp
i + j == n - 1
3、💻 参考程序
cpp
#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:
cpp
..*..
..*..
*****
..*..
..*..
2、🧠 思路
中间行:
cpp
i == n/2
中间列:
cpp
j == n/2
3、💻 参考程序
cpp
#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:
cpp
4444
4004
4004
4444
2、🧠 思路
边界输出 n
其他输出 0
3、💻 参考程序
cpp
#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:
cpp
*
***
*****
***
*
2、🧠 思路
分两部分:
上半部分 + 下半部分
利用:
cpp
abs(i - n/2)
控制空格数。
3、💻 参考程序
cpp
#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、📌 核心理解
行号决定空格数量
空格决定星号数量
十、总结:
🧠 图形打印万能三步法
cpp
第一步:找边界
第二步:找特殊行列
第三步:剩下填默认