【问题标题】:Creating a "Mario Style Pyramid" [duplicate]创建“马里奥风格金字塔”[重复]
【发布时间】:2016-12-22 00:52:41
【问题描述】:

我正在学习哈佛 CS50 在线课程,其中一个问题是使用空格和哈希创建“马里奥风格金字塔”。我已经解决了空间问题,但哈希给我带来了麻烦。代码如下:

#include <stdio.h>
#include <cs50.h>

int main(void)
{
    //get height between 1 and 23
    int height;
    do
    {
        printf("Please enter a height: ");
        height = GetInt();
    }
    while (height < 1 || height > 23);

    //build pyramid
    for (int i = 0; i < height ; i++)
    {
        //add spaces
        for (int space = height - 1 - i; space >= 0; space--)
            printf(" ");

        //add hashtags
        for (int hash = 2 + i; hash <= height; hash++)
            printf("#");

        printf("\n");
    }
}

当我在高度为 5 的终端中运行它时,我得到了这个:

     ####
    ###
   ##
  #
   <-- space here also

当我想要这个时:

    ##
   ###
  ####
 #####
######

任何反馈将不胜感激,谢谢

【问题讨论】:

  • 如果您查看标记为 CS50 的其他问题,就会发现很多人都在为同样的问题争论不休——也许其中一个问答会有所帮助。在搜索框中输入[cs50] mario
  • 您对相反的循环感到困惑。一个减少,一个增加。只需使用两个增加的循环即可。第二个(散列)基于第一个中输出的空格数。
  • 对于我自己,我会使用一个循环和一个本地常量,初始化为 21 个空格,后跟 23 个哈希(所以不会让我粘贴它,因为它会压缩空格)我会留下详细信息读者 :) 那不会给你一个金字塔,而是一个坡道
  • 跟着Jonathan Leffler的评论一起看this question

标签: c loops cs50


【解决方案1】:

用下面的代码试试吧:

int main(void)
{
    int height;
    printf("Please enter a height: ");
    scanf("%d", &height);

    //build pyramid
    for (int i = height; i >= 1; i--)
    {
        //add spaces
        for (int space = 1; space < i; space++)
            printf(" ");

        //add hashtags
        for (int hash = height; hash >= i-1; hash--)
            printf("#");

        printf("\n");
    }
}

height 的值为5时,你会得到想要的输出:

    ##
   ###
  ####
 #####
######

查看Working Fiddle


在您的代码中,当 i 的值为 0 时:

for (int i = 0; i < height ; i++)
         ^^^^^^

其他循环执行如下:

for (int space = height - 1 - i; space >= 0; space--)
    printf(" ");

这里,循环初始化 space = 4(当 height5 时)并且循环条件在 space &gt;= 0 之前有效,因此它打印前 4字符为" "

最后,当谈到这个循环时:

for (int hash = 2 + i; hash <= height; hash++)
    printf("#");

这里,循环初始化 hash = 2 i 在第一个循环中是 0,还记得吗?) 和循环条件一直持续到hash &lt;= height。因此,它将接下来的 4 个字符打印为 "#",因为上述条件的计算结果为 2,3,4,5

(int hash = 2; hash <= 5; hash++)
           ^^^        ^^^

其余代码继续并产生如下输出:

     ####
    ###
   ##
  #

如果你能理解上面的逻辑,那么你也可以解码我的解决方案:)

【讨论】:

  • 您应该解释原始代码有什么问题以及您的答案如何修复它。如果你只是为他写答案,他不会学习。
  • @Barmar,谢谢。希望这能给出一个明确的解释:)
  • 一个非常有用的解释,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多