当前位置:   article > 正文

【习题解析】小杨的 H 字矩阵_小杨的h字矩阵

小杨的h字矩阵

题目来源: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|
  • 1
  • 2
  • 3
  • 4
  • 5

请你帮小杨根据给定的 N 打印出对应的 H 字矩阵。
输入:
一行一个整数 N ( 5 < = N < = 49 5<=N<=49 5<=N<=49 ,保证 N 为奇数)。
输出:
输出对应的 H 字矩阵。
请严格按格式要求输出,不要擅自添加任何空格、标点、空行等任何符号。
你应该恰好输出 N 行,每行除了换行符外恰好包含 N 个字符,这些字符要么是 - ,要么是 | ,要么是 a 。
你的输出必须和标准答案完全一致才能得分,请在提交前仔细检查。
特别提醒:
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
样例输入 1:
5
样例输出 1:

|aaa|
|aaa|
|---|
|aaa|
|aaa|
  • 1
  • 2
  • 3
  • 4
  • 5

样例输入 2:
7
样例输出 2:

|aaaaa|
|aaaaa|
|aaaaa|
|-----|
|aaaaa|
|aaaaa|
|aaaaa|
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2 题目分析

第一步,完成输入部分。
输入部分只有一个整数 N,范围在 5 < = N < = 49 5<=N<=49 5<=N<=49 ,并且保证 N 为奇数。

int N;
cin>>N;
  • 1
  • 2

根据输出可知,分成三个部分。
第一部分,输出 |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;//换行
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可以按样例验证一下,发现是正确的。
![[Pasted image 20231220105650.png]]
接着输出包含 - 部分。这个部分只需要注意 - 的个数即可,发现和第一部分的 a 是一样的,所以代码可以这样写:

cout<<"|";
for(int j=1;j<=N-2;j++)
{
	cout<<"-";
}
cout<<"|";
cout<<endl;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第三部分和第一部分一样,直接复制代码即可。
以上,即完成整个输出。
代入验证,发现正确!
![[Pasted image 20231220110205.png]]
这个方法相对来说,比较简单,也方便理解,但代码量相对比较大,当然还有更加简便的方法,如果没兴趣的可以不用看下去啦~
分析发现,一共有 N 行,并且 N 行都是进行换行。

for(int i=1;i<=N;i++)
{
	cout<<endl;//换行
}
  • 1
  • 2
  • 3
  • 4

而在换行之前,需要将 |、a、-、| 这些字符输出。
因此先输出 |:

//换行之前,还需要进行各种操作
cout<<"|";//|是必须的
  • 1
  • 2

紧接着输出字符 a 或者字符 -,只有一个特殊情况,当处于中间一行时,才会输出 a字符,所以只需要进行一个特殊判断即可。

	//根据行输出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";//输出字符-
		}
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

最后把 | 带上,结合前面部分。

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;//换行
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

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;//换行
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/707083
推荐阅读
相关标签
  

闽ICP备14008679号