【问题标题】:Making a Hash Pyramid制作哈希金字塔
【发布时间】:2015-07-21 01:55:13
【问题描述】:

目前正在上 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 循环似乎按照它的意图进行。现在,给定变量“height”的程序现在需要创建该高度的金字塔。金字塔的底部将与终端的左下角对齐,其最后“行”将以 2 个哈希结束:

高度为 4 的金字塔示例:

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

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

我注意到,对于每一行,所需的散列数(如果我们称顶行“第 1 行”和随后的“第 2 行”等等...... 行号+1。至于需要多少个空格,可以用行高数来表示。 如果有人能够向我解释如何使用 C 编写这个程序,将不胜感激! :)

【问题讨论】:

  • 使用两个嵌套循环来生成输出。根据发现的规则,内部循环应该发出空格和破折号(例如单行)。外部循环简单地迭代,直到所有行都完成。
  • 我对 C 完全陌生,我不确定我是否理解。你能告诉我你的意思吗?
  • 仅供参考,如果您强制执行 23 的上限,则可以通过滥用 printf 及其使用单个循环精确打印字符串的机制(无论如何由您实现)来实现。 See here 是一个讨论 printf 的精彩页面,see here 是如何将其用于此任务的示例。

标签: c cs50


【解决方案1】:

您可以通过以下方式实现这一点。基本上,您需要自下而上构建金字塔。一旦你看到循环结构,任务就很容易了,只是很难计算出正确数量的空格和哈希符号:

#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 并计数到所需的哈希标记数

【讨论】:

  • 感谢您的重播,先生,让我确保我明白这里发生了什么。所以第一个“for循环”你有一个变量i,如果它是最后一个则增加1,然后是推算高度。完成之后,程序将进入第二个 for 循环,在该循环中声明了一个 j 变量。然后程序检查 j 是否小于高度减去 i 减去 1。你为什么要做最后一部分?最后的 for 循环是做什么的?
  • EthanT,我加了一点解释
【解决方案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 循环涉及在同一行上的空格数量之后打印哈希数(相对于高度值)

干杯

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 2021-08-02
    • 2014-05-11
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2019-09-14
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多