制作哈希金字塔
Making a Hash Pyramid
目前正在学习 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" 的程序现在需要创建该高度的金字塔。金字塔的底部将与终端的左下角对齐,其最后一个 "row" 将以 2 个哈希值结束:
高度为 4 的示例金字塔:
##
###
####
#####
但代码需要对金字塔 1-23 的任何高度通用。
这是我遇到困难的地方(实际上是在编写代码来绘制它)。
我注意到对于每一行,所需的哈希数(如果我们调用第一行 "row 1" 和随后的 "row 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");
}
}
如需进一步说明发生了什么,以及为什么每个循环都是必要的:
外层for循环:变量i
对应金字塔中的一行。 i
的值对于后两个循环中的每一个都将保持不变
第一个内部for循环:对于任何一行,都需要有height - i - 2
个空格。您可以计算出这一点,因为总行宽将为 height
,并且任何行都有 i + 2
个哈希符号,因此需要有 height - (i + 2) = height - i - 1
个空格。所以基本上,这个循环只打印所需的空格。您可以使用变量 j
进行跟踪
第二个内部for循环:这个循环类似于第一个内部循环,但你现在需要打印散列标记。在循环开始时,您重置 j
并计算所需的哈希标记数
这是一个可能提供一些见解的版本:
#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循环涉及在同一行上的空格数量之后打印哈希值(相对于高度值)
干杯
目前正在学习 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" 的程序现在需要创建该高度的金字塔。金字塔的底部将与终端的左下角对齐,其最后一个 "row" 将以 2 个哈希值结束:
高度为 4 的示例金字塔:
##
###
####
#####
但代码需要对金字塔 1-23 的任何高度通用。 这是我遇到困难的地方(实际上是在编写代码来绘制它)。
我注意到对于每一行,所需的哈希数(如果我们调用第一行 "row 1" 和随后的 "row 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");
}
}
如需进一步说明发生了什么,以及为什么每个循环都是必要的:
外层for循环:变量
i
对应金字塔中的一行。i
的值对于后两个循环中的每一个都将保持不变第一个内部for循环:对于任何一行,都需要有
height - i - 2
个空格。您可以计算出这一点,因为总行宽将为height
,并且任何行都有i + 2
个哈希符号,因此需要有height - (i + 2) = height - i - 1
个空格。所以基本上,这个循环只打印所需的空格。您可以使用变量j
进行跟踪
第二个内部for循环:这个循环类似于第一个内部循环,但你现在需要打印散列标记。在循环开始时,您重置
j
并计算所需的哈希标记数
这是一个可能提供一些见解的版本:
#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循环涉及在同一行上的空格数量之后打印哈希值(相对于高度值)
干杯