我是一名新的CS学生,我很难理解二维数组。现在我只想尝试一次打印出来。
这是我的代码
#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是屏幕正在打印的内容,我试图表示代码打印出来的内容。我无法让这个盒子打印出我正在输入的内容。它不会让我反复输入来代表命令屏幕上的实际内容。
没有打印出/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++
。第二,我不明白为什么之后有分号。我认为语句不使用分号,但如果没有这行,或没有分号,程序将无法正常工作。当我尝试使用它没有这行代码时,它给了我疯狂的答案,我假设因为数组中的元素没有设置为0,这行代码将数组的元素设置为0.有人能给我另一行代码对于C相对较新的人来说可能更容易理解?也许可以向我解释为什么它使用分号?
答案 0 :(得分: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循环的statement / compound-statement。在简单明了的语言中,分号表示for循环执行 nothing 。但是你在for循环中间接初始化行和列总和为零,而for循环本身就很聪明。
很明显,使用不是很直接。如果您不理解这些陈述,我建议您阅读一本好的C编程书。
答案 1 :(得分:2)
for循环有四个部分。你可能习惯于循环:
for (int i = 0; i < 10; i++)
{
printf("Hello!");
}
或
for (int i = 0; i < 10; i++)
printf("Hello!");
第一部分(设置),“int i = 0”,在循环开始时运行。 第二部分(测试表达式),“i&lt; 10”,是条件,在每次迭代之前检查,并且如果它评估为假则结束循环。 第三部分(增量),“i ++”,在每次迭代结束时运行,不进行评估。 第四部分(正文),在第二部分之后和第三部分之前运行。
在for循环的setup和increment部分中,您可以使用逗号分隔多个语句。在测试表达式中使用逗号是没有意义的,因为它需要评估为true或false。在身体中使用逗号也没有意义,因为你可以在那里使用分号。
没有理由不能使用循环本身来为您完成工作。 在您提供的示例中:
for(i=0;i<5;rows[i]=cols[i]=0,i++);
你已经理解了循环正在做什么(将rows和cols数组中的所有值设置为0.)它只是在循环的增量部分中进行,而不是在循环体中进行。它还利用了赋值操作求值为赋值的事实。因此,“cols [i] = 0”的计算结果为“0”,然后将行[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的答案。
答案 2 :(得分: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");