-2

我是一名新的 CS 学生,很难理解二维数组。现在我只是想一次打印出 1 行。

这是我的代码

#include <stdio.h>

#define N 3

int main(void)

{
    int array[N][N], i, j, rows[N], cols[N];


    for(i=0;i<N;i++)
    {
        printf("Enter row %d: ", i+1);
        for(j=0;j<N;j++)
        scanf("%d", &array[i][j]);
    }
    printf("The 5 rows you entered are: \n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("%d", array[i][j]);
            printf("\n");
        }
    }
    printf("\n");
    return 0;
}

我想让程序打印出来:

1 2 3
1 2 3
1 2 3

如果我添加\n它会打印出来:

1\n
2\n
3\n
1\n
2\n
3\n
1\n
2\n
3\n

想象一下 \n 是屏幕打印的内容,我试图代表代码打印出来的内容。我无法让这个框准确地打印出我正在输入的内容。它不会让我一遍又一遍地按 Enter 来表示命令屏幕上的实际内容。

没有/n它打印出来

123123123

我也在尝试添加行和列。我设法找到了一些代码,并且理解了大部分代码,除了一行。这是代码。

#include <stdio.h>

int main(void)
{
    int i, j, array[5][5], rows[5],cols[5];

    for(i=0;i<5;i++)
    {
        printf("Enter row %d: ", i+1);
        for(j=0;j<5;j++)
            scanf("%d", &array[i][j]);
    }
    **for(i=0;i<5;rows[i]=cols[i]=0,i++);**
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            rows[i]=rows[i]+array[i][j];
            cols[j]=cols[j]+array[i][j];
        }
    }
    printf("\nRow Totals:    ");
        for(i=0;i<5;i++)
    printf("%d\t", rows[i]);
    printf("\nColumn Totals: ");
    for(i=0;i<5;i++)
        printf("%d\t", cols[i]);
    printf("\n");

    return 0;
}

for(i=0;i<5;rows[i]=cols[i]=0,i++);
是行我不明白。首先,我不是很懂rows[i]=cols[i]=0,i++。其次,我不明白为什么后面有一个分号。我以为 for 语句没有使用分号,但是如果没有这一行,或者没有分号,程序就无法正常工作。当我尝试在没有这行代码的情况下使用它时,它给了我疯狂的答案,我假设是因为数组中的元素未设置为 0,而这行代码将数组的元素设置为 0。有人可以给我另一行代码对 C 语言相对较新的人来说可能更容易理解?也许向我解释为什么它使用分号?

4

3 回答 3

4

我想让程序打印出来: 1 2 3\n 1 2 3\n 1 2 3\n

做:

for(i=0;i<N;i++)
{
    for(j=0;j<N;j++)
    {
        printf("%d", array[i][j]);

    }
    printf("\n");
}


**for(i=0;i<5;rows[i]=cols[i]=0,i++);** 

肯定是语法错误。我猜你添加了 ** 来标记声明。然而,

for(i=0;i<5;rows[i]=cols[i]=0,i++);

是有效的 C 语句。一个for循环可以拆分为形式

for(initilization;condition;increment)

分号分隔 for 循环的三个部分。在您的情况下,for循环增量部分使用逗号进一步划分为多个语句,如下所示。

for(initialization;condition;do something useful here, update condition variable);

代码的目的是在实际找到总和之前将行和列总和初始化为零。注意增量部分中的逗号。它允许您添加多个语句。同样,您可以使用逗号进行多个初始化或多个条件。

for 循环后面的分号是一个序列点在这里,请注意您没有用于 for 循环的语句/复合语句。用简单明了的语言,分号告诉 for 循环什么都不做。但是您在本身很智能的 for 循环内间接将行和列总和初始化为零。

很明显,用法不是很直接。如果你不理解这类陈述,我建议你阅读一本好的 C 编程书籍。

于 2016-04-13T03:19:19.480 回答
2

for 循环有四个部分。你可能习惯于这样的循环:

for (int i = 0; i < 10; i++)
{
    printf("Hello!");
}

或者

for (int i = 0; i < 10; i++)
    printf("Hello!");

第一部分(设置)“int i = 0”在循环开始时运行。第二部分(测试表达式)“i < 10”是条件,在每次迭代之前检查,如果结果为假则结束循环。第三部分(增量)“i++”在每次迭代结束时运行,并且不进行评估。第四部分(主体)在第二部分之后第三部分之前运行。

在 for 循环的设置和增量部分,您可以使用逗号分隔多个语句。在测试表达式中使用逗号是没有意义的,因为它需要评估为真或假。在正文中使用逗号也是没有意义的,因为您可以在那里使用分号。

没有理由不能使用循环本身为您完成工作。在您提供的示例中:

 for(i=0;i<5;rows[i]=cols[i]=0,i++);

您已经了解循环在做什么(将 rows 和 cols 数组中的所有值设置为 0。)它只是在循环的增量部分中执行,而不是在循环的主体中执行。它还利用了赋值操作计算为被赋值的值这一事实。因此,“cols[i] = 0”的计算结果为“0”,然后将 rows[i] 分配给它。

但是,for 循环始终将下一条语句视为其主体。如果你想告诉循环不做任何事情,那么你需要在循环之后放置一个空语句(一个前面没有任何内容的分号),以便它知道不做任何其他事情。

如果您删除分号,那么它将假定下一行是循环体,这会产生以下行为:

for(i=0;i<5;rows[i]=cols[i]=0,i++)
{
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            rows[i]=rows[i]+array[i][j];
            cols[j]=cols[j]+array[i][j];
        }
    }
}

对于您的问题的实际解决方案,请使用 sjsam 的答案。

于 2016-04-13T03:40:28.753 回答
1

对输出逻辑的微小调整

printf("The %d rows you entered are: \n", N);
for(i=0;i<N;i++)
{
    for(j=0;j<N;j++)
    {
        if (j != 0)
        {
            putc(' '); /* add space if we are not the first column */
        }
        printf("%d", array[i][j]);
    }
    putc ('\n'); /* new line after each row is complete */
}
printf("\n");
于 2016-04-13T08:41:42.777 回答