Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: GGZ en 1 Octubre 2015, 23:35 pm



Título: [C] Arreglos de m*n enteros
Publicado por: GGZ en 1 Octubre 2015, 23:35 pm
Dado un arreglo de m*n enteros, escribir una función pos que tome una fila y una columna, y devuelva el entero correspondiente a esa posición, es decir interpreté el arreglo unidimensional como una matriz.

¿Cómo hago esto?


Ni siquiera se me ocurre como empezar,
¿un arreglo de m*n enteros? ¿a qué se refiere con eso?

int a[m][n]; ?

Y cómo es eso que tome unafila y una columna, realmente estoy perdido.

Saludos!


Título: Re: [C] Arreglos de m*n enteros
Publicado por: 0xFer en 1 Octubre 2015, 23:43 pm
Citar
int a[m][n]; ?
Creo que si

Un arreglo de m*n enteros es int arreglo[m*n] o int arreglo[m][n] el primero es un arreglo unidimensional el segundo una matriz.


Título: Re: [C] Arreglos de m*n enteros
Publicado por: GGZ en 1 Octubre 2015, 23:48 pm
Bueno, pero cómo hago para pasarle una fila y una columna, además a qué se refiere con interpreté el arreglo unidimensional como una matriz.

O sea yo le paso una fila y una columna y el me debería devolver una matriz de eso, no realmente no lo entiendo.


Título: Re: [C] Arreglos de m*n enteros
Publicado por: A.I. en 1 Octubre 2015, 23:54 pm
Tienes que crear un array unidimensional de m*n posiciones.

Código
  1. int elArray[N]; //donde N es igual a n*m

Pero tienes que hacer que para el que llama a la función lo vea como una matriz de n filas y m columnas. Es decir a la función le pasas las coordenadas de matriz (fila, columna) y te debe devolver ese elemento.

Código
  1. elementoArray ( elArray, fila, columna); //asi seria la llamada a la funcion

Básicamente es hacer un poco de aritmética a la hora de seleccionar la posición del array unidimensional partiendo de coordenadas bidimensionales.


Título: Re: [C] Arreglos de m*n enteros
Publicado por: GGZ en 2 Octubre 2015, 00:08 am
Código
  1. /*
  2. Dado un arreglo de m*n enteros, escribir una función pos que tome una fila y una columna, y devuelva el entero correspondiente a esa posición, es decir interpreté el arreglo unidimensional como una matriz.
  3. */
  4. #include <stdio.h>
  5.  
  6. int pos(char a[], int x, int y){
  7.  
  8. printf ("Elemento correspodiente a la fila %d y columna %d: %d\n",x,y,a[x][y]);
  9. return a[x][y];
  10. }
  11.  
  12.  
  13. int main (void){
  14.  
  15. int n,m;
  16. int N;
  17.  
  18. printf ("Introduzca las n filas: ");
  19. scanf ("%d",&n);
  20. printf ("Introduzca las m columnas: ");
  21. scanf ("%d",&m);
  22.  
  23. N=n*m;
  24.  
  25.        // ¿Cómo lo lleno con bucles?
  26. //for
  27.  
  28. int a[N];
  29.  
  30.        /*
  31.         ..........
  32.         */
  33.  
  34. pos(a, 3,6);
  35.  
  36.  
  37.  
  38. return 0;
  39. }
  40.  

Sigo sin entenderlo del todo...


Título: Re: [C] Arreglos de m*n enteros
Publicado por: A.I. en 2 Octubre 2015, 00:25 am
El que llama a la función "ve" esto

10 10 10 // Ésto es una matriz
10 99 10
10 10 10

Sin embargo la función sólo conoce ésto

10 10 10 10 99 10 10 10  //Ésto es un array unidimensional

Tienes que hacer algo para que a partir de la fila y la columna, la función pueda obtener el indice equivalente para el array.

Es decir si llamas a la función así:

Código
  1. pos(array, 1, 1) ;

la función debe transformar ese (1,1) que son las coordenadas del elemento en la matriz a un 4 y entonces hacer

Código
  1. return array[4];

Que en este caso sería el 99.

Si no sabes como rellenar un array quizá este problema te venga grande...
Haz un for de N iteraciones donde en cada una pida, genere (o lo que quieras)... un número y lo vaya asignando a posiciones consecutivas del array. Pero hazlo tras declarar el array y no antes.


Título: Re: [C] Arreglos de m*n enteros
Publicado por: 0xFer en 2 Octubre 2015, 00:26 am
Las matrices ya las conoces no?

int matriz[m][n] esa es una matriz con m*n elementos.

Si quisiera saber el elemento en la segunda fila y tercera columna el código sería asi:

matriz[1][2]

Ahora tienes que hacer que un arreglo unidimensional se comporte de esa manera.
Un arreglo unidimesional de m*n es así int unidim[m*n]

Ahora si quieres acceder a la segunda fila y tercera columna sería así unidim[(n*1) + 2 ]

El resultado sería lo mismo que en la matriz, pero lo hicimos con un arreglo unidimensional

Ahora como ya te dijeron, tienes que hacer una función que haga eso, lo que tienes está bien, pero tiene que ser con un arreglo unidimensional no con una matriz.


Título: Re: [C] Arreglos de m*n enteros
Publicado por: GGZ en 2 Octubre 2015, 16:23 pm
El que llama a la función "ve" esto

10 10 10 // Ésto es una matriz
10 99 10
10 10 10

Sin embargo la función sólo conoce ésto

10 10 10 10 99 10 10 10  //Ésto es un array unidimensional

Tienes que hacer algo para que a partir de la fila y la columna, la función pueda obtener el indice equivalente para el array.

Es decir si llamas a la función así:

Código
  1. pos(array, 1, 1) ;

la función debe transformar ese (1,1) que son las coordenadas del elemento en la matriz a un 4 y entonces hacer

Código
  1. return array[4];

Que en este caso sería el 99.

Si no sabes como rellenar un array quizá este problema te venga grande...
Haz un for de N iteraciones donde en cada una pida, genere (o lo que quieras)... un número y lo vaya asignando a posiciones consecutivas del array. Pero hazlo tras declarar el array y no antes.


Todavía no la saco, me parece que lo estoy pensando mal porque se me está complicando demasiado.

Código
  1. /*
  2. Dado un arreglo de m*n enteros, escribir una función pos que tome una fila y una columna, y devuelva el entero correspondiente a esa posición, es decir interpreté el arreglo unidimensional como una matriz.
  3. */
  4.  
  5. #include <stdio.h>
  6. /*
  7. int pos (int a[], int fila, int columna){
  8. // pos(a,1,1)
  9.  
  10. // 10 11
  11. // 12 13
  12.  
  13. //array(1,2)=a[3*n+(columna-1)]=a[3*1+1]=a[4]
  14.  
  15.  
  16. // pos(a,2,2) = a[4]
  17.  
  18. // 10 11 12 13
  19.  
  20. a[4];
  21.  
  22.  
  23.  
  24. }
  25. */
  26.  
  27. int main (void){
  28. int n,m,l=0; // arrays
  29. int i,j;
  30. int fila,columna;
  31. int z=10;
  32.  
  33. printf ("Introduce el numero de filas: ");
  34. scanf ("%d",&n);
  35. printf ("Introduce el numero de columnas: ");
  36. scanf ("%d",&m);
  37.  
  38. /// N=n*m;
  39.  
  40. int array[n][m];
  41. int array_u[l]; // array unidimensional.
  42.  
  43. for (i=0;i<n; i++){
  44. for (j=0; j<m; j++){
  45. array[i][j]=z++;
  46. }
  47. }
  48.  
  49. printf ("Imprimiendo elementos array ...\n");
  50.  
  51. for (i=0; i<n; i++){
  52. for (j=0; j<m; j++){
  53. printf ( "%d ",array[i][j]);
  54. }
  55. printf ("\n");
  56.  
  57. }
  58.  
  59. printf ("Ingresa el numero de fila y columna: \n");
  60. scanf ("%d %d",&fila,&columna);
  61.  
  62. for (i=0; i<n; i++){
  63. for (j=0; j<m; j++){
  64. array_u[l]=array[i][j];
  65. l++;
  66. }
  67. }
  68. printf ("\n");
  69. for (l=0; l<n*m; l++)printf ("%d ",array_u[l]); // Esto es lo que le paso a la función.
  70.  
  71. //pos(array_u,fila,columna);
  72.  
  73.  
  74.  
  75. return 0;
  76. }


Título: Re: [C] Arreglos de m*n enteros
Publicado por: ivancea96 en 2 Octubre 2015, 16:43 pm
Código
  1. int array_u[l]; // array unidimensional.
l = 0.
Array de 0 elementos.


Título: Re: [C] Arreglos de m*n enteros
Publicado por: GGZ en 2 Octubre 2015, 16:49 pm
Perdón debería definirlo array_u[n*m] de todos modos ahí no es donde está el error.
Estaba mal definido estamos de acuerdo, pero el problema acá es el enunciado que no termino de entenderlo.


Título: Re: [C] Arreglos de m*n enteros
Publicado por: A.I. en 2 Octubre 2015, 17:26 pm
Lo que te pide el enunciado es ésto

Código
  1. int pos(int array[], int fila, int columna){
  2.  return array[fila*NCOL + columna];
  3. }

Pero te pongo un poco más de código que creo que te ayudará a comprenderlo mejor

Código
  1. #include <stdio.h>
  2. #define NFIL 4
  3. #define NCOL 10
  4. #define NELEM NFIL * NCOL
  5.  
  6. int pos(int array[], int fila, int columna){
  7.  return array[fila*NCOL + columna];
  8. }
  9.  
  10.  
  11. int main (){
  12.  int elArray [NELEM];
  13.  int fila, columna, i;
  14.  
  15.  for (i = 0; i < NELEM; i++)
  16.    elArray[i] = i;
  17.  
  18.  printf("Fila: ");
  19.  scanf("%d", &fila);
  20.  
  21.  printf("Columna: ");
  22.  scanf("%d", &columna);
  23.  
  24.  printf("(%d,%d) = %d\n", fila, columna, pos(elArray, fila, columna));
  25.  
  26.  return 0;
  27. }

Si no entiendes alguna parte pregunta ;-)


Título: Re: [C] Arreglos de m*n enteros
Publicado por: GGZ en 2 Octubre 2015, 18:06 pm
Código
  1. /*
  2. Dado un arreglo de m*n enteros, escribir una función pos que tome una fila y una columna, y devuelva el entero correspondiente a esa posición, es decir interpreté el arreglo unidimensional como una matriz.
  3. */
  4.  
  5. #include <stdio.h>
  6.  
  7. int pos (int a[], int fila, int columna);
  8.  
  9. int NCOL;
  10. int NFIL;
  11.  
  12. int main (void){
  13. int i,j;
  14. int fila,columna;
  15.  
  16. printf ("Filas del Array: ");
  17. scanf ("%d",&NFIL);
  18. printf ("Columnas del Array: ");
  19. scanf ("%d",&NCOL);
  20.  
  21.  
  22. int array[NCOL*NFIL];
  23.  
  24.  
  25. for (i=0;i<NCOL*NFIL; i++){
  26. array[i]=i;
  27. }
  28.  
  29. printf ("Fila: ");
  30. scanf ("%d",&fila);
  31. printf ("Columna: ");
  32. scanf ("%d",&columna);
  33.  
  34.  
  35.  
  36. printf ("(%d,%d)=%d",fila,columna,pos(array,fila,columna));
  37.  
  38.  
  39. return 0;
  40. }
  41.  
  42. int pos (int a[], int fila, int columna){
  43.  
  44. return a[fila*NCOL+(columna)];
  45. }
  46.  
  47.  

Creo que mas o menos voy entendiendo, lo voy a seguir pensando por mi cuenta, no creo que lo que hice esté bien.

Algo así?