如何在C中用数组表示的矩阵向后打印列?

问题描述 投票:0回答:1

我正在研究这样从输入文件获取矩阵的程序。其中第一行代表矩阵的参数-row,cols,0用于更改奇数cols,1用于更改偶数cols

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)并向后打印它,所以如果我有3x3矩阵,它将看起来像这样(1 4 7),它看起来像是:

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 3|4 5 6|7 8 9  ----> 7 2 9|4 5 6|1 8 3

好,我刚刚发现了有关地图索引的信息,所以现在数组中的每个位置都表示为matrix [j +(i * r)],因此例如上述3x3矩阵中的第一个位置将是这样的:matrix [1+( 0 * 3)],第四个pos是矩阵[1+(1 * 3)]等...

所以现在我的问题是如何在列中索引相反的位置。

代码更新:

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

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

}
}
c file matrix
1个回答
0
投票

在两种情况下,您都希望将矩阵[i]替换为矩阵中更远的元素。

n n
1 2 3
4 5 6
7 8 9

在此示例中,要替换奇数值,应切换1和7。索引之间的差异为6。但这取决于矩阵尺寸。通用公式为:

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

其中r是您所在的行。由于要翻转矩阵,因此您只需要进行最多(n-n%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 
© www.soinside.com 2019 - 2024. All rights reserved.