Dev - C++ - Ayuda con esta tarea de c++ de matriz bidimensional dinamica

 
Vista:
sin imagen de perfil

Ayuda con esta tarea de c++ de matriz bidimensional dinamica

Publicado por Karla (2 intervenciones) el 22/02/2015 22:36:53
Necesito ayuda con este programa que me dejaron de tarea, ya logré hacer casi todo menos la funcion para pedir los datos que llenaran la matriz. O si no de que otra forma podría hacer esto?

Escribe un programa que tenga dos funciones:
* Una funcion que genere una matriz dinámica de M renglones por N columnas y que regrese un apuntador a esa
matriz.
*Otra funcion que reciba el apuntador devuelto por la funcion anterior, encargada de leer de la entrada estandar
los valores necesarior para llenar la matriz.
Observaciones:
*Asuma que la matriz es de enteros.
*La funcion main llama a las dos funciones.

#include <stdio.h>
#include <stdlib.h>
void generaMatriz( int **, int *, int * );
void leeDatos( int **, int *, int * );

int main()
{
int **matriz, x, y;

generaMatriz( matriz, &x, &y );

// printf("n: %d, m: %d", x, y);

leeDatos( matriz, &x, &y );

getchar();
return(0);


}

void generaMatriz( int **matriz, int *x, int *y )
{
int i, m, n;

printf("Ingresa numero de filas: ");
scanf("%d", &m); fflush(stdin);

printf("Ingresa numero de filas: ");
scanf("%d", &n); fflush(stdin);

*x=m;
*y=n;

matriz=(int **)malloc(sizeof(int *)*m);

for(i=0; i<n; i++)
{
matriz[i]=(int *)malloc(sizeof(int )*n);
}

return;
}

void leeDatos( int **matriz, int *m, int *n )
{
int i, j;


for(i=0; i<(*m); i++ )
{
for(j=0; j<(n); j++)
{
printf("Ingresa numero en posicion [%d][%d]: ", i, j );
scanf( "%d", matriz)[i][j] ); fflush(stdin);
}
}

return;

}
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
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++

Ayuda con esta tarea de c++ de matriz bidimensional dinamica

Publicado por vangodp (287 intervenciones) el 23/02/2015 02:31:12
Te dejo el código aqui por si no puedes copiarlo bien: http://codepad.org/iiEPgnFq

Te comento lo que pasa. Creo que cometes unos errores a la hora de reservar memoria.
primero pides filas 2 veces... Aun que guardas en numeros correctos no se cual es cual XD
printf("Ingresa numero de filas: ");
scanf("%d", &m); fflush(stdin);

printf("Ingresa numero de filas: ");
scanf("%d", &n); fflush(stdin);

El puntero matriz esta bien reservado, suponiendo que m se trata de un X numero de filas a las que después asignaras un X numero de columnas.

para que entiendas:

1
2
3
4
5
6
7
8
9
int fila[6]
int columna[3]
 
fila0->c c c
fila1->o o o
fila2->l l l
fila3->m m m
fila4->a a a
fila5->0 1 2

No es una regla que tienes que seguir ya que pues invertirlas si quieres, yo trabajo así por que así es como se reserva en la memoria(orden).

No te puedo dar un consejo por que no se donde te la has liado XDD
En fin... vamos a pensar así: Pensemos en una hoja de papel a la que tenemos varias lineas(filas). En cada linea puedo tener varias letras(columnas). así es fácil entender.
cuando hago:
matriz = ( int ** ) malloc ( sizeof ( int * ) * lineas );
Es como decir que el papel tiene 10 lineas por ejemplo.

Luego digo cuantas letras caben en cada linea:
1
2
3
for ( i = 0; i < lineas; i++ ) {
    * ( matriz + i ) = ( int * ) malloc ( sizeof ( int ) * letrasPorCadaLinea );
}

¿Por que uso i < lineas? Porque estoy poniendo el numero máximo de letras que caben en cada linea. Esa analogía creo que es muy fácil de decorar.

Otra cosa importante. Si trabajas con memoria dinámica, ella no se libera sola hasta que el ordenador se apague o la liberes tu, para eso usa free(). Para liberar es de la misma forma que haces para reservar, 1º llamas a free para todas las lineas y por ultimo free para el puntero matriz como en la función que te dejo de ejemplo.

Espero que el ejemplo te sirva. Si tienes mas dudas no dudes en preguntar XD

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <stdio.h>
#include <stdlib.h>
 
int ** getMatrix ( int * pFilas, int * pColumnas );
int ** leerDatos ( int ** matriz, int * pFilas, int * pColumnas );
void imprimeMatirz ( int ** matrix, int * pFilas, int * pColumnas );
void liberaMemoria ( int ** matrix, int * pFilas );
 
int main () {
    int filas;
    int columnas;
    //generamos la matriz dinamica
    int ** matriz = leerDatos ( getMatrix ( &filas, &columnas ), &filas, &columnas );  //ya la tenemos reservada y llena! XD
    //mostramos por pantalla
    imprimeMatirz ( matriz, &filas, &columnas );
    //liberamos recursos
    liberaMemoria ( matriz, &filas );
    getchar();
    return 0;
}//main
 
int ** getMatrix ( int * pFilas, int * pColumnas ) {
    int i;
    int ** matriz = NULL;
    int filas;
    int columnas;
    printf ( "Ingresa numero de filas: " );
    scanf ( "%d%*c", &filas );
    printf ( "Ingresa numero de columnas: " );
    scanf ( "%d%*c", &columnas );
    *pFilas    = filas;
    *pColumnas = columnas;
    matriz = ( int ** ) malloc ( sizeof ( int * ) *filas );
 
    for ( i = 0; i < filas; i++ ) {
        * ( matriz + i ) = ( int * ) malloc ( sizeof ( int ) * columnas );
    }
 
    return matriz;
}
 
int ** leerDatos ( int ** matriz, int * pFilas, int * pColumnas ) {
    int i, j;
 
    for ( i = 0; i < *pFilas; i++ ) {
        printf ( "Fila: %d\n", i );
 
        for ( j = 0; j < *pColumnas; j++ ) {
            printf ( "\tmatriz[%d][%d] = ", i, j );
            scanf ( "%d%*c", &matriz[i][j] );
        }
 
        printf ( "\n" );
    }
 
    return matriz;
}
 
void imprimeMatirz ( int ** matrix, int * pFilas, int * pColumnas ) {
    int i, j;
 
    for ( i = 0; i < *pFilas; i++ ) {
        for ( j = 0; j < *pColumnas; j++ ) {
            printf ( "[%-5.3d]", * ( * ( matrix + i ) + j ) );
        }
 
        printf ( "\n" );
    }
 
    return;
}
 
void liberaMemoria ( int ** matrix, int * pFilas ) {
    int i;
 
    for ( i = 0; i < *pFilas; i++ ) {
        free ( * ( matrix + i ) );
    }
 
    free ( matrix );
    printf ( "\n\nRecursos liberados.\n\n" );
    return;
}
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

Ayuda con esta tarea de c++ de matriz bidimensional dinamica

Publicado por Karla (2 intervenciones) el 25/02/2015 00:16:01
Muchas gracias! Le entendí muy bien con tu explicacion, en lo de pedir filas dos veces me equivoqué y volví a escribir filas en lugar de columnas, gracias.
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