【问题标题】:C program to print an irregular star pattern打印不规则星形图案的C程序
【发布时间】:2014-10-05 22:10:58
【问题描述】:

我正在尝试编写一个制作星星图案的程序。最后一行真的把我绊倒了。我必须只使用 printf("*"); printf(" "); printf("\n"); 语句来编写代码。我想用 for 循环和 if 语句来完成这个。

它应该是这样的:

* - *前5个空格 * * - *前4个空格 * * * - *前3个空格 * * * * * * - * 前有 0 个空格

这是我迄今为止尝试过的:

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 语句以使这种模式起作用?

【问题讨论】:

  • 程序应该是静态的还是你想改变打印的行数?为什么它会从 5、4、3 下降到 0?
  • 内联发布代码以保持 SO 独立于其他网站。
  • 代码是静态的。我希望前 3 行遵循一个模式,而第四行是该模式的一个例外。我想我可以用 if 语句来完成。

标签: c ascii-art


【解决方案1】:

在开始任何事情之前,先看看您需要实现的算法。假设我们要制作一个大小为 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");
}

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

【讨论】:

    【解决方案2】:

    你试图在一个函数中一次做太多事情 (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("*") 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 2022-06-22
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      相关资源
      最近更新 更多