题目来源:2023 年 12 月 CCF GESP C++ 二级 编程题 第二题 小杨的 H 字矩阵
1 题目:
题目描述:
小杨想要构造一个 的 H 字矩阵(N 为奇数),具体来说,这个矩阵共有 N 行,每行 N 个字符,其中最左列、最右列都是 | ,而中间一行(即第 N + 1 2 \frac{N+1}{2} 2N+1行)的第 2~N-1 个字符都是 - ,其余所有字符都是半角小写字母a 。
例如,一个 N=5 的 H 字矩阵如下:
|aaa|
|aaa|
|---|
|aaa|
|aaa|
请你帮小杨根据给定的 N 打印出对应的 H 字矩阵。
输入:
一行一个整数 N ( 5 < = N < = 49 5<=N<=49 5<=N<=49 ,保证 N 为奇数)。
输出:
输出对应的 H 字矩阵。
请严格按格式要求输出,不要擅自添加任何空格、标点、空行等任何符号。
你应该恰好输出 N 行,每行除了换行符外恰好包含 N 个字符,这些字符要么是 - ,要么是 | ,要么是 a 。
你的输出必须和标准答案完全一致才能得分,请在提交前仔细检查。
特别提醒:
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
样例输入 1:
5
样例输出 1:
|aaa|
|aaa|
|---|
|aaa|
|aaa|
样例输入 2:
7
样例输出 2:
|aaaaa|
|aaaaa|
|aaaaa|
|-----|
|aaaaa|
|aaaaa|
|aaaaa|
2 题目分析
第一步,完成输入部分。
输入部分只有一个整数 N,范围在
5
<
=
N
<
=
49
5<=N<=49
5<=N<=49 ,并且保证 N 为奇数。
int N;
cin>>N;
根据输出可知,分成三个部分。
第一部分,输出 |aaaaa|,有 N/2 行 ,第二部分输出 |-----| 只有 1 行,第三部分输出 |aaaaa|,有 N/2 行。
先实现第一部分,| 是固定的,而内部的 a,刚好是 N-2 个。
所以,代码可以这样:
for(int i=1;i<=N/2;i++)//共有 N/2 行
{
cout<<"|";//换行之前,先把|a...|这些先输出
for(int j=1;j<=N-2;j++)//内部的a,刚好是 N-2个
{
cout<<"a";
}
cout<<"|";
cout<<endl;//换行
}
可以按样例验证一下,发现是正确的。
![[Pasted image 20231220105650.png]]
接着输出包含 - 部分。这个部分只需要注意 - 的个数即可,发现和第一部分的 a 是一样的,所以代码可以这样写:
cout<<"|";
for(int j=1;j<=N-2;j++)
{
cout<<"-";
}
cout<<"|";
cout<<endl;
第三部分和第一部分一样,直接复制代码即可。
以上,即完成整个输出。
代入验证,发现正确!
![[Pasted image 20231220110205.png]]
这个方法相对来说,比较简单,也方便理解,但代码量相对比较大,当然还有更加简便的方法,如果没兴趣的可以不用看下去啦~
分析发现,一共有 N 行,并且 N 行都是进行换行。
for(int i=1;i<=N;i++)
{
cout<<endl;//换行
}
而在换行之前,需要将 |、a、-、| 这些字符输出。
因此先输出 |:
//换行之前,还需要进行各种操作
cout<<"|";//|是必须的
紧接着输出字符 a 或者字符 -,只有一个特殊情况,当处于中间一行时,才会输出 a字符,所以只需要进行一个特殊判断即可。文章来源:https://www.toymoban.com/news/detail-761747.html
//根据行输出a和-
if(i==(N+1)/2)//在中间一行时
{
for(int j=1;j<=N-2;j++)
{
cout<<"-";//输出字符-
}
}
else
{
for(int j=1;j<=N-2;j++)
{
cout<<"a";//输出字符-
}
}
最后把 | 带上,结合前面部分。文章来源地址https://www.toymoban.com/news/detail-761747.html
for(int i=1;i<=N;i++)
{
//换行之前,还需要进行各种操作
cout<<"|";//|是必须的
//根据行输出a和-
if(i==(N+1)/2)//在中间一行时
{
for(int j=1;j<=N-2;j++)
{
cout<<"-";//输出字符-
}
}
else
{
for(int j=1;j<=N-2;j++)
{
cout<<"a";//输出字符-
}
}
cout<<"|";
cout<<endl;//换行
}
3 参考代码
3.1 方法一:
#include<iostream>
using namespace std;
int main()
{
int N;
cin>>N;
//第一部分
for(int i=1;i<=N/2;i++)//共有 N/2 行
{
cout<<"|";//换行之前,先把|a...|这些先输出
for(int j=1;j<=N-2;j++)//内部的a,刚好是 N-2个
{
cout<<"a";
}
cout<<"|";
cout<<endl;//换行
}
//第二部分
cout<<"|";
for(int j=1;j<=N-2;j++)
{
cout<<"-";
}
cout<<"|";
cout<<endl;
//第三部分
for(int i=1;i<=N/2;i++)//共有 N/2 行
{
cout<<"|";//换行之前,先把|a...|这些先输出
for(int j=1;j<=N-2;j++)//内部的a,刚好是 N-2个
{
cout<<"a";
}
cout<<"|";
cout<<endl;//换行
}
return 0;
}
3.2 方法二:
#include<iostream>
using namespace std;
int main()
{
int N;
cin>>N;
for(int i=1;i<=N;i++)
{
//换行之前,还需要进行各种操作
cout<<"|";//|是必须的
//根据行输出a和-
if(i==(N+1)/2)//在中间一行时
{
for(int j=1;j<=N-2;j++)
{
cout<<"-";//输出字符-
}
}
else
{
for(int j=1;j<=N-2;j++)
{
cout<<"a";//输出字符-
}
}
cout<<"|";
cout<<endl;//换行
}
}
到了这里,关于【习题解析】小杨的 H 字矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!