Ver Mensaje Individual
  #8 (permalink)  
Antiguo 09/02/2014, 18:07
yoel_monsalve
 
Fecha de Ingreso: febrero-2014
Mensajes: 5
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Error al guardar arreglo bidimensional en unidimensional

Como dice vosk, el problema está en la relación matemática que hace corresponder cada par de índices del arreglo bidimensional, en un índice de un arreglo unidimensional.

Si M y N son respectivamente la cantidad de filas y de columnas de una matriz a, mientras v es un vector de M*N elementos, entonces la sentencia:

Código:
for (j=0;j<5;j++)
{
vector[i]=a[i][j];
}
debe ser cambiada por
Código C++:
Ver original
  1. for (i = 0; i < M; i++)
  2.     for (j = 0; j < N; j++)
  3.         v[i * M + j] = a[i][j];

Es como antes, usando M y N en lugar de H (height) y W (width) respectivamente.
Sin embargo, hay algunos otros detalles erróneos así como sugerencias que quisiera mencionar:

1. Mezclas nombres de variables. El nombre del vector a veces es "vector", y a veces es "v". Debería ser uno o el otro.

2. En el llenado de la matriz:
Código C++:
Ver original
  1. for (i=0;i<25;i++)
  2.     for (j=0;j<25;j++)
  3.     {
  4.         printf("[%d,%d] = ",i,j);
  5.         scanf("%d",&a[i][j]);
  6.     }
los ciclos for deben ser el primero desde 0 hasta uno menos que la cantidad de filas, mientras el segundo debe ser desde cero hasta uno menos que la cantidad de columnas. Es decir, en tu caso, el primero desde 0 hasta 4, y el segundo desde cero hasta 4. Así:
Código C++:
Ver original
  1. for (i=0; i<M; i++)
  2.     for (j=0; j<N; j++)
  3.     {
  4.         printf("[%d,%d] = ", i, j);
  5.         scanf("%d", &a[i][j]);
  6.     }

3. No uses "getch()" ni "conio.h". Hará tu programa no-portable (que no se pueda pasar de una computadora a otra. Estas funciones y bibliotecas son sólo para Windows. Si lo que quieres es que el programa se quede esperando a que se pulse la tecla ENTER, usa [tt]getchar()[/tt] y la bilbioteca "stdio.h"

4. Te falta el tipo de valor de retorno de main(), que debe ser int. Por lo mismo, hay que poner una instrucción return al final de main().

5. Por último, no es un error pero sería recomendable en el caso de dimensiones de la matriz que las mismas pudieran se cambiadas a otros valores. Por eso se aconseja definir M y N (o H y W) mediante constantes #define (también llamadas macros o directivas). Así:
Código:
#define M 5
#define N 5
(sin punto y coma al final). Luego, escribe tu código en función de M y N. Si algún día quieres cambiar el tamaño de la matriz, sólo cambia los valores de estas constantes en el código, y compila de nuevo.

Te dejo un código terminado, y listo para compilar y probar. Recuerda (es un hábito que desarrollarás con el tiempo) ser más prolijo con la indentación o sangría, y colocar espacios entre los símbolos para hacer tu código maś legible. Más o menos así como el que te voy a presentar

Código C++:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. #define M 5
  5. #define N 5
  6.  
  7. int main() {
  8.    
  9.     int a[M][N], v[M*N], i, j;
  10.  
  11.     /* inicializa vector v con elementos nulos */
  12.     for (i = 0; i < M*N; i++)
  13.     {
  14.         v[i]=0;
  15.     }
  16.  
  17.     /* Ahora pedimos por los elementos de la matriz */
  18.     for (i=0; i<M; i++)
  19.         for (j=0; j<N; j++)
  20.         {
  21.             printf("[%d,%d] = ", i, j);
  22.             scanf("%d", &a[i][j]);
  23.         }
  24.        
  25.     /* y asignamos el contenido al vector
  26.      * ¡aquí estaba el mayor error! */
  27.     for (i = 0; i < M; i++)
  28.         for (j = 0; j < N; j++)
  29.             v[i * M + j] = a[i][j];
  30.  
  31.     /* imprimimos el contenido del vector para verificar */
  32.     for (i = 0; i < M*N; i++)
  33.     {
  34.         printf("%d\n",v[i]);
  35.     }
  36.    
  37.     getchar( );
  38.     return 0;
  39. }

Última edición por yoel_monsalve; 09/02/2014 a las 18:15