制作哈希金字塔

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

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

do while循环似乎做了它的预期。 现在,程序,给定变量“高度”现在需要创建该高度的金字塔。 金字塔的底部与终端的左下角对齐,其最后的“行”是用2个哈希完成的:

高度为4的样本金字塔:

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

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

我已经注意到,对于每一行,所需的哈希数量(如果我们将顶行称为“行1”而后续的“行2”等等…是行号+ 1。至于空格的数量是需要的,可以用高度行数表示 。如果有人能够向我解释如何用C编写这个程序,那将非常感激!:)

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

 #include  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. 第二个内部for循环:此循环类似于第一个内部循环,但您现在需要打印散列标记。 在循环开始时,您重置j并计算所需的散列标记数

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

 #include  #include  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: ## ### #### ##### ###### 
  • 第1个for循环基本上打印与输入的高度匹配的行数

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

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

干杯