Array bidimensional en C

davidpoza

Hola a todos,
acabo de empezar con C y hay ciertas cosas me cuesta un poco entender ya que vengo de pascal que es mucho más sencillo y prácticamente no hay que hacer uso de punteros para nada.
Una de las dudas que se me plantea ahora en C es, por ejemplo, cómo introducir elementos en una matriz.
Podría hacerse todo dentro de main() más o menos así:

int main()
{
int n, m, filas, columnas;
int matriz[50][50];
printf("Introduce el numero de filas y columnas (separado por una coma)\n");
scanf("%d,%d", &filas, &columnas);
for (n=0; n<filas; n++)
for (m=0; m<columnas; m++)
{
printf("Introduce el elemento %d,%d\n", n,m);
scanf("%d", &matriz[n][m]);
}
return 0;
}

Sin embargo me gustaría hacerlo con una función independiente ( leer_matriz() ) a la que pase por referencia la matriz que estaría declarada en el programa principal, de modo que modifique directamente ésta.
Pero para ello intervienen los punteros y me lio bastante.

Si alquien puede echarme un cable se lo agradecería mucho.

Dod-Evers

pa empezar quieres hacer muchas cosas a la vez. fijate qué haras cuando pongas

100,100 y tienes la matriz de 50x50... te dará un core o un bus error, o si está el compilador alegre te dirá que accedes a memoria que no es tuya.

Eso del sscanf con comas y tal me suena raro, hazlo de uno en uno.

para hacer el leer_datos, con que le pases el &matriz te vale.

guner

include <stdio.h>

include <stdlib.h>

define COLS 9

int leerMatriz(int matriz[][COLS], int row, int col)
{
&nbsp; &nbsp; return matriz[row][col];
}

int main()
{
&nbsp; &nbsp; int matriz[9][COLS], i, j;
&nbsp; &nbsp;
&nbsp; &nbsp; for (i = 0; i < 10; i++) {
&nbsp; &nbsp; &nbsp; &nbsp; for (j = 0; j < 10; j++)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matriz[j] = i * 10 + j;
&nbsp; &nbsp; }
&nbsp; &nbsp;
&nbsp; &nbsp; printf("Leer fila: ");
&nbsp; &nbsp; scanf("%d", &i);
&nbsp; &nbsp; printf("Leer columna: ");
&nbsp; &nbsp; scanf("%d", &j);
&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; printf("matriz[%d][%d] = %d\n", i, j, leerMatriz(matriz, i, j));
&nbsp; &nbsp; return 1;
}

Sin hacerlo con el COLS, solo sabría hacerlo con estructuras.

LOc0

#3, aunque no veo necesario crear una función para leer la matriz ;)

Salu2 ;)

bLaKnI

.
.
.

main()
{
int **matrix;

 matrix = create_Matrix(matrix, 20, 20); //Donde matrix es un puntero vacio. 20, son el tamaño de filas y columnas. En este caso, sera una matriz cuadrada.

 print_Matrix(matrix, 20, 20); //Imprimiremos en consola, la matriz resultante.

}

.
.
.

int **create_Matrix(int M, int col, int fil)
{
int i=0, a=0, b=0;
M = (int
)malloc(filsizeof(int));

 for(i=0; i<fil; i++)
 {
      M[i]=(int*)malloc(col*sizeof(int));
 }

 /*Hasta aqui, la reserva de espacio dinámico para la matriz*/

 printf(".: Introduce los valores sequencialmente de la matriz:.\n\n");

 for(a=0; a<fil; a++)
 {
      for(b=0; b<col; b++)
      {
           scanf("%le", &M[a][b]);
      }
 }

 return M;

}

/Funcion para imprimir matrices/

void print_Matrix(double **matrix, int fil, int col)
{
int i=0, j=0;

 for(i=0; i<fil; i++)
 {
      for(j=0; j<col; j++)
      {
           printf(" %i",matrix[i][j]);
      }
      printf("\n");
  }

}

PD: Ta echo a la babalá, sin testear ni nada. Llevo demasiado con el Java y no recuerdo muy bien las sentencias de C. Miralo por encima y cambia algunas cosas, en principio es correcto. Si no has trabajado con memória dinámica, entonces ESTE no es tu ejemplo. Pero copialo en un TXT i guardalo, porque lo usarás. ;)

davidpoza

gracias por la ayuda, pero mi duda, más concretamente estaría en este código:
#include <stdio.h>

void leer_matriz(int matrix[][50], int *filas, int columnas)
{
int n,m;
printf("introduce el numero de filas y columnas (separados por una coma)\n");
scanf("%d,%d", filas, columnas);
for (n=0;n<
filas; n++)
for (m=0; m<*columnas; m++)
{
printf("introduce el elemento %d,%d\n", n,m);
scanf("%d", matrix[n]);
matrix++;
}
}

void imprimir_matriz(int matriz[][50], int filas, int columnas)
{
int n,m;
for (n=0;n<filas; n++)
{
for (m=0; m<columnas; m++)
printf("%d ", matriz[n][m]);
printf("\n");
}
}

int main()
{
int n, m, filas, columnas;
int matriz[50][50];
leer_matriz(matriz, &filas, &columnas);
imprimir_matriz(matriz, filas, columnas);
return 0;
}

No se muy bien lo que hago pues al ejecutar el programa no se guardan bien los valores, y los que si se guardan no lo hacen en su lugar correspondiente:

Ejecución:

introduce el numero de filas y columnas (separados por una coma)
2,3
introduce el elemento 0,0
1
introduce el elemento 0,1
2
introduce el elemento 0,2
3
introduce el elemento 1,0
4
introduce el elemento 1,1
5
introduce el elemento 1,2
6
1 0 0
2 0 0

LOc0

Prueba:
#include <stdio.h>

void leer_matriz(int matrix[][50], int *filas, int columnas)
{
int n,m;
printf("introduce el numero de filas y columnas (separados por una coma)\n");
scanf("%d,%d", filas, columnas);
for (n=0;n<
filas; n++)
for (m=0; m<*columnas; m++)
{
printf("introduce el elemento %d,%d\n", n,m);
scanf("%d", &matrix[n][m]);
}
}

void imprimir_matriz(int matrix[][50], int filas, int columnas)
{
int n,m;
for (n=0;n<filas; n++)
{
for (m=0; m<columnas; m++)
printf("%d ", matrix[n][m]);

printf("\n");
}
}

int main()
{
int filas, columnas;
int matrix[50][50];
leer_matriz(matrix, &filas, &columnas);
imprimir_matriz(matrix, filas, columnas);

return 0;
}

Salu2 ;)

davidpoza

Muchas gracias a todos, ya funciona estupendamente:

introduce el numero de filas y columnas (separados por una coma)
2,3
introduce el elemento 0,0
1
introduce el elemento 0,1
2
introduce el elemento 0,2
3
introduce el elemento 1,0
4
introduce el elemento 1,1
55
introduce el elemento 1,2
6
1 2 3
4 55 6

bLaKnI

;)

Usuarios habituales

  • bLaKnI
  • davidpoza
  • LOc0
  • guner
  • Dod-Evers