在 C 中输入到多数组
Input to Multi-Array in C
我正在尝试将用户输入分配给一个数组;然而,下面的程序只获取每行输入中的第一个元素。这个程序的最终目标是找到整数的对角线和 [=30=] 它们的差的绝对值。
示例输入(注意第一个数字给出了行数和列数(方阵):
输入:
3
11 2 4
4 5 6
10 8 -12
输出:
预期 = 15
实际 = 10
我意识到问题在于数组的设置方式。如果我打印数组,我得到:111555999
任何 hints/help 将不胜感激。
int main() {
int n, i, c, multi_array[200][200], sum1 = 0, sum2 = 0;
scanf("%i", &n); //N = number of rows and number of columns (square 2D array)
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
scanf("%d ", &multi_array[c][i]); //enter integers to store in array
}
}
for (i = 0; i != n; i++) {
sum1 += multi_array[i][i]; //add up top left to bottom right diagonal
}
for (i = 0; i != n; i++) {
sum2 += multi_array[i][n-i]; //add up top right to bottom left diagonal
}
printf("%i", abs(sum1 - sum2)); //print absolute value of the difference between diagonals
return 0;
}
你明显越界了:
for (i = 0; i != n; i++) {
sum2 += multi_array[i][n-i]; //add up top right to bottom left diagonal
}
当 i
等于 0 时,表达式 n-i
将等于 n
,但数组的范围是从 0 到 n-1。该代码将读取未初始化的值并导致未定义的行为。
第二个数组索引要少1
你的主要问题是出界:
for (i = 0; i != n; i++) {
sum2 += multi_array[i][n - i]; // when i is 0, th
}
当i = 0时,你正在访问multi_array[0][3],当N = 3时,这是越界的。
所以改成这样:
multi_array[i][n - i - 1]
你应该像这样阅读你的数组:
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
scanf(" %d ", &multi_array[i][c]);
}
}
因为 C 以行优先顺序存储它的数组。您所拥有的以列优先顺序存储数组。这并没有错,但只有当你真的不得不这样做时,你才会这样做。
最后,再次将代码的输入部分更改为:
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
scanf("%d", &multi_array[i][c]);
}
}
因此您必须准确输入您需要的内容。使用您的初始代码,我必须在完成输入过程后输入一个额外的随机数。
最后但并非最不重要的是,我发布了整个代码,其中我写了一些额外的 printf()
,实际上是给程序员的,这样他就可以一步一步地看到他的代码是否按预期运行。
#include <stdio.h>
#include <stdlib.h> /* abs */
int main() {
int n, i, c, multi_array[200][200], sum1 = 0, sum2 = 0;
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
scanf("%d", &multi_array[i][c]);
}
}
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
printf("|%d|", multi_array[i][c]);
}
printf("\n");
}
for (i = 0; i != n; i++) {
sum1 += multi_array[i][i];
}
printf("sum1 is %d\n", sum1);
for (i = 0; i != n; i++) {
sum2 += multi_array[i][n - i - 1];
}
printf("sum2 is %d\n", sum2);
printf("%i", abs(sum1 - sum2));
return 0;
}
输出:
3
11 2 4
4 5 6
10 8 -12
|11||2||4|
|4||5||6|
|10||8||-12|
sum1 is 4
sum2 is 19
15
我正在尝试将用户输入分配给一个数组;然而,下面的程序只获取每行输入中的第一个元素。这个程序的最终目标是找到整数的对角线和 [=30=] 它们的差的绝对值。
示例输入(注意第一个数字给出了行数和列数(方阵):
输入: 3
11 2 4
4 5 6
10 8 -12
输出: 预期 = 15 实际 = 10
我意识到问题在于数组的设置方式。如果我打印数组,我得到:111555999
任何 hints/help 将不胜感激。
int main() {
int n, i, c, multi_array[200][200], sum1 = 0, sum2 = 0;
scanf("%i", &n); //N = number of rows and number of columns (square 2D array)
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
scanf("%d ", &multi_array[c][i]); //enter integers to store in array
}
}
for (i = 0; i != n; i++) {
sum1 += multi_array[i][i]; //add up top left to bottom right diagonal
}
for (i = 0; i != n; i++) {
sum2 += multi_array[i][n-i]; //add up top right to bottom left diagonal
}
printf("%i", abs(sum1 - sum2)); //print absolute value of the difference between diagonals
return 0;
}
你明显越界了:
for (i = 0; i != n; i++) {
sum2 += multi_array[i][n-i]; //add up top right to bottom left diagonal
}
当 i
等于 0 时,表达式 n-i
将等于 n
,但数组的范围是从 0 到 n-1。该代码将读取未初始化的值并导致未定义的行为。
第二个数组索引要少1
你的主要问题是出界:
for (i = 0; i != n; i++) {
sum2 += multi_array[i][n - i]; // when i is 0, th
}
当i = 0时,你正在访问multi_array[0][3],当N = 3时,这是越界的。
所以改成这样:
multi_array[i][n - i - 1]
你应该像这样阅读你的数组:
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
scanf(" %d ", &multi_array[i][c]);
}
}
因为 C 以行优先顺序存储它的数组。您所拥有的以列优先顺序存储数组。这并没有错,但只有当你真的不得不这样做时,你才会这样做。
最后,再次将代码的输入部分更改为:
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
scanf("%d", &multi_array[i][c]);
}
}
因此您必须准确输入您需要的内容。使用您的初始代码,我必须在完成输入过程后输入一个额外的随机数。
最后但并非最不重要的是,我发布了整个代码,其中我写了一些额外的 printf()
,实际上是给程序员的,这样他就可以一步一步地看到他的代码是否按预期运行。
#include <stdio.h>
#include <stdlib.h> /* abs */
int main() {
int n, i, c, multi_array[200][200], sum1 = 0, sum2 = 0;
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
scanf("%d", &multi_array[i][c]);
}
}
for (i = 0; i < n; i++) {
for (c = 0; c < n; c++) {
printf("|%d|", multi_array[i][c]);
}
printf("\n");
}
for (i = 0; i != n; i++) {
sum1 += multi_array[i][i];
}
printf("sum1 is %d\n", sum1);
for (i = 0; i != n; i++) {
sum2 += multi_array[i][n - i - 1];
}
printf("sum2 is %d\n", sum2);
printf("%i", abs(sum1 - sum2));
return 0;
}
输出:
3
11 2 4
4 5 6
10 8 -12
|11||2||4|
|4||5||6|
|10||8||-12|
sum1 is 4
sum2 is 19
15