Во-первых, вам нужно инициализировать 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;
}