无法在C中每行打印5个双数组元素

时间:2017-09-10 03:05:05

标签: c arrays formatting printf output

我一直在为学校做作业,基本上我们正在创建2个随机双打阵列,然后使用3种不同的算法对它们进行排序并打印结果。输出需要每行打印5个元素。

我有这段代码:

    //print sorted arrayB
for (i = 0; i < size; i++)
{
    printf ("%.1lf  ", arrayB[i]);
    if (i % 5 == 0 && i > 0)
    {
        printf ("\n");
    }
}

其中所有变量都是在排序之前定义的,每次输出都是这样的:

1.0  2.0  3.0  4.0  5.0  6.0
7.0  8.0  9.0  10.0 11.0
12.0 13.0 14.0 15.0 16.0
17.0 18.0 19.0 20.0 21.0
etc...

我不明白为什么它会在最上面的行中打印6个元素,而在其他所有元素中打印5个元素。非常感谢任何帮助!

4 个答案:

答案 0 :(得分:0)

您需要更新\n条件,如下所示 -

if ((i+1) % 5 == 0)
    {
        printf ("\n");
    }

i % 5会在索引5,10,15..之后产生换行符。这是你的情况,你在索引5有6,在索引10有11。 相反,你需要在4,9,14..处休息。这些都由(i+1)覆盖。

答案 1 :(得分:0)

只需手动为您的条件编写评估:

if (i % 5 == 0 && i > 0)

i  result
0  false
1  false
2  false
3  false
4  false
5  true
6  false

现在我们可以看到它是假的5次,然后是真的,这使得它打印换行符,但只有在你打印了这个号码之后!

所以你需要稍微重新排列你的逻辑,但条件是正确的。

答案 2 :(得分:0)

重点在于&& i > 0语句的if部分。如果你删除它,这将是输出:

1.0
2.0  3.0  4.0  5.0  6.0
7.0  8.0  9.0  10.0 11.0
12.0 13.0 14.0 15.0 16.0
17.0 18.0 19.0 20.0 21.0
etc...

通过排除零,您已阻止在第一个数字后打印换行符,请参阅?

解决方案是将i索引移动一个,如下所示:

if ((i + 1) % 5 == 0)
{
    printf ("\n");
}

现在你甚至不需要&& i > 0部分,因为i + 1永远不会为零。

答案 3 :(得分:0)

只需向i添加1(因此条件i> 0,变得不必要),这将解决。这是因为在你施加的条件下,对于第一次换行(\ n),它必须从0到5,为此你必须重复循环6次,所以在第一次换行时它显示6个数字,而不是5个

像这样:

#include <stdio.h>
#define SIZE 25

int main() {
 int i, arrayB[SIZE] = {0};
 for (i = 0; i < SIZE; i++)
 {
     printf ("%.1lf  ", arrayB[i]);
     if ((i+1) % 5 == 0)
     {
         printf ("\n");
     }
 }
return 0;
}