Cs50 PSET 1 马里奥不太舒服

Cs50 PSET 1 Mario less comfortable

嘿谢谢你的帮助:screenshot

编程新手并试图理解为什么第 17 行中的代码产生左对齐金字塔的期望结果的逻辑。只是想完全理解为什么 x= height - y - 1 给出了预期的结果。

这个片段

for (int x = height - y - 1; x < height; x++)
{
    print("#");
}

与对齐无关。金字塔将始终在没有 space(" ") 打印循环的情况下左对齐,您的代码中没有,您可能也不需要。

现在让我们通过迭代了解发生了什么

height 视为 5

在外循环的第一次迭代中(即for (int y = 0; y < height; y++)

  • y = 0
  • x = 高度 - y - 1 = 5 - 0 - 1 = 4

所以x从4开始,在到达height之前停止,即5。所以这个循环将恰好执行1时间。这意味着它将打印 singular #.

在外循环的第二次迭代中

  • y = 1
  • x=身高-y-1=5-1-1=3

所以 x 从 3 开始,在 到达 height 之前停止 ,即 5。所以这个循环将恰好执行 2次。这意味着它将打印 # 两次 .

在外循环的第三次迭代中

  • y = 2
  • x=身高-y-1=5-2-1=2

所以 x 从 2 开始,在 到达 height 之前停止 ,即 5。所以这个循环将恰好执行 3次。这意味着它将打印 # 三次 .

在外循环的第四次迭代中

  • y = 3
  • x=身高-y-1=5-3-1=1

所以x从1开始,在到达height之前停止,即5。所以这个循环将恰好执行4次。这意味着它将打印 # 4 次。

在外循环的第五次也是最后一次迭代中

  • y = 4
  • x=身高-y-1=5-4-1=0

所以x从0开始,在到达height之前停止,即5。所以这个循环将恰好执行5次。这意味着它将打印 # 5 次 .

因此,要实现该逻辑,就是使用 x = height - y - 1 的原因。然而,还有其他方法可以做到这一点-

for (int x = 0; x < y + 1; x++)
{
    print("#");
}

这也将以相同的逻辑工作,但希望不会引起混淆。

注意,每行打印的字符数如何与行号匹配。所以第一行有 1 个散列,第二行有 2 个,依此类推。我们可以从 y 推导出行号。对于第一行 y = 0,对于第二行 y = 1 等等。所以我们可以简单地将 1 添加到 y 并将其设置为我们的上限来打印哈希值。