有什么方法可以使这段代码更简单?

时间:2019-08-07 16:17:10

标签: c cs50

我是一名初学者,可以通过哈佛提供的CS50在线课程学习C语言。该程序应该提示用户输入身高,当他们键入身高(1-8)时,将根据用户输入的身高打印金字塔。当您键入2时,它将输出一个高2行的小金字塔,中间有2个空格。我的程序执行了应做的事情,但是我敢肯定有比嵌套循环更好的方法。

我尝试为金字塔的一侧制作一个循环,而不是两个循环。我认为这是正确的方法,但执行得很糟糕。

{

    for (int spaces = height - line; spaces > 1; spaces--)
    {
        printf(" ");

    }
    for (int hashes = 0; hashes < line + 1; hashes++)
    {
        printf("#");
    }

    printf("  ");

    for (int hashes = 0; hashes < line + 1; hashes++)
    {
        printf("#");
    }
    for (int spaces = height - line; spaces > 1; spaces--)
    {
        printf(" ");
    }
    printf("\n");

}

1 个答案:

答案 0 :(得分:1)

以下方法更有效,并且afaict产生相同的结果:

static char hashes[80];
memset(hashes, '#', sizeof(hashes));
assert( height < sizeof(hashes) );

for( int line=0; line < height; line++ ) {
  printf( "%*.*s  %-*.*s\n",
    height, line+1, hashes,
    height, line+1, hashes );
}

您是一个初学者,除了眼神之外,还有更多。 “技巧”是 printf (3)在其格式字符串中拥有一种自己的语言,这种语言一开始令人生畏。由于您的输出是常量(哈希),因此您可以使用常量字符串,并通过设置字段的大小,截断字符串并选择左对齐或右对齐来“格式化”字段。

在学习C时,您必须学习如何构造循环。使用C时,您必须学习C标准库(以及用于问题域的其他库)。通常,这些库使您避免循环,从而简化了代码。