C程序打印不规则的星形图案

时间:2014-10-05 22:10:59

标签: c ascii-art

我正在尝试编写一个可以制作星星图案的程序。最后一行真的让我感到沮丧。我必须使用printf("*"); printf(" "); printf("\n");语句一次创建代码。我想用for循环和if语句完成这个。

应该看起来像这样:

             * - 5 spaces before *
           * * - 4 spaces before *  
         * * * - 3 spaces before * 
   * * * * * * - 0 spaces before *

这是我到目前为止所尝试的:

main()
{
    int i, j, k;
    i=1;
    j=1;
    for(i=4;i>=1;i--)
    {
        for(j=1;j<=4;j++)
        {
            if(j>=i || ((i+j)==5) && !(j==2) && !(j==3))
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }
        printf("\n");
    }
}

main()
{
    int i, j, k;
    for(i=4;i>=1;i--)
    {
        for(j=1;j<i;j++)
        {
            printf(" ");
        }

        for(k=4;k>=i;k--) 
        {
            if((k>=i) ||((k>=i) && ((i+k)==5)))
            {
                printf("*");
            }
        }
        printf("\n");
    }
}

我认为我的第一种方法已经过时了。但我认为我在第二个链接中有所作为。我正在尝试在第四行打印“*”和额外2次。编译器似乎忽略了||的第二个链接运营商。我该如何更改if语句以使此模式有效?

2 个答案:

答案 0 :(得分:0)

在开始之前,先看一下你需要实现的算法。假设我们想制作一个尺寸为4的三角形 在第一个*之前将有3个空格。然后在下一行它将是2个空格,依此类推。减少每行的空格数,并用该增量减少* s每行的数量。

我们的第一个循环,即外循环,将是需要转到下一行的循环。

for(i = 0; i < size; i++)
printf("\n");

不,我们需要制作它,以便每行打印正确数量的空格。知道第一行有一个大小 - 1#空格,我们得到这个

spaces = size - 1;
for(x = 0; x < spaces; x++)
printf(" ");

现在我们把它放在外部循环的范围内,因为我们希望它为每一行做到这一点。 我们还需要在每一行之后更改空格的值,因为它会减少每一行。

int x, i;
spaces = size - 1;
for(i = 0; i < size; i++){
 for(x = 0; x < spaces; x++)
  printf(" ");
 spaces--;
 printf("\n");
}

最后我们需要它来打印* s。正如您所注意到的,* s的数量从1开始并逐行递增。所以我们再做一个for循环

int stars = 1;
for(a = 0; a < stars; a++)
  printf("*");

一旦完成,我们需要将它放在外部循环的范围内,在空格之后。

int x, i, a;
spaces = size - 1;
stars = 1;
for(i = 0; i < size; i++){
 for(x = 0; x < spaces; x++)
  printf(" ");
 for(a = 0; a < stars; a++)
  printf("*");
 spaces--;
 stars++;
 printf("\n");
}

你有它。我在论坛框中键入了所有这些,因此可能存在一些语法拼写错误,但这应该足够了。这是基本的开始绘图方法。现在你所要做的就是不规则的部分。 我会让你处理它,它就像初始化spaces变量一样简单,以补偿最后一行很长。一旦你补偿了空格,你的最后一行代码就会打印出所有的星星

答案 1 :(得分:0)

您尝试在函数(main())中执行过多操作,这就是您失败逻辑的原因。将问题拆分为较小的独立部分。

#include <stdio.h>
void printNSpaces(int count);
void printNStars(int count);

int main(void) {
    int n;

    for (n = 1; n <= 6; ++n) {
        printNSpaces(6 - n);
        printNStars(n);
        (void) printf("\n");
    }
    return 0;
}

void printNSpaces(int count) {
    while (count--) {
        (void) printf(" ");
    }
}

void printNStars(int count) {
    while (count--) {
        (void) printf("*");
    }
}

应该很容易添加例外。

printNSpaces()printNStars()非常相似,可以合并为一个通用函数void printN(char c, int count),但之后您将无法使用所需的printf(" ")printf("*")陈述。