Dev - C++ - Pasar Matriz a un vector y mostrarlo

 
Vista:
sin imagen de perfil

Pasar Matriz a un vector y mostrarlo

Publicado por Fucking (9 intervenciones) el 06/07/2015 21:54:32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//ES UN PROGRAMA SIMPLE PERO NO ENCUENTRO EL ERROR ,AGRADECERIA SU AYUDA
#include <stdio.h>
#include <stdlib.h>
 
main(){
    int M,N,z,i,j;
    int matriz[i][j],vect[z],value;
 
    printf("\n\tIngrese las filas ");
	scanf("%d",&M);
	printf("\n\tIngrese el numero de columnas \n\t");
	scanf("%d",&N);
 
	printf("\n\tIngrese la Matriz\n\t");
    for(i=0;i<M;i++){
	for(j=0;j<N;j++){
    scanf("%d",&matriz[i][j]);
    value++;
}}
for(z=0;z<value;z++){
for (i=0;i<M;i++){
for (j=0;j<N;j++){
vect[z]=matriz[i][j];
}
}
}
for(z=0;z<value;z++){
printf("\nLos valores del vector[%d] son %d",z+1,vect[z]);
}
fflush(stdin);
getchar();
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pasar Matriz a un vector y mostrarlo

Publicado por Thanatos (199 intervenciones) el 07/07/2015 12:18:45
En la línea 7, la segunda línea dentro del método main, declaraste la matriz utilizando las variables i y j que no están inicializadas. Lo mismo sucede con la declaración del vector.

Te propongo este código para que lo analices y veas lo que puedes modificar en el tuyo. Si quitas los comentarios de las lineas 22, 25 y 29, los ciclos for anidados mostrarán los elementos de la matriz, esas tres líneas no son necesarias para cargar el vector.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
 
int main(void) {
    int filas = 0;
    int columnas = 0;
 
    printf ("\nIngrese el numero de filas:\nfilas = ");
    scanf ("%d", &filas);
    printf ("\nIngrese el numero de columnas:\ncolumnas = ");
    scanf ("%d", &columnas);
    int matriz[filas][columnas];
 
    printf("\nIngrese los elementos de la Matriz:\n");
    for (int f = 0; f < filas; f++) {
        for (int c = 0; c < columnas; c++) {
            scanf ("%d", &(matriz[f][c]));
        }
    }
 
    int vector[filas * columnas];
    int contador = 0;
    //printf ("\nLa matriz ingresada es:\n");
    for (int f = 0; f < filas; f++) {
        for (int c = 0; c < columnas; c++) {
            //printf ("%5d  ", matriz[f][c]);
            vector[contador] = matriz[f][c];
            contador++;
        }
        //printf("\n");
    }
 
    printf ("\nLos elementos del vector son:");
    for (int indice = 0; indice < contador; indice++) {
        printf ("\nvector[%d] = %d", indice + 1, vector[indice]);
    }
 
    (void)fflush(stdin);
    (void)getchar();
    return 0;
}

Espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pasar Matriz a un vector y mostrarlo

Publicado por vangodp (287 intervenciones) el 07/07/2015 21:10:20
Esa forma de pedir el tamaño del una matriz o vector no es estándar, puede que funcione o puede que no, depende del compilador, pero repito, no es estándar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Pasar Matriz a un vector y mostrarlo

Publicado por Fucking (9 intervenciones) el 08/07/2015 05:29:02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//ya lo corregi,thank you, lo que no entiendo es por que no funciona cuando 
//declaro arriba int matriz[M][N]; y si funciona cuando la pongo luego de 
//la lectura de filas y columnas , me podrias decir please !
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int M=0,N=0;
 
    int vect[M*N],val,i,j;
printf("\n\tIngrese el numero de filas:\n\t");
	scanf("%d",&M);
	printf("\n\tIngrese el numero de columnas:\n\t");
	scanf("%d",&N);
int matriz[M][N];
    printf("\n\tIngrese la Matriz:\n\t");
    for(i=0;i<M;i++){
	for(j=0;j<N;j++){
    scanf("%d",&matriz[i][j]);}}
 
for (i=0;i<M;i++){
for (j=0;j<N;j++){
vect[val]=matriz[i][j];
val++;}
}
 
for(int indice=0;indice<val;indice++){
printf("\nLos valores del vector[%d] son %d",indice+1,vect[indice]);
}
fflush(stdin);
getchar();
return EXIT_SUCCESS;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pasar Matriz a un vector y mostrarlo

Publicado por vangodp (287 intervenciones) el 08/07/2015 09:13:06
//ya lo corregi,thank you, lo que no entiendo es por que no funciona cuando
//declaro arriba int matriz[M][N]; y si funciona cuando la pongo luego de
//la lectura de filas y columnas , me podrias decir please !



bien... pase por alto la pregunta pero vamos a ello.

cuando declaraste las variables int M,N,z,i,j;no le tenias dado un valor inicial, como por ejemplo un cero.
Al crear una variable a nivel de harware cuando haces int loquesea; estas pillando un trozo de memoria del tamaño para que quepa un int, eso son 4 bytes(puede variar), pero realmente no sabes que valor había tenido esa casilla antes. Es como cuando compras una casa vieja a la que los antiguos dueños se hayan ido y la dejaran lleno de trastos, simplemente compras la casa y no sabes que hay dentro. Otra cosa es hacer int loquesea = 0;, o puede que otro valor inicial, entonces en ese caso sí que sabes que hay dentro.Tú problema es que la memoria tiene residuos porque no sabes los valores de i y j antes de los scanfs, pero sí después, esos i y j pueden y deben tener residuos de otros programas que han liberado memoria antes, a la que luego has reservado con todo lo que había, si ese dato estuviera corrupto ni sabes el tamaño de la matriz, podría ser 0, 1, 1000 o bien 235132512541243532236452. Incluso puede tener algo incoherente que el programa no sepa representarlo.

Es buena practica dar un valor inicial siempre a todas las variables, ni que sea cero. ¡Recuerde eso!

Otra cosa... No puedes declarar una matriz de un tamaño fijo y cambiar el tamaño luego después. imajina un restaurante que vas comer con tu familia que siempre esta lleno, llamas por telefono y pides mesa para 4, luego allí te encuentras con un amigo en medio del camino y quieres cambiar, pero ya han rodeado tu mesa con otras mesas y no puedes agrandarla más por que no hay espacio, hay que trasladar a toda la familia a una nueva área del restaurante a una área más amplia. Eso se llama memoria dinámica, puedes usar realocar. Básicamente es como llamar al sirviente, pedimos mesa para 5 y trasladamos toda la familia a esa mesa más ancha. La memoria es física, no puedes expandirla pero si buscar una área más amplia, si la hay claro.

la forma correcta de crear una matriz es esta

const int fila 10;
const int columna 10;

int matriz[fila][columna];


Y te preguntarás... ¿Cómo le doy el tamaño que yo quiera?¡Simples, eso no se puede hacer! Pero como somos pesados seguiremos preguntando lo mismo, u te diré que se usa alocación dinámica de memoria, en otras palabras se usa malloc(memory allocator) que simplemente reserva, pero no da un valor inicial, o calloc que reserva y formatea ese espacio con nulos por ejemplo, luego hay que liberar memoria con free. En el caso de querer pedir otra mesa más grande esta realloc, que pide un trozo mayor de memoria y mueve todo a ese nuevo trozo. Así es la forma correcta de reservar memoria, es lo estándar, es la diferencia entre saber programar y hacer chapuzas informáticas, si trasladas ese código a cualquier ordenador tienes la garantía del estándar ISO de que sí te va funcionar. XDD

Debes buscar cómo reservar memoria dinámica, por que así es como se trabaja, si lo haces de la otra forma puedes que hasta pierdas un puesto de trabajo en una entrevista por ese "pequeño" detalle.

En fin, ya no te molesto más, solo quiero que lo sepas vamos, a mi también me choco por que me parecía muy cómodo de la forma que dices, hasta que tope con compañeros que ejercen de forma profesional y me lo explicaron que la forma correcta es memoria dinámica o declarar la matriz fila y columna como const para no poder pedir su tamaño posteriormente con scanf. Ahora bien, hay 2 caminos, supere de una vez y te adaptas, o siga tu vida toda programando de forma incorrecta, total, que más da, si me funciona seguiré utilizando esa forma ya que me funciona, pero si te falla el programa por cosas tan tontas como esa, imaginas que pasa cuando tienes un programa de 10k lineas al que escribiste tu en tu casa y lo llevas al curro para enseñar a tu jefe y resulta que no va jajajaja. Seria muy doloroso cambiar 10 mil lineas para que trabaje con punteros y memoria dinámica jajajaja. O bien puedes jurar a tu jefe que en tu casa si funciona dicho código jajaja.

venga suerte XDDD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Pasar Matriz a un vector y mostrarlo

Publicado por Fucking (9 intervenciones) el 11/07/2015 16:52:41
Que bueno che asi me acostumbro a programar correctamente para evitar problemas,encontre en wikibooks una referencia a alocacion dinamica de memoria,jeje gvracias por tan buena respuesta que jamas me molestaria :D,me trajiste mucha luz con tu explicacion ty :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pasar Matriz a un vector y mostrarlo

Publicado por vangodp (287 intervenciones) el 11/07/2015 22:39:58
Es lo correcto. ;)
Hay cosas que te las enseñan mal, y te pueden llegar a afectar negativamente como programador. Cosas que irás aprendiendo con el tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pasar Matriz a un vector y mostrarlo

Publicado por vangodp (287 intervenciones) el 07/07/2015 21:25:58
para copiar una matriz a un vector o viceversa XD, puedes probar tratar la matriz como un vector.

No es un fallo, funciona perfectamente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
#define lineas 4
#define columnas 5
 
int main() {
    int i;
    int matriz[lineas][columnas]={
        { 1, 2, 3, 4, 5},
        { 6, 7, 8, 9,10},
        {11,12,13,14,15},
        {16,17,18,19,20}
    };
    int vector[lineas*columnas] = {0};
 
    /*Una matriz es un vetor en la ram por muy matriz que sea XD*/
    for ( i = 0; i < lineas*columnas; i++ ){
        vector[i]= matriz[0][i]; //vea la forma de tratar una matriz como vector para no tener que liarte de tantos bucles for jajaj
        printf("%d,", vector[i]);
    }
    printf(" TADAH!!XD");
 
 
    getchar();
    return 0;
}
Eso es así por que si en el vector sabemos que sta en la memoria de forma continuada, o sea que la posición del vector[3] viene después de vector[2] etc etc, la memoria es lineal, entonces siendo así... ¿Te has preguntado como van las matrices en la memoria?

Una matriz en memoria va asi...
Si tenemos ejemplo matriz[3][3], en memoria esta asi:
matriz[0][0], matriz[0][1], matriz[0][2], matriz[1][0], matriz[1][1], matriz[1][2], matriz[2][0], matriz[2][1], matriz[2][2]

Cuando digo que esta así en la memoria no pienses que así te lo enseñaron blablabla, me refiero que en ese orden van en la memoria ram, van de forma consecutiva. y si nos salimos de rango en matriz[0][2], suponiendo que existiera una "supuesta" casilla matriz[0][3], esa seria la matriz[1][0], por que como dije, esa viene después de matriz[0][2] en la memoria ram.¿ Lo pillas? XD

por eso si uso el iterador i en matriz[0][i] y no me paso de 20 si se que matriz tiene un tamaño suficiente para almacenar el vector puedo hacer que la matriz funcione como un vector, por que físicamente ambos van de forma consecutiva en la memoria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Pasar Matriz a un vector y mostrarlo

Publicado por Fucking (9 intervenciones) el 08/07/2015 05:30:45
Jeje buen codigo para ahorrarme unas lineas y gracias por traerme un poco de luz con lo de la ram que algo sabia jeje :P
,lo guardare en mi reserva natural de codigos :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pasar Matriz a un vector y mostrarlo

Publicado por Jorge (1 intervención) el 07/12/2016 06:04:44
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int M,N;
 
    int i,j,x;
    printf("\n\tIngrese el numero de filas:  ");
	scanf("%d",&M);
	printf("\n\tIngrese el numero de columnas:  ");
	scanf("%d",&N);
 
    int matriz[M][N];
    int multi;
 
    printf("\n");
    printf("\t LLenado de la matris:\n\n");
 
    for(i=0;i<M;i++)
        {
            for(j=0;j<N;j++)
            {
            printf("\tIngrese dato en la pocicion [%d][%d]:  ",i,j);
            scanf("%d",&matriz[i][j]);
            }
        }
 
    printf("\n");
    //COMO QUEDA LLENA LA MATRIZ
    for(i=0;i<M;i++)
        {
        for(j=0;j<N;j++)
            {
            printf("\t%d",matriz[i][j]);
            }
            printf("\n");
        }
    printf("\n");
 
    multi=M*N;
    int vect[multi];
    int val=0;
 
    for (i=0;i<M;i++)
        {
            for (j=0;j<N;j++)
            {
                vect[x]=matriz[i][j];
                printf("\t Los valores del vector son %d\n",vect[x]);
            }
        }
 
 return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar