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

相关推荐
小明同学0110 小时前
C++后端项目:统一大模型接入 SDK(一)
linux·c++·chatgpt
林夕0710 小时前
Qt 6.x 新特性概览:从 Qt 5 到 Qt 6 的升级之路
c++·qt6·跨平台开发
05候补工程师10 小时前
【408狂飙·数据结构】核心考点深度复盘:数组地址计算、特殊矩阵压缩存储与树的五大性质解题直觉
数据结构·笔记·线性代数·考研·算法·矩阵
basketball61610 小时前
C++ 强制类型转换:从 C 风格到 C++ 四大金刚
java·c语言·c++
无限进步_11 小时前
C++11概览与统一初始化
开发语言·c++
吃着火锅x唱着歌11 小时前
深度探索C++对象模型 学习笔记 第五章 构造、解构、拷贝语意学(1)
c++·笔记·学习
承渊政道11 小时前
【贪心算法】(经典实战应用解析(五):单调递增的数字、坏了的计算器、合并区间、⽆重叠区间、⽤最少数量的箭引爆⽓球)
数据结构·c++·leetcode·贪心算法·排序算法·动态规划·哈希算法
2601_9577875811 小时前
矩阵流量转化漏斗拆解:从公域获客到私域成交的技术链路设计
线性代数·矩阵
Brilliantwxx11 小时前
【C++】深度剖析 · 继承 (虚基表+虚函数表)
开发语言·c++
一只旭宝12 小时前
【C加加入门精讲15】:IO流缓冲区、字符串流、缓冲流及STL vector容器零基础实战教程一、博客前言
开发语言·c++