2016-02-12 36 views
-3

我一直在试图生成散列的模式,看起来是这样的:生成散列的特定模式需要帮助

#   # 
##  ## 
    ### ### 
    ######## 

我的代码是: -

#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; 
} 

我很确定我做了一些愚蠢的错误,但我似乎无法找到答案。这段代码生成的模式具有正确的哈希值,但是它在空间中混乱了。任何人都可以告诉我我哪里出了错?只是错误,我会想法如何纠正它自己。谢谢!

OUTPUT: -

#   # 
##  ## 
    ### ### 
     ######## 
+0

你有什么输出? –

+0

编辑该问题。 –

+0

你知道如何使用调试器吗? –

回答

3

这里有一个方法,可以让你用更短的程序解决您的问题:你的分解模式进入的部分,并描述的行数方面它们的大小。

首先要注意的是您的图案是对称的:其右侧是其左侧的镜像。在半分割的格局给你你的下一个观察:半七个字符宽:

#  |  # 
## | ## 
    ### | ### 
    ####|#### 

1234567 7654321 

每一行的左侧由p空间,长度h的octothorps的运行一个前缀和后缀的s空间。前缀p和后缀s可能长度为零。右边是由后缀组成的,后面是八卦运行;前缀是空格,所以可以省略。

现在我们来计算每行的值p,hs。假定行从零开始编号(因为在C++的东西通常从零计数):

  • p是零为初始行,一个用于下一个行,两个用于下一行,依此类推。因此,p等于row号码。
  • h是一个用于第一行,两个用于下一行,依此类推。因此,hrow+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; 
} 
+0

惊人的解释。谢谢。我从来没有这样想过模式。 –

+0

_“s总是7-p-s”_是吧? –

+0

@PreferenceBean你说得对,它是h,而不是s。感谢您的编辑和捕捉。 – dasblinkenlight

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); 
    } 
} 

就是这样。希望这可以帮助!