CS50-与马里奥金字塔一起卡住

CS50-与马里奥金字塔一起卡住,c,cs50,C,Cs50,一直在做pset1的“马里奥金字塔”并且被关于打印“哈希”的部分卡住了,已经尝试了不同的方法但是。。。没有什么。具体而言,问题在于如何定义“hs”的值。下面是关于pset1的问题 #include <stdio.h> #include <cs50.h> int main(void) { int h, s, hs, i; do { h = get_int("Height: "); } while (h < 0 || h &g

一直在做pset1的“马里奥金字塔”并且被关于打印“哈希”的部分卡住了,已经尝试了不同的方法但是。。。没有什么。具体而言,问题在于如何定义“hs”的值。下面是关于pset1的问题

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

int main(void)
{
    int h, s, hs, i;

    do {
        h = get_int("Height: ");
    } while (h < 0 || h > 23);

    for (i = 0; i < h; i++) {
        /* ignore 1 */
        if (i < 1) {
            printf("");
        } else {
            for (s = (h - i); s > 1; s--) {
                /* Spaces */
                printf(" ");
            }

            for (hs = 2; hs < h; hs++) {
                /* Hashes */
                printf("#");
            }

            /* Jump Line */
            printf("\n");
        }
    }
}

在开始编码之前,当它看起来像一个半金字塔时,试着理解如何用铅笔解决这个问题 还有纸

特别是当你学习计算机科学课程时,更重要的是 了解基本原理,而不是编程本身。经常 你需要弄清楚这个模式。一旦你做到了,翻译它 进入一个程序要容易得多

让我们试着找出这里的模式

这就是你想要的金字塔

##
##  ##
###  ###
####  ####
你能观察到的第一件事是什么?我们只需要看左边 金字塔的一半,因为右半部分是相同的,只是镜像的

因此,问题变得更容易:

#|#
##      -->     |  ##
###              | ###
####              |####
我添加了
|
,以明确每行的起始位置。所以对于一个4的金字塔:

  • 我们需要4条线
  • 每行长度相同,4个字符
  • 从上到下,空格数减少,哈希数增加 底部:

    • 对于第一行,我们需要4-1=3个空格和1个散列
    • 对于第二行,我们需要4-2=2个空格和2个哈希
    • 对于第三行,我们需要4-3=1个空格和3个散列
    • 对于第四行,我们需要4-4=0个空格和4个散列
    你开始看到这里的模式了吗

所以在计算中,我们从0开始计算。初学者经常犯错误去学习 从1开始计数。让我们从0开始重复这些句子:

  • 对于第0行,我们需要4-1-0=3个空格和0+1=1个散列
  • 对于第1行,我们需要4-1-1=2个空格和1+1=2个散列
  • 对于第二行,我们需要4-1-2=1个空格和2+1=3个散列
  • 对于第三行,我们需要4-1-3=0个空格和3+1=4个散列
因此,对于尺寸为n的金字塔:

  • 对于第0行,我们需要n-1-0个空格和0+1=1个散列
  • 对于第1行,我们需要n-1-1个空格和1+1=2个散列
  • ···
  • 对于第n-1行,我们需要n-1-(n-1)个空格和(n-1)+1个散列
你又看到这个图案了吗

  • 对于第i行,我们需要n-1-i空间和i+1散列
我们有左半部的模式,右半部是一样的,只是 镜像。现在我们知道了空格和散列的数目,写一个循环 非常简单,您几乎只需插入公式:

#include <stdio.h>

int main(void)
{
    int n = 10, i, j;

    for(i = 0; i < n; ++i)
    {
        // left half
        for(j = 0; j < n-1-i; ++j)
            printf(" ");
        for(j = 0; j < i + 1; ++j)
            printf("#");

        // 2 spaces in the middle
        printf("  ");

        // right half, we swapped the order
        for(j = 0; j < i + 1; ++j)
            printf("#");
        for(j = 0; j < n-1-i; ++j)
            printf(" ");

        printf("\n");
    }

    return 0;
}
当解决此类问题时,尝试使用此方法,选择一个 用铅笔和纸,用手解决它。做 我们已经找到了模式,并将其翻译成代码是一个简单的过程 蛋糕。注意,我们甚至看到问题可以“一分为二”,因为
对称性。现在给你一个练习:打印相同的金字塔,但要倒置。

我们假设知道pset1是什么,我猜?你的问题与下面链接中的问题相关吗?(顺便说一句,如果你还需要一个单独的答案的话,这个网站可能更适合你的问题。)对不起,马里奥是不是不太舒服,这对我来说还是难以理解的,即使有(或者可能是因为)那个评论。你是在谈论这门课程的家庭作业,不是吗?如果是,请在您的问题中简要总结,作为解释,并添加此链接以供进一步参考。
        // this for loop before the printf("\n");
        // can be removed, not needed.
        for(j = 0; j < n-1-i; ++j)
            printf(" ");