【问题标题】:Asterisk Pyramid in C [closed]C中的星号金字塔[关闭]
【发布时间】:2020-01-12 23:58:23
【问题描述】:

练习:编写一个程序,读取一个自然数n并绘制一个星号金字塔。 n = 5的型号:

    *
   ***
  *****
 *******
*********

代码:

int main ()
{
    int n, i, j=1, aux1, aux2;
    int spaces=1;
    scanf ("%d", &n);

    for (i=0; i<n; i++)
    {
        spaces += 1;
    }
    printf ("\n");
    for (i=0; i<n; i++)
    {
        aux1 = j;
        aux2 = spaces;

        while (aux2 >= 1)
        {
            printf (" ");
            aux2--;
        }

        while (aux1 >= 1)
        {
            printf ("*");
            aux1--;
        }

        j += 2;
        spaces--;

        printf ("\n");
    }

    return 0;
}

我的代码从在线法官那里收到“Presentation Error”,因为每行的最后一个星号后面都有一个空格。 有关如何修复它的任何提示?

【问题讨论】:

  • 每行末尾少打印一个空格?
  • 您是否验证过它实际上在后面包含一个空格?
  • 是的,斯科特·亨特。
  • 使用您的代码,我无法理解为什么每行末尾都有一个空格。但在每一行的开头,有 2 个单独的空格。
  • 如果您指的是换行,只需将\n 添加到您的printf("\n\n");

标签: c loops for-loop


【解决方案1】:

您的代码在每一行的开头都有空格,而不是结尾。

这是我能想到的解决该问题的最简单方法:

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
    int i, j, height;

    scanf("%d", &height);

    for (i = 0; i < height; i++) {
        for (j = 0; j < height - i - 1; j++)
            putchar(' ');

        for (; j < height + i; j++)
            putchar('*');

        putchar('\n');
    }

    return EXIT_SUCCESS;
}

【讨论】:

  • “演示错误”。 :(
  • 呃,这一行有意在每一行的末尾添加了空格——为什么?另外,OP 真的在读代码吗?
  • @gmn_1450 我在末尾添加了额外的空格,以便输出为“块状”,但这是一个错误。现在应该可以正常工作了。
  • @SteveFriedl 出于某种原因,我认为每个“行”必须具有相同的大小,因此我通过在末尾添加空格来平衡它们。现已修复,谢谢指正!
  • 我明白了!非常感谢。
【解决方案2】:

我很确定它在星号后面包含一个空格,而且很容易亲眼看到。在星号后包含换行符的底部附近,我添加了一个结束标记 (|),以便我们可以看到:有空格吗?

我没有看到。

#include <stdio.h>

int main ()
{
    int n;
    scanf ("%d", &n);

    int spaces_before_stars = n - 1;

    printf ("\n");

    int i, nstars;

    for (i = 0, nstars = 1; i<n; i++)
    {
        int aux1 = nstars;
        int aux2 = spaces_before_stars;

        while (aux2-- > 0)
            printf (" ");

        while (aux1-- > 0)
            printf("*");

        nstars += 2; 

        spaces_before_stars--;

        printf ("|\n");    // the "|" marks the end of the line, remove for final
    }

    return 0;
}

但是您的代码版本在每一行的开始处都有空格,这可能是演示代码不满意的地方。

使用更好的变量名稍微重构代码使其更容易理解 - 您应该不会看到额外的前导空格和尾随空格。

【讨论】:

    【解决方案3】:

    假设 n>0,这应该可以解决问题,假设需要交替的空行并且允许尾随无关的新行。

    char *ast = malloc(n * 2);
    if (ast == NULL)
       return(1);
    memset(ast, '*', n*2);
    ast[(n*2)-1] = 0;
    for (i=1; i<=n; i++) {
       int spaces = n - i;
       printf("%*s%.*s\n\n", spaces, "", (i*2)-1, ast);
    }
    free(ast);
    return (0);
    

    【讨论】:

    • 这看起来太聪明了一半:如果 OP 在基本循环控制方面遇到问题,解码魔术printf 格式将不是一件容易的事。
    • @SteveFriedl 也许
    • 我认为这种“更好”的 printf 格式:int main(void) { int n = 5; char stars[2*n]; memset(stars, '*', 2*n); for(int i=0; i&lt;n; ++i) { printf("%*.*s\n",n+i,2*i+1,stars); } return 0; }
    • @abelenky 我同意。更容易理解。
    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多