Как напечатать обратный столбец матрицы, представленной массивом в C? - PullRequest
1 голос
/ 14 января 2020

Я работаю над программой, которая берет матрицу из входного файла следующим образом. где первая строка представляет параметры матрицы - строки, столбцы, 0 для изменения нечетных столбцов и 1 для изменения четных столбцов

5 5 0
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

, и теперь мне нужно взять нечетные кломун (пример: 7 4 1) и распечатать его в обратном направлении, поэтому это будет выглядеть так (1 4 7), если бы у меня была матрица 3x3, она выглядела бы так:

1 2 3
4 5 6
7 8 9

выходная матрица с нечетными столбцами, напечатанными назад

7 2 9
4 5 6
1 8 3

, и это код, который у меня есть до сих пор

int r = 0, c = 0, odds = 0,n = 0,i,j;
FILE *fp,*fp2;
fp = fopen(argv[1],"r");
fp2 = fopen(argv[2],"w");
if(!fp){
    printf("file doesnt exist\n");
}
if(!fp2){
    printf("file doesnt exist\n");
}
fscanf(fp,"%d %d %d", &r, &c, &odds);
n = r *c;
int* matrix= (int*)malloc(r*c* sizeof(int));

for(int i = 0; i < n; i++)
{
    fscanf(fp,"%d",&matrix[i]);
}

if(odds == 0){
for(int i = 0; i < n; i++){

    if(i%2==0){
    matrix[i] = i;
    }
}
}else if(odds == 1){
   for(int i = 0; i < n; i++){

    if(i%2!=0){
    matrix[i] =  ;
    }
} 
}




for(i = 0;i < n; i++)
{    
        if(i % s == 0 ){
        fprintf(fp2,"\n");
        }
        fprintf(fp2,"%d ",matrix[i]);



}
    fclose(fp);
    fclose(fp2);
return 0;

}

и моя проблема заключается в обратном использовании cols, что должно произойти здесь

if(odds == 0){
for(int i = 0; i < n; i++){

    if(i%2==0){
    matrix[i] = i;
    }
}
}else if(odds == 1){
   for(int i = 0; i < n; i++){

    if(i%2!=0){
    matrix[i] =  ;
    }
} 
}

1-й, если для печати четные столбцы в обратном направлении и 2-й - для нечетных столбцов, и, как вы можете видеть, матрица в моей программе представлена ​​обычным массивом, который был не моей идеей, а учителями, поэтому он должен работать следующим образом

1 2 3|4 5 6|7 8 9  ----> 7 2 9|4 5 6|1 8 3

Хорошо, я только что узнал об индексировании карты, так что теперь каждая позиция в массиве представлена ​​в виде матрицы [j + (i * r)], поэтому, например, первая позиция в матрице 3x3 выше будет выглядеть примерно так: matrix [1+ (0 *) 3)], 4-е место будет матрица [1+ (1 * 3)] et * 102 7 * ...

Итак, теперь мой вопрос заключается в том, как проиндексировать противоположное положение в столбце.

обновление кода:

for(int i = 0; i < r; i++){

    for(int j = 1; j < c; j++){
        if(i%2!=0){
            matrix[j+i*r] = ....;
    }

}
}

1 Ответ

0 голосов
/ 14 января 2020

В обоих случаях вы хотите заменить матрицу [i] элементом, расположенным выше в матрице.

n n
1 2 3
4 5 6
7 8 9

В этом примере для замены нечетных значений следует переключать 1 и 7. Разница в показателях составляет 6. Однако это зависит от размеров матрицы. Общая формула будет выглядеть так:

n^2 - n - r*(2n) + i

где r - строка, в которой вы находитесь. Так как вы переворачиваете матрицу, вам нужно только сделать строки до (nn% 2) /2.

Вот некоторый python код, чтобы уточнить

for i in range(0,int((matrixdim-matrixdim%2)/2)*matrixdim):     
    if ((i-r)%2) == 0:
        temp = matrix[i]
        matrix[i] = matrix[matrixdim*matrixdim - matrixdim - r*2*matrixdim + i]
        matrix[matrixdim*matrixdim - matrixdim - r*2*matrixdim + i] = temp

    if ((i+1)%matrixdim) == 0:
        r += 1

Используя i, j запись

for i in range(0,int((matrixdim-matrixdim%2)/2)):
    for j in range(0, matrixdim):
        pos = j + matrixdim*i
        temp = matrix[pos]

        if j%2 == even:
            matrix[pos] = matrix[matrixdim*matrixdim - matrixdim - i*2*matrixdim + pos]
            matrix[matrixdim*matrixdim - matrixdim - i*2*matrixdim + pos] = temp 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...