gpt4 book ai didi

c - 如何更改 C 中二维数组的内容?

转载 作者:行者123 更新时间:2023-11-30 16:19:26 25 4
gpt4 key购买 nike

我正在解决一个必须转置矩阵的问题。我传递了原始矩阵的地址,但是一旦我执行该函数,它就不会改变!

我尝试在转置函数中的矩阵前面添加*,认为它将指向整个二维数组,但它不起作用。

#include<stdio.h>
#include <stdlib.h>

void transpose(int *r,int *c, int **matrix);
void printMatrix(int r,int c, int **matrix){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++)
printf("%2d ",matrix[i][j]);
printf("\n");
}
}

int main() {

int **matrix;
int r =3;
int c =2;
matrix = (int**) malloc(r*sizeof(int*));
for(int i=0;i<r;i++)
matrix[i] = (int*) malloc(c*sizeof(int));

for(int i=0;i<r;i++){
for(int j=0;j<c;j++)
matrix[i][j] = (3*i+2*j)%8+1;
}
printf("Before transpose:\n");
printMatrix(r,c,matrix);

transpose(&r, &c ,matrix);

printMatrix(r,c,matrix);



return 0;
}

void transpose(int *r,int *c, int **matrix){
int newR = *c;
int newC = *r;
int **newMatrix;

newMatrix = (int**) malloc(newR*(sizeof(int*)));
for(int i=0; i<newR;i++)
newMatrix[i] = (int*) malloc(newC*(sizeof(int)));
for(int i=0; i<newR; i++)
for(int j=0;j<newC;j++)
newMatrix[i][j] = matrix[j][i];

*c = newC;
*r = newR;



matrix = (int**) malloc((*r)*sizeof(int*));
for(int i=0;i<*r;i++)
matrix[i] = (int*) malloc((*c)*sizeof(int));
for(int i=0; i<newR; i++){
for(int j=0;j<newC;j++){
matrix[i][j] = newMatrix[i][j];
}
printf("\n");
}
}

我有这个矩阵

1 3
4 6
7 1

并且想要得到

1 4 7 
3 6 1

但是我越来越

1 3 0
1 4 0

最佳答案

看起来您忘记做的实际上是使用转置矩阵。我所做的只是更改函数签名并返回您已经分配和操作的矩阵,然后我得到了您正在寻找的输出。

#include <stdio.h>
#include <stdlib.h>

int** transpose(int *r,int *c, int **matrix);

void printMatrix(int r, int c, int **matrix) {
for (size_t i = 0; i < r; ++i){
for (size_t j = 0; j < c; ++j) {
printf("%2d ",matrix[i][j]);
}

printf("\n");
}
}

int main()
{
int r = 3;
int c = 2;

int **matrix = calloc(sizeof(int*), r);

for (size_t i = 0; i < r; ++i) {
matrix[i] = calloc(sizeof(int), c);
}

for (size_t i = 0; i < r; ++i) {
for (size_t j = 0; j < c; ++j) {
matrix[i][j] = (3 * i + 2 * j) % 8 + 1;
}
}

printf("Before transpose:\n");
printMatrix(r, c, matrix);

int** newMatrix = transpose(&r, &c ,matrix);

printMatrix(r, c, newMatrix);

return EXIT_SUCCESS;
}

int** transpose(int *r, int *c, int **matrix) {
int newR = *c;
int newC = *r;

int **newMatrix = calloc((sizeof(int*)), newR);

for (size_t i = 0; i < newR; ++i) {
newMatrix[i] = (int*) malloc(newC*(sizeof(int)));
}

for (size_t i = 0; i < newR; ++i) {
for (size_t j = 0; j < newC; ++j) {
newMatrix[i][j] = matrix[j][i];
}
}

*c = newC;
*r = newR;

matrix = calloc(sizeof(int*), *r);

for (size_t i = 0; i < *r; ++i) {
matrix[i] = calloc(sizeof(int), *c);
}

for (size_t i = 0; i < newR; ++i) {
for (size_t j = 0; j < newC; ++j) {
matrix[i][j] = newMatrix[i][j];
}

printf("\n");
}

return newMatrix;
}

输出:

1 4 7
3 6 1

我改变了一些东西,特别是因为我更喜欢使用 calloc 而不是 malloc,因为它将新分配的内存归零,并且有一个专用参数所请求内存的大小,我认为从语义上讲这是一个更好的主意。

顺便说一句,你不必在 C 中转换 malloc 的结果。我认为,我比其他人对此有更强烈的感觉,因为代码噪音,尤其是当你在 C 领域工作是你可以对自己做的最糟糕的事情之一。这是一个很好的例子,因为我所做的只是重新格式化你的代码,答案就在那里。也不要吝啬空白;它确实有所作为。

无论如何,我希望这会有所帮助,即使您基本上已经完成了所有事情。

关于c - 如何更改 C 中二维数组的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55623056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com