制作哈希金字塔

问题描述 投票:0回答:3

目前正在学习 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 循环似乎达到了其预期目的。现在,给定变量“高度”,程序现在需要创建该高度的金字塔。金字塔的底部将与终端的左下角对齐,其最后“行”将以 2 个哈希值结束:

高度为 4 的金字塔样本:

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

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

我注意到,对于每一行,所需的哈希数(如果我们将顶行称为“第 1 行”,随后的“第 2 行”,依此类推......是 行号+1。至于需要的空间量,可以用高度行数来表示。 如果有人能够向我解释如何使用 C 编写这个程序,我将不胜感激! :)

c cs50
3个回答
5
投票

这是一种实现此目的的方法。基本上,您需要从下到上构建金字塔。一旦您看到循环结构,任务就很容易了,只是需要通过数学计算来打印正确数量的空格和散列符号:

#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. 外层for循环:变量

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

  2. 第一个内部for循环:对于任何行,都需要有

    height - i - 2
    空格。您可以算出这一点,因为总行宽度将为
    height
    ,并且任何行都有
    i + 2
    哈希符号,因此需要有
    height - (i + 2) = height - i - 1
    空格。所以基本上,这个循环只是打印所需的空格。您可以使用变量
    j

  3. 来跟踪它
  4. 第二个内部 for 循环:此循环与第一个内部循环类似,但您现在需要打印哈希标记。在循环开始时,您重置

    j
    并计数到所需的哈希标记数量


2
投票

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

#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 循环涉及根据输入的高度打印空格数

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

干杯


0
投票
#include <cs50.h>
#include <stdio.h>

int main(void)
{

    int height;
    do
    {
        height = get_int("Enter height of pyramid: ");
    }
    while (height <= 0);

    for (int i = 1; i <= height; i++)
    {
        for (int j = 0; j < (height - i); j++)
        {
            printf(" ");
        }
        for (int k = 0; k < i; k++)
        {
            printf("#");
        }
        printf("\n");
    }
}

确实是一样的。使用嵌套的 for 循环。我之前也有同样的疑问。你不能像在 Python 中那样真正地相乘字符串。

© www.soinside.com 2019 - 2024. All rights reserved.