Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Error al guardar arreglo bidimensional en unidimensional

Estas en el tema de Error al guardar arreglo bidimensional en unidimensional en el foro de C/C++ en Foros del Web. Buenas noches comunidad de forosweb se les saluda, por aqui me encuentro aprendiendo cada dia mas pero hoy me encuentro atascado en un codigo en ...
  #1 (permalink)  
Antiguo 07/02/2014, 20:03
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 2 meses
Puntos: 0
Error al guardar arreglo bidimensional en unidimensional

Buenas noches comunidad de forosweb se les saluda, por aqui me encuentro aprendiendo cada dia mas pero hoy me encuentro atascado en un codigo en un programa que guarde una matriz 5 x 5 en un vector de 25 elementos el codigo es:

Cita:
#include <stdio.h>
#include <conio.h>

main()
{
int vectora[5][5],v[25],i,j;

for (i=0;i<25;i++)
{
vectora[i]=0;
}



for (i=0;i<25;i++)
for (j=0;j<25;j++)
{
printf("[%d,%d] = ",i,j);
scanf("%d",&a[i][j]);
}
for (i=0;i<5;i++)
for (j=0;j<5;j++)
{
vector[i]=a[i][j];
}


for (i=0;i<25;i++)

{
printf("%d ",v[i]);
}
getch();
}
Compila el codigo pero al imprimir los valores solo me guarda los valores 1,3 2,3 y 3,3 que podria estar sucediendo gracias de antemano

Última edición por TriN; 07/02/2014 a las 23:18
  #2 (permalink)  
Antiguo 08/02/2014, 01:51
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: Error al guardar arreglo bidimensional en unidimensional

Suponiendo que es cierto que compila, estas asignando una variable e imprimiendo otra.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 08/02/2014, 06:57
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Error al guardar arreglo bidimensional en unidimensional

Hola Colgary gracias por tu pronta repuesta ya he arreglado el cod, pero igual me sale el mismo error

Cita:
#include <stdio.h>
#include <conio.h>

main()
{
int ma[5][5],v[25],i,j;

for (i=0;i<25;i++)
{
v[i]=0;
}



for (i=0;i<5;i++)
for (j=0;j<5;j++)
{
printf("[%d,%d] = ",i,j);
scanf("%d",&ma[i][j]);
}
for (i=0;i<5;i++)
for (j=0;j<5;j++)
{
v[i]=ma[i][j];
}


for (i=0;i<25;i++)

{
printf("%d ",v[i]);
}
getch();
}
solo guarda los valores de la posicion 1,5 2,5 3,5 4,5 y 5,5
  #4 (permalink)  
Antiguo 08/02/2014, 12:00
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: Error al guardar arreglo bidimensional en unidimensional

Una pista:

Si el arreglo "v" tiene 25 posiciones, que indice estas usando para asignar esas 25 posiciones? ¿Que valores toma ese indice?
__________________
Visita mi perfil en LinkedIn
  #5 (permalink)  
Antiguo 09/02/2014, 03:10
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Error al guardar arreglo bidimensional en unidimensional

Hola calgary, los valores de la matriz 5 x 5 al mi parecer, pero esta mal ejecutado
  #6 (permalink)  
Antiguo 09/02/2014, 04:53
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: Error al guardar arreglo bidimensional en unidimensional

En un arreglo o matriz hay valores guardados y llegas a ellos usando indices. Olvida los valores.

Repito :

Si el arreglo "v" tiene 25 posiciones, que indice estas usando para asignar esas 25 posiciones? ¿Que valores toma ese indice?

Sugerencia:
Al poner codigo aqui en el foro destaca usando el tipo C o C++. Con ello las lineas aparecen con nros a su lado y es mas facil hablar de ellas.

Código C:
Ver original
  1. Int main ()
  2. {
  3. }
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 09/02/2014 a las 05:00
  #7 (permalink)  
Antiguo 09/02/2014, 05:03
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 7 meses
Puntos: 83
Respuesta: Error al guardar arreglo bidimensional en unidimensional

@CalgaryCorpus: "...Una pista..."

Otra pista :)) Haz el bucle donde asignas los valores de 'ma' a 'v' con palel y lapiz para ver en que posiciones guardas:

Código C:
Ver original
  1. for (i=0;i<5;i++) {
  2.     for (j=0;j<5;j++) {
  3.         v[i]=ma[i][j];
  4.     }
  5. }

No obstante puede que te resulte mas atractivo algoritmo de los videojuegos (aplicable en muchos casos):

Código C:
Ver original
  1. posicion lineal = (ancho matriz * posicion y) + posicion x


Código C:
Ver original
  1. #define W 5
  2. #define H 5
  3.  
  4. int x, y, offset;
  5. for(y = 0; y < H; y++) {
  6.     for(x = 0; x < W; x++) {
  7.         offset = (W * y) + x;
  8.         v[offset] = ma[y][x];
  9.     }
  10. }

Solo una observacion, en este caso estoy leyendo de derecha a izquierda y de arriba a abajo, por eso recojo los valores con las posiciones cambiadas ma[y][x]

Esto te deja el array bidimensional como lineal; de esta forma puedes acceder a cualquier posicion del array lineal para lectura i/o escritura sabiendo las coordenadas que ocuparia en la matriz:

Código C:
Ver original
  1. (3x3)
  2. 0 1 2
  3. 3 4 5
  4. 6 7 8
  5.  
  6. P.ej. la posicion 5 = columna 2, fila 1 -> offset = (3 * 1) + 2

Espero que te sea de ayuda
Saludos
vosk
  #8 (permalink)  
Antiguo 09/02/2014, 18:07
 
Fecha de Ingreso: febrero-2014
Mensajes: 5
Antigüedad: 10 años, 1 mes
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
  #9 (permalink)  
Antiguo 09/02/2014, 19:07
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: Error al guardar arreglo bidimensional en unidimensional

Creo que hay que corregir

Código C++:
Ver original
  1. v[i * M + j] = a[i][j];

por

Código C++:
Ver original
  1. v[i * N + j] = a[i][j];

sino. cuando i valga M-1, la expresion i*M + j sera cercano a M^2, lo que está mal.

Por ejemplo si M vale 10 y N vale 2, (un total de 20 distintos enteros) la expresion i*M + j podria llegar a valer 90.
__________________
Visita mi perfil en LinkedIn
  #10 (permalink)  
Antiguo 10/02/2014, 20:44
 
Fecha de Ingreso: junio-2009
Ubicación: House
Mensajes: 38
Antigüedad: 14 años, 9 meses
Puntos: 1
Respuesta: Error al guardar arreglo bidimensional en unidimensional

Usa un índice para controlar los valores

Última edición por RaKKoS; 10/02/2014 a las 21:47
  #11 (permalink)  
Antiguo 10/02/2014, 21:48
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Error al guardar arreglo bidimensional en unidimensional

Chicos gracias por sus respuestas ya logre guardar la matriz en un vector, realmente me da pena decirlo pero fue suerte, haciendo cambios, lo que hice fue controlar los valores con índice pero no entiendo el código al 100% que es lo que realmente quiero, que me deje esa enseñanza igual les dejo el código funcionando
Cita:
#include <stdio.h>
#include <conio.h>

main()
{
int m[3][3],v[9],a,i,j;
a=1;

printf("Ingrese los valores de la matriz ");

for (i=0;i<3;i++)
for (j=0;j<3;j++)
{
printf("[%d,%d] = ",i,j);
scanf("%d",&m[i][j]);
v[a]=m[i][j];
a=a+1;

}
for (i=0;i<9;i++)
{

printf("%d ",v[i]);

}

getch();
}
Como pueden observar controle el índice del vector con la variable a, ya que si coloco la variable i para controlar los datos me da erróneo, Saludos y gracias por sus pistas.
  #12 (permalink)  
Antiguo 11/02/2014, 03:54
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 9 meses
Puntos: 61
Respuesta: Error al guardar arreglo bidimensional en unidimensional

Una excelente alternativa. Sin embargo, el índice "a" deberia partir en 0, no en 1.
__________________
Visita mi perfil en LinkedIn
  #13 (permalink)  
Antiguo 14/03/2014, 14:12
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Error al guardar arreglo bidimensional en unidimensional

otra opcion mas. ;-)

Código c:
Ver original
  1. #include <stdio.h>
  2.  
  3. #define FILAS 2
  4. #define COLUMNAS 2
  5.  
  6. int main(void){
  7.  
  8.    int matriz[FILAS][COLUMNAS], vector[FILAS * COLUMNAS];
  9.  
  10.    for(int i=0, ii=0; FILAS>i; i++)
  11.       for(int j=0; COLUMNAS>j; j++){
  12.          printf("\nintroduce el elemento de la matriz [%i][%i] ",i,j);
  13.          scanf("%i", &matriz[i][j]);
  14.          vector[ii++]=matriz[i][j];
  15.       }
  16.  
  17.    puts("\n\nlos elementos del vector son:");
  18.    for(int i=0, ii=0; FILAS>i; i++){
  19.       putchar('\n');
  20.       for(int j=0; COLUMNAS>j; j++){
  21.          printf("%6i ", vector[ii++]);
  22.  
  23.    }  }
  24.    getchar();
  25.    return 0;
  26. }

Etiquetas: arreglo, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:59.