CS50 PSET 1 Mario不太舒服

时间:2020-06-09 04:24:28

标签: c cs50

嘿,谢谢您的帮助:screenshot

编程和尝试理解逻辑的原因,第17行中的代码为何产生左对齐金字塔的期望结果。只是试图完全理解为什么x = height-y-1可以得到理想的结果。

1 个答案:

答案 0 :(得分:2)

此代码段

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

与对齐没有任何关系。金字塔将始终保持对齐状态而没有空格(" ")打印循环,您的代码中没有该循环,您可能也不需要。

现在让我们遍历迭代以了解发生了什么

考虑将height设为5

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

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

因此x从4开始并在到达height之前停止,即5。因此,此循环将精确地执行 1次。这意味着它将打印单数 #

在外循环的第二次迭代中

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

因此,x从3开始,直到到达height,即 5为止。即5。因此,此循环将精确地执行 2次。这意味着它将打印# 两次

在外循环的第三次迭代中

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

因此,x从2开始,直到到达height,即 5为止。即5。因此,此循环将准确地执行 3次。这意味着它将打印# 三次

在外循环的第四次迭代中

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

因此,x从1开始并在到达height之前终止,即5。因此,此循环将精确地执行 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并将其设置为打印哈希值的上限。