我一直试图生成一个看起来像这样的哈希模式:
# #
## ##
### ###
########
我的代码是: -
#include <iostream>
using namespace std;
int main()
{
int pro = 1;
int space2= 12;
int handle = space2;
int space = 3;
int handle2 = space;
for (int i = 2 ; i <=8 ; i = i+2)
{
space = handle2;
handle = space2;
int k = i;
while (k > 0)
{
if (k == i/2)
{
while (space2 > 0)
{
cout << " ";
space2--;
}
cout << "#";
k--;
}
else
{
if (i > 2){
while (space <=3){
cout << " ";
space ++;
}
handle2 --;
}
cout << "#";
k--;
}
}
space2 = handle - 4;
cout << endl;
}
return 0;
}
我很确定我做了一些愚蠢的错误,但我似乎无法找到答案。此代码生成的模式具有正确的哈希值,但它在空格中混乱。谁能告诉我哪里出错了?只是错误,我想知道如何自己纠正它。谢谢!
输出: -
# #
## ##
### ###
########
答案 0 :(得分:3)
这是一种方法,可让您通过更短的程序解决问题:将模式分解为多个部分,并根据行号描述其大小。
首先要注意的是你的图案是对称的:它的右边是它左边的镜像。将模式分成两半会给你下一个观察结果:两半是七个字符宽:
# | #
## | ##
### | ###
####|####
1234567 7654321
每行的左侧包含p
个空格的前缀,长度为h
的octothorp,以及s
个空格的后缀。前缀p
和后缀s
的长度可以为零。右侧由后缀组成,后跟octothorps;前缀是空格,因此可以省略。
现在让我们计算每行的p
,h
和s
的值。假设行从零开始编号(因为C ++中的东西通常从零开始编号):
p
对于初始行为零,一个用于下一行,两个用于下一行,依此类推。因此,p
等于row
数字。h
是一行用于初始行,两行用于下一行,依此类推。因此,h
为row+1
。s
始终为7-p-h
,使其成为7-row-(row+1)
,即6-2*row
。有了这些观察结果,您需要做的就是编写一个打印n
个字符的函数,并从循环中重复调用它,传递字符和计数:
void printRepeatedCharacter(char c, int n); // Implement this
你的循环看起来像这样:
for (int row = 0 ; row != 4 ; row++) {
printRepeatedCharacter(' ', row); // prefix
printRepeatedCharacter('#', row+1); // #-s, left part
printRepeatedCharacter(' ', 6-2*row); // suffix, left part
printRepeatedCharacter(' ', 6-2*row); // suffix, right part
printRepeatedCharacter('#', row+1); // #-s, right part
cout << endl;
}
答案 1 :(得分:1)
您的代码似乎有点复杂,但让我们分析您要做的事情。你想生成这样的模式:
#------ ------#
-##---- ----##-
--###-- --###--
---#### ####---
它在中间对称(我留下一个空格),其他线条遵循规则图案,可用以下数字描述(从左到右:空格数,散列数,空格数)这只是左侧,右侧是相同的模式反转):
0 1 6
1 2 4
2 3 2
3 4 0
生成这种模式的最佳方法是提出生成这些数字的函数。我们试试吧:
int main () {
const int NumIterations = 4;
for (int x=0; x<NumIterations; ++x) {
// print 'x' spaces
// print 'x+1' hashes
// print '(NumIterations - x - 1) * 2' spaces
// print '(NumIterations - x - 1) * 2' spaces
// print 'x+1' hashes
// print 'x' spaces
}
}
让我们添加一个打印功能:
void print (char c, int count) {
for (int x=0; x<count; ++x)
cout << c;
}
现在我们的主要功能可以成为:
int main () {
const int NumIterations = 4;
for (int x=0; x<NumIterations; ++x) {
print (' ', x);
print ('#', x+1);
print (' ', (NumIterations - x - 1) * 2);
print (' ', (NumIterations - x - 1) * 2);
print ('#', x+1);
print (' ', x);
}
}
当然,您可以通过组合中间两个打印语句来进一步优化它,您可能想要省略最终的打印语句:
int main () {
const int NumIterations = 4;
for (int x=0; x<NumIterations; ++x) {
print (' ', x);
print ('#', x+1);
print (' ', (NumIterations - x - 1) * 4);
print ('#', x+1);
}
}
就是这样。希望这有帮助!