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


一、🎬 小杨要画"日"字

有一天,小杨想用电脑画一个大大的"日"字。

比如当 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 复制代码
第一步:找边界
第二步:找特殊行列
第三步:剩下填默认

相关推荐
样例过了就是过了2 小时前
LeetCode热题100 螺旋矩阵
算法·leetcode·矩阵
yyjtx2 小时前
DHU上机打卡D27
c++·算法·图论
白太岁2 小时前
C++:(5) 单例模式与支持初始化失败的单例模式
c++·单例模式
hwtwhy2 小时前
【情人节特辑】C 语言实现浪漫心形粒子动画(EasyX 图形库)
c语言·开发语言·c++·学习·算法
日月云棠2 小时前
UE5 打包后 EXE 程序单实例的两种实现方法
前端·c++
XiaoHu02073 小时前
MySQL基础(第一弹)
数据库·c++·mysql
Mr YiRan3 小时前
C++浅拷贝与深拷贝的原理
c++
plus4s3 小时前
2月21日(91-93题)
c++·算法
闻缺陷则喜何志丹4 小时前
【数论 等差数列】P9183 [USACO23OPEN] FEB B|普及+
c++·数学·数论·等差数列