使用for循环在C编程中打印特定模式

时间:2015-04-02 04:30:54

标签: c

嗨,我需要一些帮助来弄清楚如何编写这个模式程序。控制台要求输出许多行,并打印出由星形构成的上升三角形,其中每条前进线比前一条线多两颗星,然后是一个下降三角形,其中每条前进线比前一条线少两颗星。这可能不是最好的解释,但这是我基本上需要得到的一个例子:

输入行数:6

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

另一个奇数的例子:

输入行数:7

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

我一直在论坛上寻找这个具体的例子,但我还没找到它

3 个答案:

答案 0 :(得分:2)

这是我的代码:

#include <stdio.h>

int main(int argc, char** argv){
    int rows;
    int limit;
    int twiceFlag = 0;
    char c = '*';
    int i,j;
    printf("enter the number of rows:");
    scanf("%d", &rows);

    if (rows % 2 == 0){
        twiceFlag = 1;
        limit = rows / 2;
    }
    else{
        limit = rows / 2 + 1;
    }

    /*Logic to print the Stars*/
    for (i = 1; i <= limit; i++){
        printf("%c", c);
        for (j = 1; j < i; j++){
            printf("%c%c", c, c);
        }
        printf("\n");
    }
    if (twiceFlag == 1){
        printf("%c", c);
        for (j = 1; j < limit; j++){
            printf("%c%c", c, c);
        }
        printf("\n");
    }
    limit -=2;
    for (i = limit; i >= 0; i--){
        printf("%c", c);
        for (j = i; j > 0; j--){
            printf("%c%c", c, c);
        }
        printf("\n");
    }

    return 0;
}

答案 1 :(得分:2)

试试此代码

int main(){    
    int row=6,n;                //enter number of rows
    n=row/2;
    for(int i=n; i>=-n;i--)    //if row is 6, `i` will work for 3 to -3
    {
        if(row%2==0 && i==0)    //if number is even, shouldn't work for i=0
            i--;
        for(int j=1; j<=(2*(n-(i<0?-i:i)))+1; j++){
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

答案 2 :(得分:2)

对于N行数据,您将有一个从0到N-1的循环索引。通过评估M = min(i, N-1-i),您可以获得所需的“上下”形状。对于N = 6,这将生成序列0,1,2,2,1,0;对于N = 7,它生成0,1,2,3,2,1,0。在给定的恒星行中,您打印m = 2 * M + 1个星。因此:

#include <stdio.h>

static inline int min(int x, int y) { return (x < y) ? x : y; }

int main(void)
{
    int N;
    if (scanf("%d", &N) == 1)
    {
        for (int i = 0; i < N; i++)
        {
            int m = 2 * min(i, N - 1 - i) + 1;
            for (int j = 0; j < m; j++)
                putchar('*');
            putchar('\n');
        }
    }
    return 0;
}

关键技巧是M的表达式。

请注意,代码直接通过测试来自scanf()的返回值来检查有效输入,并通过不为N的零值或负值打印任何内容来间接检查。它没有对N进行合理性检查,但可能应该这样做。

如果编译器不支持C99或C11,则可以使用宏代替内联函数,并在循环外声明循环索引。