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

Davidson, Steven srd4121 en njit.edu
Mar Dic 24 00:28:16 CET 2013


Hola Ali,

2013/12/21 Ali Rincon <alrincon1963 en hotmail.com>

> Hola a todos. A continuacion les envio el programa, en donde se calcula
> unas combinaciones y luego deseo imponer una condicion muy simple (la cual
> se explica en el programa) y lo que deseo es ver la matriz que debe quedar:
>
>
Hay algunos matices a destacar en el siguiente código fuente.

[CORTE]


>     /*Calculo de las combinaciones*/
>
>     f = 0;
>
>     for (i1 = 1; i1 <= 15; i1++)
>     {
>         for (i2 = i1 + 1; i2 <= 15; i2++)
>         {
>             for (i3 = i2 + 1; i3 <= 15; i3++)
>             {
>

[CORTE]

Estos bucles no logran el propósito que quieres. Analizando el
comportamiento de los bucles y de las variables, vemos que los valores de
las variables de los bucles posteriores no deberían llegan a 15, porque
nada ocurre en esas últimas iteraciones. Por ejemplo, si i1=15, entonces i2
es 16, por lo que no entra en "su bucle", ni por tanto en los demás bucles
anidados. Por consiguiente, los bucles deberían ser,

for( i1=1; i1<=15; i1++ )
  for( i2=i1+1; i2<=14; i2++ )
    for( i3=i2+1; i3<=13; i3++ )
      for( i4=i3+1; i4<=12; i4++ )
        ...

[CORTE]


>                                                             if ((i1 != i2)
> && (i1 != i3) && (i1 != i4) && (i1 != i5) &&
>                                                                 (i1 != i6)
> && (i1 != i7) && (i1 != i8) && (i1 != i9) &&
>

[CORTE]

Estas condiciones no son necesarias, porque siempre son verdad. 'i1' nunca
llegará a ser 'i2', porque 'i2' siempre es 1 más que 'i1'. Asimismo, 'i2'
nunca será igual a 'i3', en la misma iteración.

                                                                {
>                                                                     c = 0;
>
> mat[f][c] = i1;
>                                                                     c = c
> + 1;
>
> mat[f][c] = i2;
>

[CORTE]

No tiene mucho sentido usar 'c', porque el comportamiento de todas estas
sentencias es recorrer cada columna, por lo que podrías haber hecho
explícitamente. Esto es,

mat[f][0] = i1;
mat[f][1] = i2;
mat[f][2] = i3;
...
f++;

Como puedes ver, hacer las cosas explícitamente no es una buena forma de
expresarnos. Nos gustaría automatizar estas asignaciones; para ello,
necesitamos una solución general. Si definimos estas variables del bucle
como un array, en lugar de definirlas explícitamente, entonces podemos
recorrer el array con un índice. Esto es,

int pi = (int *) malloc( nC * sizeof(int) );
...
for( c=0; c<nC; c++ )
  mat[f][c] = pi[c];
f++;
...
free( pi );


Necesitas diseñar otro algoritmo para crear cada combinación y que sea
general; no solamente las 15 agrupaciones de 14 números.

    printf("\nDesea imponer alguna condicion sobre esta matriz (s/n)?: ");
>     scanf("%s", &seguir);
>

Esto puede suponer un grave error. La variable 'seguir' es de tipo 'char',
mientras que 'scanf()' espera un array de 'char'. Sugiero usar 'getchar()'
o usa el especificador %c para leer y extraer un solo carácter.

    if(siga != 'n')
>

Aquí usas 'siga', pero previamente usas 'seguir'. Creo que te interesa
comprobar el valor guardado en 'seguir'.

    {
>         for(f = 0; f <=nF; f++)
>

Esto es incorrecto. Como 'f' actúa de índice, no puede alcanzar el valor de
'nF', que representa la cantidad de filas.

Debería ser,

for( f=0; f<nF; f++ )

        {
>             for (c=0; c<nC; c++)
>
>             if (mat[f][c] == 1);
>
>             //Como hago aqui para definir una rutina que me permita
> eliminar las filas que contengan al numero uno y me muestre las filas que
> no contengan
>             //al numero uno, en forma de una matriz 15x14.
>
>
Para eliminar elementos en un array, vas a tener que copiar las filas
posteriores a la que quieres eliminar, para no dejar "hueco". Luego puedes
cambiar el tamaño con 'realloc()'. En tu caso, tienes que eliminar la
memoria del array dinámico asociado al puntero de la fila que quieres
eliminar.

Ahora bien, leyendo este comentario, parece que te interesa más no mostrar
ciertas filas en lugar de eliminarlas. Si es así, entonces simplemente
comprueba si existe el 1 en una fila antes de mostrarla. De esta manera,
aparecerá lo que quieres, sin tener que modificar el array.


Espero que esto te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20131223/3a7e7591/attachment.html>


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