C-用星星打印帐篷形状时的错误输出



我正在尝试使用星号星星打印出空心的开放帐篷形状"*。该代码使用两个用于循环,第一个对行,另一个用于列。

以下是我的代码:

void printTent(int n)
{   
    int j = 1;
    int i = 1;
    if (n == 1) {
        printf("*");
    } else {
        for(i = 0; i < n; i++) {
            for(j = 0; j < n; j++) {
                printf(" ");
            }
            if(j == n) {
                printf("*");
                for(j = 1; j <= n; j++) {
                    printf(" ");
                }
            }
        }
    }
}

int main()
{
    printTent(4);
}

获得的输出:

    *        *        *        *    

所需的输出:

   *
  * *
 *   *
*     *

我认为您不需要

if (n == 1) {
    printf("*");
}

我们可以在您在else部分中所写的内容中照顾它。

对于n=4,每行开始时要打印的空间数为3、2、1&amp;0。

您似乎正在尝试使用第一个内部循环来实现这一目标。但是

for(j = 0; j < n; j++) {
    printf(" ");
}

将始终打印n空间。我们需要减少1在外循环的每次迭代上打印的空间数量。

来到您的第二个循环,

for(j = 1; j <= n; j++) {
    printf(" ");
}

这有类似的问题,只有差异是打印的空间数量的增加。

尝试这样的东西

void printTentNMMod(int n)
{
    int j;
    int i;
    for(i = 0; i < n; i++) {
        for(j = i; j < n; j++) {
            printf(" ");
        }
        printf("*");
        if(i!=0)
        {
            for(j=0; j<2*(i-1)+1; ++j)
            {
                printf(" ");
            }
            printf("*");
        }
        printf("n");
    }
}

另外,您可以将其缩短为

void printTent(int n)
{
    int j;
    int i;
    for(i = 0; i < n; i++) {
        printf("%*c", n-i, '*');
        if(i!=0)
        {
            printf("%*c", 2*i, '*');
        }
        printf("n");
    }
}

%*c中的*将设置由%c打印的字符占用的位置数。

我已经完成了,我已经写了注释。

void printTent(int n)
{
    int j = 1;
    int i = 1;
    if (n == 1) {
        printf("*");
    }
    else {
        for (i = 0; i < n; i++) {
            for (j = 0; j < n -i; j++) {// you should use n-i instead of n because the number of spaces is decreasing
                printf(" ");
            }
            if (j == n-i) { //
                printf("*");
                for (j = 1; j <= i * 2 - 1; j++)//this loop outputs spaces between two "*"
                {
                    printf(" ");
                }
                if (i != 0)//the first line only needs one "*"
                    printf("*");
                printf("n"); //Line breaks
            }
        }
    }
}

另一种方式。

#include <stdio.h>
int main() {
    int i, j;
    int height = 5;
    for(i = height; i > 0; i--) {
        for(j = 1; j < height * 2; j++) {
            if(j == i || j == height * 2 - i)
                printf("*");
            else
                printf(" ");
        }
        puts("");
    }
    return 0;
}

输出

    *    
   * *   
  *   *  
 *     * 
*       *

最新更新