我需要将矩阵列更改为给定数字N之后的行。例如,如果N = 3,则此练习中的行为n * 2。现在,在第3列之后,每隔一列就需要排成一行。我知道如何转置矩阵,但在给定N后如何处理它会感到困惑。 代码:
Table2
n = 3的示例。
SELECT
t1.id,
t1.category,
COALESCE(t2.code, 'OTH') code,
t2.id
FROM
Table1 t1
LEFT JOIN Table2 t2 ON t1.category = t2.parent_cat
我需要实现
#include <stdio.h>
int main() {
int n;
int a[n][n * 2];
int b[n * 2][n];
scanf("%d", &n);
for(int i = 0;i < n; i++) {
for(int j = 0; j < n * 2; j++) {
scanf("%d", a[i][j]);
}
}
for(int i = 0; i < n * 2; i++) {
for(int j = 0; j < n; j++) {
a[i][j] = b[j][i];
}
}
return 0;
}
答案 0 :(得分:2)
矩阵(数组)的第一个平方保持不变,因此两个数组的起点相同。后面的部分向左移动n个单位,向下移动n个单位,因此以下代码应可帮助您解决问题:
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
b[i][j] = a[i][j];
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
b[i + n][j] = a[i][j + n];
}
}
由于两组for循环具有相同类型的变量更改,因此可以像@Chris Turner一样将它们收敛为一个。 整个代码应如下所示:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int a[n][n * 2];
int b[n * 2][n];
for(int i = 0;i < n; i++) {
for(int j = 0; j < n * 2; j++) {
scanf("%d", &a[i][j]);
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
b[i][j] = a[i][j];
b[i + n][j] = a[i][j + n];
}
}
return 0;
}
答案 1 :(得分:1)
首先,您需要先初始化n
,然后再使用它。在下面的代码中,n
没有定义的值,因此使用它来定义数组的大小会导致未定义的行为。
int n;
int a[n][n * 2];
int b[n * 2][n];
您可以将数组定义移动到设置n
第二,当使用scanf
读入int
时,您必须传递一个指向该变量的指针,因此这一行是错误的,您的编译器应该对此发出警告
scanf("%d", a[i][j]);
应该是
scanf("%d", &a[i][j]);
如果您想从a
复制到b
,则需要正确执行操作
您已经从b
复制到a
,并且随着i
上升到n*2
和a
第一个索引就是n
。
a[i][j] = b[j][i]
你想要的就是这个。
b[i][j] = a[j][i]
但这并不能解决您的问题,因为这只是换位,您正尝试将矩阵分成两半并以不同的方式堆叠。因此,首先需要像这样将第一个n
和n
个元素从a
复制到b
。
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
b[i][j] = a[i][j];
然后复制第二个块,您可以使用相同的循环并以n
b[i+n][j] = a[i][j+n];
所有这些更改之后,您的代码应如下所示:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int a[n][n * 2];
int b[n * 2][n];
for(int i = 0;i < n; i++) {
for(int j = 0; j < n * 2; j++) {
scanf("%d", &a[i][j]);
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
b[i][j] = a[i][j];
b[i+n][j] = a[i][j+n];
}
}
return 0;
}