在C中用星号创建金字塔的边框

时间:2013-11-16 04:03:45

标签: c algorithm for-loop border spacing

行。所以我只是尝试用C中的简单算法和星号进行一些练习。这不是一个作业问题。在我的书中有一个项目要求你创建一个程序,使用星号制作“这些形状”。其中一个是金字塔。虽然我可以找到很多关于如何在网上制作金字塔的例子,但我找不到一个可以帮助我找出一个边界的算法。我也没有在这里见过一个。

现在这里是我已有的代码。

#include <stdio.h>
int main(void)
{
    int i,j,k,x,h=0;
    printf("\n\n");

    for( i = 1; i <= 5; i++)
    {
        for( k = 1; k <=5-i; k++)
        {
            printf(" ");
        }
        for( j = 1; j <= 2*i-1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    for ( i = 6; i < 10; i++)
    {
        for( k = 1; k <= i-5; k++)
        {
            printf(" ");
        }
        for( j = 1; j <= i+1-3*h; j++)
        {
            printf("*");
        }
        printf("\n");
        h++;
    }
    printf("\n\n");

    return 0;
}

当你运行程序时,它应该,因为我已经运行了很多次没有错误,给你这个形状:

....*
...***
..*****
.*******
*********
.*******
..*****
...***
....*

我一直认为带有星号的循环可能需要更多的循环来确定星号之间间距的位置。但我真的不能开始考虑如何做到这一点。我最终想要的是:

....*
...*.*
..*...*
.*.....*
*.......*
.*.....*
..*...*
...*.*
....*

对此的任何帮助将不胜感激。 我是初学程序员。在我的第一个大学水平的编程课。我们只是在这堂课中学习C语言。我们已经学习了多维数组,并于周四开始学习函数。

2 个答案:

答案 0 :(得分:2)

这是一个提示。你想要“第一个和最后一个*” - 所以看看循环

for( j = 1; j <= 2*i-1; j++)
    {
        printf("*");
    }

并将其更改为:

printf("*");  // first *
for( j = 2; j<= 2*i-2; j++) printf(" "); // spaces until...
printf("*");  // last *

了解您如何继续...这不是您需要进行此更改的唯一地方。

编辑以响应@KalaJ的请求我提供完整的代码 - 一次使用第一颗和最后一颗星,一次不使用。您可以通过更改#if 0预处理程序指令中的条件来选择要使用的那个。如果将其设置为#if 1,则会获得原始模式。

#include <stdio.h>
#if 0
int main(void)
{
    int i,j,k,x,h=0;
    printf("\n\n");

    for( i = 1; i <= 5; i++)
    {
        for( k = 1; k <=5-i; k++)
        {
            printf(" ");
        }
        printf("*");
        for( j = 2; j <= 2*i-2; j++)
        {
            printf(" ");
        }
        if(i>1) printf("*");
        printf("\n");
    }
    for ( i = 6; i < 10; i++)
    {
        for( k = 1; k <= i-5; k++)
        {
            printf(" ");
        }
        printf("*");
        for( j = 1; j <= i-3*h-1; j++)
        {
            printf(" ");
        }
        if(i<9) printf("*");
        printf("\n");
        h++;
    }
    printf("\n\n");

    return 0;
}
#else
int main(void)
{
    int i,j,k,x,h=0;
    printf("\n\n");

    for( i = 2; i <= 5; i++)
    {
        for( k = 1; k <=5-i; k++)
        {
            printf(" ");
        }
        printf("*");
        for( j = 2; j <= 2*i-2; j++)
        {
            printf(" ");
        }
        if(i>1) printf("*");
        printf("\n");
    }
    for ( i = 6; i < 9; i++)
    {
        for( k = 1; k <= i-5; k++)
        {
            printf(" ");
        }
        printf("*");
        for( j = 1; j <= i-3*h-1; j++)
        {
            printf(" ");
        }
        if(i<9) printf("*");
        printf("\n");
        h++;
    }
    printf("\n\n");

    return 0;
}
#endif

这会产生

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

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

答案 1 :(得分:0)

  1. 将每个边缘定义为向量
  2. 找到最大(Y)
  3. 从max(Y)向下迭代
  4. 对于每个Y找到匹配的X然后打印点或星号如果你与矢量相交,直到该行上的max(X)