[C con Clase] Matriz Bidimensional Dinamica

José Luis Torre joseluistorrehernandez en gmail.com
Lun Oct 29 14:36:29 CET 2012


Hola Ali:

Te comento:

Para generar una matriz de enteros es suficiente con generar una secuencia
de enteros que luego trataremos como una matriz; por eso es suficiente con
generar


*m = (int *) malloc(nF*nC*sizeof(int)); *
*
*
después que tenemos el espacio de memoria, lo utilizamos como si fuera una
matriz de nC columnas; es decir:

* combinaciones((void *) m); *
*
*
el prototipo de combinaciones es:

*void combinaciones(int mat[][nC]);*

Observa que no es necesario poner el número de filas, aunque podrías
ponerlo sin problemas.

En mi máquina (intel core i5) los cálculos son rapidísimos, tanto la
generación de la memoria como la obtención de las combinaciones.

Luego, si quieres comprobar los valores puedes hacerlo con la función:

*mostrar((void *)m); *

pero, esto si que tarda bastante tiempo.

Por supuesto, no está de más comprobar que la asignación de memoria ha sido
correcta (tal como te comenta Salvador Pozo.

A mi me funciona aparentemente bien (no he analizado detenidamente los
resultados)

A continuación te copio todo el programa con los prototipos y las
declaraciones de funciones.

#include <stdio.h>
#include <stdlib.h>


/*Programa que calcula las combinaciones de 25 numeros tomados de 6 en 6 y
el resultado lo expresa en forma de una matriz 177000x6 dinamica*/


#define nF  177100  // Número de filas
#define nC       6  // Número de columnas

void set0(int mat[][nC]);
void setnf(int mat[][nC]);
void mostrar(int mat[][nC]);
void combinaciones(int mat[][nC]);


void set0(int mat[][nC])
{
    // inicia a ceros la matriz
    int f, c;

    for (f=0; f<nF; f++)
    {
        for (c=0; c<nC; c++)
            mat[f][c]=0;
    }
}

void setnf(int mat[][nC])
{
    // inicia en la primera posición de cada fila el número de fila
    int f, c;

    for (f=0; f<nF; f++)
    {
        mat[f][0]= f;
        for (c=1; c<nC; c++)
            mat[f][c]=0;
    }
}
void mostrar(int mat[][nC])
{
    int f, c;

    for (f=0; f<nF; f++)
    {
        for (c=0; c<nC; c++)
            printf(" %d ", mat[f][c]);
            printf("\n");
    }
}

void combinaciones(int mat[][nC])
{
    int f, c, i1, i2, i3, i4, i5, i6;

    f = 0;

    for (i1 = 1; i1 <= 25; i1++)
    {
        for (i2 = i1 + 1; i2 <= 25; i2++)
        {
            for (i3 = i2 + 1; i3 <= 25; i3++)
            {
                for (i4 = i3 + 1; i4 <= 25; i4++)
                {
                    for(i5 = i4 + 1; i5 <= 25; i5++)
                    {
                        for (i6 = i5 + 1; i6 <= 25; i6++)
                        {
                            if ((i1 != i2) && (i1 != i3) && (i1 != i4) &&
                               (i1 != i5) && (i1 != i6) && (i2 != i3) &&
                               (i2 != i4) && (i2 != i5) && (i2 != i6) &&
                               (i3 != i4) && (i3 != i5) && (i3 != i6)&&
                               (i4 != i5) && (i4 != i6) && (i5 != i6))
                            {
                                c = 0;
                                mat[f][c] = i1;
                                c = c + 1;
                                mat[f][c] = i2;
                                c = c + 1;
                                mat[f][c] = i3;
                                c = c + 1;
                                mat[f][c] = i4;
                                c = c +1;
                                mat[f][c] = i5;
                                c = c + 1;
                                mat[f][c] = i6;
                                f = f + 1;
                            }
                        }
                    }
                }
            }
        }
    }

}
int main(void)

{

    int *m = NULL;

    // reserva dinámica de memoria para la matriz

    m = (int *) malloc(nF*nC*sizeof(int));



    // set0((int **)m); // establecer la matriz a ceros

    // setnf((void *)m); // establecer el número de fila


    // system("time");
    combinaciones((void *) m); // cálculo de las combinaciones (aprox 1 seg)
    // system("time");
    // system("pause");

    mostrar((void *)m); // mostrar matriz, tarda bastante, sólo para test
    system("time");

    /*Liberacion de memoria*/
    free(m);

    return 0;
}


Saludos

José Luis


El 29 de octubre de 2012 01:14, Ali Rincon <alrincon1963 en hotmail.com>escribió:

> Caramba hermano, tiene Ud. toda la razón. Con las correciones que Ud. hizo
> el programa corre hermosamente. Mis respetos. Pero, permitame hacerle una
> pregunta: Este programa servirá para una matriz de 3268760x15, es decir, 25
> elementos tomados de 15 en 15, que es realmente a donde quiero llegar??
>
> Le expreso todo mi agradecimiento por su amable ayuda,
>
> Ali Rincon
> Venezuela
>
> SP> Hola, Ali:
> SP> Hay dos errores, el número de combinaciones de 25 elementos tomados de
> 6 en 6 es 177100, no 177000. El programa deja de funcionar cuando se llega
> al elemento del array 177001.
> SP> El otro error es que en el bucle para reservar memoria para cada fila
> usas el valor nC en lugar de nF.
> SP> Además, en previsión de un error al reservar memoria (y más en arrays
> dinámicos tan grandes), hay que hacer una verificación de errores:
> SP> ----8<------
> SP>     mat = malloc(nF * sizeof(int *));
> SP>     if(!mat) {
> SP>         printf("Error de memoria\n");
> SP>         return 1;
> SP>     }
> SP>     for(f = 0; f < nF; f++) {
> SP>         //mat[f] = (int *)malloc(nC * sizeof(int));
> SP>         mat[f] = malloc(nC * sizeof(int));
> SP>         if(!mat[f]) {
> SP>             printf("Error de memoria\n");
> SP>             for(c = 0; c < f; c++) free(mat[c]);
> SP>             free(mat);
> SP>             return 1;
> SP>         }
> SP>     }
> SP> ---8<------
> SP> Hasta pronto.
> SP> --
> SP> Salvador Pozo (Administrador)
> SP> mailto:salvador en conclase.net
> SP> _______________________________________________
> SP> Lista de correo Cconclase Cconclase en listas.conclase.net
> SP>
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> SP> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>




-- 
José Luis Torre
ww.ehu.es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20121029/57e2b70f/attachment.html>


Más información sobre la lista de distribución Cconclase