CS50 mario不太舒适的代码有什么问题?

时间:2020-04-11 14:44:46

标签: c cs50

这是我的代码的副本:

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

int main(void)
{
    int height = get_int("Please enter a height between 1 and 8 (inclusive)\nHeight: ");

    if(0 < height && height < 9)
    for(int i = 0; i <= height; i++)
    {
        for(int s = (height - 1); s >= 1; s--)
        {
            printf("a");
        }

        for(int h = 1; h <= i; h++)
        {
            printf("#");
        }

        printf("\n");
    }

    else
    printf("Please try again.\n"),
    main();
}

我似乎无法正确理解的部分是打印正确的空格数,因为它似乎没有减少每个循环后的变量“ s”。 (我已经用字母“ a”替换了空格,以便可以看到代码出了问题的地方。) 该代码的目的是打印右对齐的#的金字塔。 我在哪里错了?

例如,如果用户输入高度3,则输出将为:

aa

aa#

aa##

aa###

但是,我希望输出为:

aa#

a##

###

2 个答案:

答案 0 :(得分:1)

主要问题是打印“ a”时代码中的第二个for循环。每当您打入该特定循环时,基本上就打印(高度-1)次“ a”。实际上,您每次都应少打印一个“ a”(又增加一个哈希)。为此,我们需要调整s的条件。 代替这个

int s = height - 1; s >= 1

使用此

int s = height - i; s > 1

由于您的主循环具有迭代器i,因此我们可以在这里使用它。

第二个问题是,根据CS50问题集的描述,您应该实际打印" "(空格),而不是"a"。为此,应将"a"替换为" "

第三期是您的代码在开头打印了一行多余的空格。您需要在这种情况下调整main for循环以删除多余的一行。

i < height

在打印#符号的for循环中,您需要从零开始迭代器h,以便它从第一行开始立即打印。

int h = 0

答案 1 :(得分:0)

更好的解决方案是使用printf的内置功能,将问题减少到一个简单的循环中。

#include <stdio.h>

int main(void) {
    int height = get_int("Please enter a height between 1 and 8 (inclusive)\nHeight: ");

    unsigned char blocks[height];
    memset(blocks, '#', height);

    for(int i=0; i<height; ++i)
    {
        printf("%*.*s\n", height, i+1, blocks);
    }
    return 0;
}

输出

Success #stdin #stdout 0s 4212KB
    #
   ##
  ###
 ####
#####
相关问题