一、小杨要画'日'字
有一天,小杨想用电脑画一个大大的'日'字。
比如当 n = 5 时,他想画成这样:
|
本文讲解 C++ 二级编程题中“日字矩阵”的打印算法。给定奇数 n,构建 n×n 矩阵,最左最右列为竖线,第一、中间、最后一行为横线,其余填充字符。通过双重循环与条件判断实现,并提供了空心正方形、对角线矩阵等扩展训练题及参考代码。

有一天,小杨想用电脑画一个大大的'日'字。
比如当 n = 5 时,他想画成这样:
|
是不是很像'日'字?
给你一个奇数 n(比如 5、7、9…)
你要打印一个 n × n 的正方形。
规则:
|-(但两边还是 |)x假设 n = 7
行号从 0 到 6:
在每个位置 (i, j):
if (j == 0 || j == n - 1) {
cout << '|';
}
优先判断!因为边框最重要。
else if (i == 0 || i == n - 1 || i == n / 2) {
cout << '-';
}
注意:
n/2 就是中间行
比如 n=5:
5/2 = 2
else {
cout << '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 循环 | ⭐⭐⭐⭐⭐ |
| 行列坐标判断 | ⭐⭐⭐⭐⭐ |
| 条件判断顺序 | ⭐⭐⭐⭐ |
| 图形打印规范 | ⭐⭐⭐⭐ |
输入一个整数 n,打印一个 n × n 的空心正方形。
例如 n=5:
*****
* *
* *
* *
*****
判断边界:
i == 0
i == n-1
j == 0
j == n-1
是边界 → *
否则 → 空格
#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;
}
输入 n(n 为奇数),打印:
/.n=5:
\.../
.\./.
..X..
./\.\
/...\
(中间可以用 X 或任选)
中心:
i == n/2 && j == n/2
主对角线:
i == j
副对角线:
i + j == n - 1
#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;
}
要写成"\"`输入奇数 n,打印十字形:
n=5:
..*..
..*..
*****
..*..
..*..
中间行:
i == n/2
中间列:
j == n/2
#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;
}
这题和'日字矩阵'本质一样,只是判断条件不同。
输入 n,打印边框为数字 n,其余为 0。
n=4:
4444
4004
4004
4444
边界输出 n 其他输出 0
#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;
}
注意输出的是数字 n,不是字符。
输入奇数 n,打印菱形:
n=5:
***
*****
***
分两部分:上半部分 + 下半部分
利用:
abs(i - n/2)
控制空格数。
#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;
}
行号决定空格数量,空格决定星号数量。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online