制作哈希金字塔

时间:2015-07-21 01:55:14

标签: c cs50

目前正在进行CS-50课程,并想知道是否有人可以帮助我。我应该创建一个程序来询问用户1-23之间的高度(并且在给出有效答案之前不断提示用户)---我能够对该部分进行编码。

#include <cs50.h>
#include <stdio.h>

int main(void)
{ 
    int height;
    do
    {
        printf("please give me a height between 1-23: ");
        height = GetInt();
    }    
    while (height < 1 || height > 23);
}

do while循环似乎做了它的预期。现在,程序,给出变量&#34; height&#34;现在需要创建一个这个高度的金字塔。金字塔的底部应与终端的左下角和最后一行&#34;行对齐。是以2个哈希结束:

高度为4的样本金字塔:

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

但是代码需要在任何高度的金字塔1-23中都是通用的。 这是我遇到困难的地方(实际上是在制作代码来绘制它)。

我注意到每行所需的哈希数量(如果我们调用顶行&#34;第1行和第34行;以及后续&#34;第2行和第34行;依此类推...是 行号+ 1 。至于所需的空格量,可以用高度 - 行号表示。 如果有人能够向我解释如何用C编写这个程序,我将不胜感激! :)

2 个答案:

答案 0 :(得分:3)

这是一种可以实现此目的的方法。基本上,您需要从下往上构建金字塔。一旦你看到循环结构,任务就很容易了,打算输入正确数量的空格和哈希符号就很难得到数学:

#include <stdio.h>

int main(void)
{ 
    int height, i, j;
    do
    {
        printf("please give me a height between 1-23: ");
        height = GetInt();
    }    
    while (height < 1 || height > 23);

    printf("\n");    
    for (i = 0; i < height; i++) {

        for (j = 0; j < height - i - 1; j++)
            printf(" ");
        for (j = 0; j < i + 2; j++)
            printf("#");

        printf("\n");
    }
}

有关最新情况的更多说明,以及为什么每个循环都是必要的:

  1. 外循环:变量i对应金字塔中的一行。对于后两个循环中的每一个,i的值将保持不变

  2. 第一个内循环:对于任何行,都需要height - i - 2个空格。您可以解决这个问题,因为总行宽为height,任何行都有i + 2个哈希符号,因此需要height - (i + 2) = height - i - 1个空格。所以基本上,这个循环只打印所需的空格。您可以使用变量j

  3. 跟踪此信息
  4. 第二个内循环:此循环类似于第一个内循环,但您现在需要打印哈希标记。在循环开始时,您重置j并计算所需的哈希标记数

答案 1 :(得分:1)

这是一个可以提供一些见解的版本:

#include <stdio.h>
#include <cs50.h>

int main(void) {
    //initialize variables
    int height, n, j, k, i;

    printf("Height: \n");
    // Get user input
    height = GetInt();
    n = height;
    for(i = 0; i < height; i++) {
        // create n spaces based off height
        for(k = n; k > i; k--)
            printf("%c", ' ');      

        // create hash tags
        for(j = 0; j < i+2; j++)
            printf("#");

        printf("\n");
    }
    return 0;
}

如果用户输入的高度为5:

Height: 
     ##
    ###
   ####
  #####
 ######
  • 第一个for循环基本上打印与输入的高度相匹配的行数

  • 第二个for循环涉及根据输入的高度打印空格数

  • 第3个for循环涉及在同一行上的空格量之后打印哈希数(相对于高度值)

干杯