Изменить столбец на строку после заданного числа N - PullRequest
0 голосов
/ 08 января 2019

Мне нужно изменить столбцы матрицы на строки после заданного числа N. Например, если N = 3, то строка равна n * 2, заданной в этом упражнении. Теперь после 3-го столбца каждый второй столбец должен быть строкой. Я знаю, как транспонировать матрицу, но я запутался, как это сделать после заданного N. Код:

#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;
}

Пример для n = 3.

1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18

Мне нужно достичь

1 2 3
7 8 9
13 14 15
4 5 6
10 11 12
16 17 18

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Первый квадрат матрицы (массива) остается неизменным, поэтому оба массива имеют одинаковое начало. Следующая часть сдвигается на 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;
}
0 голосов
/ 08 января 2019

Во-первых, вам нужно инициализировать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...