3

我正在练习在以下结果中生成星星,但我失败了。

1.

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

2.

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

对于我在这种情况下的逻辑,我认为可以通过在循环上使用宽度对齐控制来生成,但结果表明它是错误的......

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

使用代码:

    int i,j;
    char ch='*';//created for using of alignment
    for(i=1;i<=5;i++)
    {
        for(j=5;j>=i;j--)
        {
            printf("%5c", ch);
        }
        printf("\n");
    }

对于我的逻辑,我假设可以通过使用对齐方法 (%5c) 生成。但是,结果与我预期的不一样。

我已经成功生成了星星,如下图:

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

带代码:

    int i,j;
    for(i=1;i<=5;i++)
    {
        for(j=5;j>=i;j--)
        {
            printf("*");
        }
        printf("\n");
    }

我对制作模式1和2的方法有错误的想法吗?还是错误编码的正确思维?

4

3 回答 3

2

要对齐,您实际上可能正在绘制一个矩形。在每一行中,您输出一系列星号(可能为空,即零星号)和一系列空格(可能为空,即无空格)。

它是该(condition) ? (value_if_true) : (value_if_false)构造的理想应用。您总是绘制完整的矩形,而图案只会因条件而变化:“这是空格还是星号?”

int i, j;
for(i=1;i<=5;i++)
{
    for(j=1;j<=5;j++)
    {
        // This generates a full rectangle
        // printf("%c", '*');
        // This generates an empty rectangle ;-)
        // printf("%c", ' ');
        // This generates a triangle
        printf("%c", (i >= j) ? '*' : ' ');
    }
    printf("\n");
}

有两个自上而下的三角形,由条件 (i >= j) 或 (i <= j) 控制;要水平翻转三角形,请将递增序列替换为递减序列,即 (6-j) 而不是 (j):

   when j is       6-j is
       1              5
       2              4
      ...            ...
       5               1

所以测试是((6-j) <= i)

于 2012-10-02T06:19:25.353 回答
0

您可以尝试以下两种模式的理论:

假设一个三角形由一个由空间组成的三角形和另一个由星组成的三角形组成。在一个 for 循环中,您可以创建另外两个 for 循环来控制两个三角形。

尝试我建议的方法,如果你不成功,让我知道我会帮助......

于 2012-10-02T05:55:27.540 回答
0

Chirag 没有错,但你不需要三个 for 循环,只需要两个。

接受 Chirag 的建议:

假设一个三角形由一个由空间组成的三角形和另一个由星组成的三角形组成。

现在,将每一行独立地视为一些星号(和空格),它们相对于行号减少/增加。

int i, j;
for (i = 0; i < 5; i++)
{
    printf("\n%*s", i, " "); // Print i spaces
    for (j = i; j < 5; j++)
    {
        printf("*");
    }
}

这会给你

*****
 ****
  ***
   **
    *
于 2012-10-02T06:08:07.280 回答