[C con Clase] Como eliminar filas en una matriz dinamica?

Ali Rincon alrincon1963 en hotmail.com
Mar Dic 24 01:28:20 CET 2013


Muchas gracias, Steven, por todos tus comentarios y correcciones que le haces al codigo. Los voy a introducir y luego lo volvere a subir. Dejame decirte que basicamente, no me interesa realmente "eliminar" las filas que cumplan con una determinada condicion, pero si me interesa que muestre las demas filas que vayan quedando, pues necesito saber la dimensionalidad de la matriz resultante. 

Ali Rincon



El pasado 2013-12-23 23:28:16, Steven Davidson escribió:
 
SD> Hola Ali,
SD> 2013/12/21 Ali Rincon <alrincon1963 en hotmail.com>
SD> > Hola a todos. A continuacion les envio el programa, en donde se calcula
SD> > unas combinaciones y luego deseo imponer una condicion muy simple (la cual
SD> > se explica en el programa) y lo que deseo es ver la matriz que debe quedar:
SD> >
SD> >
SD> Hay algunos matices a destacar en el siguiente código fuente.
SD> [CORTE]
SD> >     /*Calculo de las combinaciones*/
SD> >
SD> >     f = 0;
SD> >
SD> >     for (i1 = 1; i1 <= 15; i1++)
SD> >     {
SD> >         for (i2 = i1 + 1; i2 <= 15; i2++)
SD> >         {
SD> >             for (i3 = i2 + 1; i3 <= 15; i3++)
SD> >             {
SD> >
SD> [CORTE]
SD> Estos bucles no logran el propósito que quieres. Analizando el
SD> comportamiento de los bucles y de las variables, vemos que los valores de
SD> las variables de los bucles posteriores no deberían llegan a 15, porque
SD> nada ocurre en esas últimas iteraciones. Por ejemplo, si i1=15, entonces i2
SD> es 16, por lo que no entra en "su bucle", ni por tanto en los demás bucles
SD> anidados. Por consiguiente, los bucles deberían ser,
SD> for( i1=1; i1<=15; i1++ )
SD>   for( i2=i1+1; i2<=14; i2++ )
SD>     for( i3=i2+1; i3<=13; i3++ )
SD>       for( i4=i3+1; i4<=12; i4++ )
SD>         ...
SD> [CORTE]
SD> >                                                             if ((i1 != i2)
SD> > && (i1 != i3) && (i1 != i4) && (i1 != i5) &&
SD> >                                                                 (i1 != i6)
SD> > && (i1 != i7) && (i1 != i8) && (i1 != i9) &&
SD> >
SD> [CORTE]
SD> Estas condiciones no son necesarias, porque siempre son verdad. 'i1' nunca
SD> llegará a ser 'i2', porque 'i2' siempre es 1 más que 'i1'. Asimismo, 'i2'
SD> nunca será igual a 'i3', en la misma iteración.
SD>                                                                 {
SD> >                                                                     c = 0;
SD> >
SD> > mat[f][c] = i1;
SD> >                                                                     c = c
SD> > + 1;
SD> >
SD> > mat[f][c] = i2;
SD> >
SD> [CORTE]
SD> No tiene mucho sentido usar 'c', porque el comportamiento de todas estas
SD> sentencias es recorrer cada columna, por lo que podrías haber hecho
SD> explícitamente. Esto es,
SD> mat[f][0] = i1;
SD> mat[f][1] = i2;
SD> mat[f][2] = i3;
SD> ...
SD> f++;
SD> Como puedes ver, hacer las cosas explícitamente no es una buena forma de
SD> expresarnos. Nos gustaría automatizar estas asignaciones; para ello,
SD> necesitamos una solución general. Si definimos estas variables del bucle
SD> como un array, en lugar de definirlas explícitamente, entonces podemos
SD> recorrer el array con un índice. Esto es,
SD> int pi = (int *) malloc( nC * sizeof(int) );
SD> ...
SD> for( c=0; c<nC; c++ )
SD>   mat[f][c] = pi[c];
SD> f++;
SD> ...
SD> free( pi );
SD> Necesitas diseñar otro algoritmo para crear cada combinación y que sea
SD> general; no solamente las 15 agrupaciones de 14 números.
SD>     printf("\nDesea imponer alguna condicion sobre esta matriz (s/n)?: ");
SD> >     scanf("%s", &seguir);
SD> >
SD> Esto puede suponer un grave error. La variable 'seguir' es de tipo 'char',
SD> mientras que 'scanf()' espera un array de 'char'. Sugiero usar 'getchar()'
SD> o usa el especificador %c para leer y extraer un solo carácter.
SD>     if(siga != 'n')
SD> >
SD> Aquí usas 'siga', pero previamente usas 'seguir'. Creo que te interesa
SD> comprobar el valor guardado en 'seguir'.
SD>     {
SD> >         for(f = 0; f <=nF; f++)
SD> >
SD> Esto es incorrecto. Como 'f' actúa de índice, no puede alcanzar el valor de
SD> 'nF', que representa la cantidad de filas.
SD> Debería ser,
SD> for( f=0; f<nF; f++ )
SD>         {
SD> >             for (c=0; c<nC; c++)
SD> >
SD> >             if (mat[f][c] == 1);
SD> >
SD> >             //Como hago aqui para definir una rutina que me permita
SD> > eliminar las filas que contengan al numero uno y me muestre las filas que
SD> > no contengan
SD> >             //al numero uno, en forma de una matriz 15x14.
SD> >
SD> >
SD> Para eliminar elementos en un array, vas a tener que copiar las filas
SD> posteriores a la que quieres eliminar, para no dejar "hueco". Luego puedes
SD> cambiar el tamaño con 'realloc()'. En tu caso, tienes que eliminar la
SD> memoria del array dinámico asociado al puntero de la fila que quieres
SD> eliminar.
SD> Ahora bien, leyendo este comentario, parece que te interesa más no mostrar
SD> ciertas filas en lugar de eliminarlas. Si es así, entonces simplemente
SD> comprueba si existe el 1 en una fila antes de mostrarla. De esta manera,
SD> aparecerá lo que quieres, sin tener que modificar el array.
SD> Espero que esto te oriente.
SD> Steven
SD> _______________________________________________
SD> Lista de correo Cconclase Cconclase en listas.conclase.net
SD> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SD> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


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