给定数字N后将列更改为行

时间:2019-01-08 10:49:12

标签: c

我需要将矩阵列更改为给定数字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;
}

2 个答案:

答案 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*2a第一个索引就是n

a[i][j] = b[j][i]

你想要的就是这个。

b[i][j] = a[j][i]

但这并不能解决您的问题,因为这只是换位,您正尝试将矩阵分成两半并以不同的方式堆叠。因此,首先需要像这样将第一个nn个元素从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;
}