代码打印正确输出次数过多(CS50)

问题描述 投票:0回答:2

我对编码和通过哈佛大学的免费 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");
}
c function loops printing cs50
2个回答
1
投票

你的代码不完整,但问题似乎出在这里。

    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);
        }
    }

0
投票
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
金字塔。

只需移除外环即可。

© www.soinside.com 2019 - 2024. All rights reserved.