c - 制作哈希金字塔

标签 c cs50

目前正在学习 CS-50 类(class),想知道是否有人可以帮助我。我应该创建一个程序,它会询问用户 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。至于需要多少空间,可以用height-row number来表示。 如果有人能够向我解释如何使用 C 编写此程序,将不胜感激! :)

最佳答案

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

#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) = 高度 - i - 1 空格。所以基本上,这个循环只打印所需的空格。您可以使用变量 j

  3. 跟踪它
  4. 第二个内部 for 循环:这个循环类似于第一个内部循环,但您现在需要打印散列标记。在循环开始时,您重置 j 并计算所需的散列标记数

关于c - 制作哈希金字塔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529124/

相关文章:

c - int* 和 char* 写入内存

c - 我如何让我的代码工作?当它不应该这样做时,循环以某种方式终止

c - 多字符字符常数错误

c - 需要帮助在 C 中实现二进制搜索

c - 如何让控制台不断提示用户输入,直到用户在 C 中输入正整数?

c - 解决密码学问题,代码需要很长时间才能运行,需要对其进行优化

c - 静态函数是否需要 C 中原型(prototype)的 static 关键字?

c - 使用直接 I/O 进行数据传输的内存对齐要求

c - 枚举范围

c - C语言,算法在LINUX上运行良好,但在Windows 7上运行不佳?