如何在[C]中编写正确的循环

时间:2016-09-23 22:00:36

标签: c

我需要使用"循环"显示10个数字。像这样:

1 
2 3
4 5 6 
7 8 9 10

我设法使用下面的代码实现它。但我觉得必须有一个更简单的方法来做到这一点。如果我需要做同样的模式,但有1000个数字怎么办?这将是很多代码。

#include <stdio.h>

int main(){

    int x;
    x=1;

    do {
        printf("%i \n", x);
        x++;
    }   while (x<=1);

        do {
            printf("%i ", x);
            x++;

    }   while (x<=3); {
        printf("\n");
    }

    do {
        printf("%i ", x);
        x++;

    }   while (x<=6); {
        printf("\n");
    }
    do {
        printf("%i ", x);
        x++;

    }   while (x<=10); {
        printf("\n");
    }


    return 0;
}

6 个答案:

答案 0 :(得分:3)

为每一行写一个单独的循环是疯狂的。如果你一遍又一遍地做同样的事情而略有变化,这意味着你需要另一个包裹循环。这应该只需要一对for循环:

unsigned maxval = ...;
for (unsigned rowlen = 1, val = 1; val <= maxval; ++rowlen) {
    for (unsigned item = 0; item < rowlen && val <= maxval; ++item) {
        printf("%u ", val++);
    }
    printf("\n");
}

答案 1 :(得分:3)

你可以用一个循环来完成。

void print_tri(unsigned int max_val) {
    unsigned int row_lim = 1;
    unsigned int row_len = 0;

    for (unsigned int i = 1; i <= max_val; i++) {
        printf("%u ", i);
        if (++row_len == row_lim) {
            putchar('\n');
            row_lim++;
            row_len = 0;
        }
    }
}

答案 2 :(得分:1)

如果你这样做是为了练习do,那么在使用这段代码的情况下,如果你不能使用@ ShadowRanger的答案,因为我觉得这对于这种情况更好

int x,y,counter, row;
row = 1;
counter = 0;
y=10;
x=1;

do {
    do { 

    counter --;
    printf("%i ", x);
    x++;

    } while(counter > 0);
        printf("\n");
        row++;
        counter = row;

}   while (x<=y);

每次第一次执行while循环时,row变量会增加1,以检查您当前所在的行,然后将counter设置为您当前所在的行号要知道该行中将有多少个数字,x变量用于打印的数字,y变量用于打印多少个数字。

  

注意:此代码将完成缺少数字的任何行示例:   如果要打印4个数字,则代码将打印出来:   1   2 3   4 5 6   如果您不希望发生这种情况,请更改第一个执行条件   this:while(counter&gt; 0&amp;&amp; x&lt; = y);

答案 3 :(得分:1)

#include <stdio.h>

void main() {
    int row = 1;
    int column = 1;

    for (int i = 1; i <= 10; i++) {
        printf("%d", i);

        if (column == row) {
            printf("\n");
            row++;
            column = 1;
        }
        else {
            printf(" ");
            column++;
        }
    }
}

答案 4 :(得分:0)

有很多方法可以接近逻辑,一切都很好。这是指定一个b开始变量来控制间距逻辑(第一个没有,行前的其余部分之前是一个空格),并提供两个格式字符串(fmt1和{{1 }}) 以适应。代码增加fmt2 - 每行打印的值计数,直到达到c - 每行的计数数。

查看所有答案,如果您有任何疑问,请与我们联系:

n

示例使用/输出

#include <stdio.h>

int main (void) {

    /* i, b - begin, c - count, n - num per row */
    int i, b = 1, c = 0, n = 1;
    char *fmt1 = "%d", *fmt2 = " %d";

    for (i = 1; i < 11; i++) {
        printf (i == b ? fmt1 : fmt2, i);
        c++;
        if (c == n) {
            b = i + 1, c = 0, n++;
            putchar ('\n');
        }
    }

    return 0;
}

答案 5 :(得分:0)

感谢大家。我正在寻找的答案是Marcel Jacques Machado和Ivan发布的答案。我只是一个初学者。练习是练习嵌套循环。另一篇文章也很有帮助。