我对编码和通过哈佛大学的免费 CS50 课程学习非常陌生。问题集 1 很困难,我认为我通过以困难的方式做事而使其更具挑战性,即我试图为我的代码创建函数以适应创建函数的工作方式。任务是制作一个高度在 1 到 8 之间的左对齐金字塔。我创建了函数来从用户处获取高度并打印金字塔。问题在于金字塔是如何打印的。打印正确,但打印次数过多。因此,如果用户在提示输入高度时输入“3”,则应打印以下内容:
#
##
###
相反,它会打印该金字塔三次:
#
##
###
#
##
###
#
##
###
根据我的下面的代码解决此问题的解决方案是什么?
主要:
{
int n = get_height();
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n; i++)
{
print_row(n - i - 1, i + 1);
}
}
}
功能:
int get_height(void)
{
int n;
do
{
n = get_int("Height: ");
}
while (n < 1 || n > 8);
return n;
}
void print_row(int spaces, int bricks)
{
// Print spaces
for (int j = 0; j < spaces; j++)
{
printf(" ");
}
// Print bricks
for (int i = 0; i < bricks; i++)
{
printf("#");
}
printf("\n");
}
你的代码不完整,但问题似乎出在这里。
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n; i++)
{
print_row(n - i - 1, i + 1);
}
}
内循环打印行。外循环重复该过程。赠品是
j
从未被使用过。如果 n 为 3,您将得到 3 行重复 3 次。
添加
printf("i: %d, j: %d\n", i, j)
以在每次 print_row
调用时显示 i 和 j 的值将是说明性的。
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n; i++)
{
printf("i: %d, j: %d\n", i, j);
print_row(n - i - 1, i + 1);
}
}
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n; i++)
{
print_row(n - i - 1, i + 1);
}
}
代码在做什么:
print_row()
打印一行。n
行。或者生成一个金字塔。n
次。因此,外部循环正在生成 n
金字塔(由于内部循环生成单个金字塔,n * 1 pyramid
等于 n pyramids
)。这就是您的代码打印金字塔
n
次的方式。因为生成金字塔一次后,您将重复该过程,直到生成 n
金字塔。
只需移除外环即可。