[C con Clase] Ayuda con la salida de la matriz final.

Davidson, Steven srd4121 en njit.edu
Vie Ene 3 19:23:03 CET 2014


Hola Ali,

2014/1/1 Ali Rincon <alrincon1963 en hotmail.com>

> Holq Steven, gracias nuevamente por tu gentileza en responderme. Resolví
> mi problema y era simplemente que había olvidado una instrucción simple y
> que la había pasado por alto. Con introducir printf("\n") la matriz final
> reducida sale correctamente en la parte de mostrar matriz final. Ahora con
> relación a lo que dices, es cierto, existe una inconsistencia cuando k=9,
> Sin embargo, si introduzco indices--; antes del primer bucle for, que es
> para leer las filas, el programa arroja un resultado incorrecto.
> Simplemente se lo coloque a la condición del primer bucle for( k=posición;
> k<indices-1; k++ ), y listo el programa corre y es mas consistente.
>
> Ahora, deseo pedirte, si puedes ayudarme en una complicación adicional al
> código anterior. Ahora tengo la misma matriz anterior 10x10, pero el numero
> 1 (por ejemplo), se repite varias veces en diferentes filas y se desea
> eliminar nuevamente dichas filas. Obviamente la dimensionalidad de la
> matriz resultante es importante, pero en el caso general ésta no se sabe.
> Aquí si, pues estamos tratando con una matriz simple 10x10. Aquí te envió
> lo que hice, el programa corre y muestra la matriz final reducida para el
> caso de un valor escogido (en este caso escogí el valor de 1), pero tengo
> problemas con las filas, pues después de cada bucle for, la matriz se va
> reduciendo y el programa lee esta ultima matriz y las filas donde aparece
> el numero 1, no coinciden con la matriz original, obviamente. Mi problema
> es como hago para corregir este fallo.
>
>
- Hay dos soluciones:

1. Ajusta el valor mostrado que se desplaza según la cantidad de filas
eliminadas. Siguiendo tu ejemplo, tenemos,

El valor se encuentra en la fila: 0
El valor se encuentra en la fila: 2
El valor se encuentra en la fila: 6

Cuando debería ser:

El valor se encuentra en la fila: 0
El valor se encuentra en la fila: 3
El valor se encuentra en la fila: 8

Podemos ajustar cada índice por el número de eliminaciones - guardado en
'contarfilas'; esto es,

El valor se encuentra en la fila: 0 + 0
El valor se encuentra en la fila: 2 + 1
El valor se encuentra en la fila: 6 + 2

En general,

printf( "El valor se encuentra en la fila: %d\n", i + contarfilas );


2. En lugar de hacer la búsqueda y eliminación en la misma iteración,
separamos las dos tareas. Esto implica que tenemos que guardar los índices
para las filas a eliminar. Por ejemplo,

int aFilasParaEliminar[10] = { 0 };
...
// Buscar filas a eliminar
contarFilas = 0;
for( i=0; i<indices; i++ )
  for( j=0; j<10; j++ )
    if( matriz[i][j] == valor )
    {
      printf( "El valor se encuentra en la fila: %d\n", i );
      aFilasParaEliminar[contarFilas++] = i;
    }

// Eliminar las filas encontradas
...


- Deberías usar 'indices-contarFilas' si no eliges la segunda solución. No
interesa rebasar la cantidad actual de filas en la matriz, porque
estaríamos repitiendo la comprobación y posiblemente hallemos erróneamente
una fila previamente eliminada al final de la matriz, que la queremos
eliminar otra vez. Por ejemplo,

1   2   3   4   5   6   7   8   9   10
...
81  82  83  84  85  86  87   1  89  90

91  1   93  94  95  96  97  98  99 100

Recuerda que al eliminar una fila, tu algoritmo realmente la eliminar
mudando todas las otras filas a una fila anterior, por lo que obtendremos:

...
81  82  83  84  85  86  87   1  89  90

91  1   93  94  95  96  97  98  99 100

91  1   93  94  95  96  97  98  99 100

Y luego, será:

...
91  1   93  94  95  96  97  98  99 100

91  1   93  94  95  96  97  98  99 100

91  1   93  94  95  96  97  98  99 100


Aunque tu algoritmo no realice la copia, en este ejemplo sí indicará que ha
encontrado otras dos filas a eliminar, cuando actualmente no deberían
existir. Esto ocurre cuando se debe eliminar la última fila, porque durante
el proceso de eliminación, sólo mudamos los datos, pero los datos de la
última fila siguen existiendo. Por ello, debes procurar usar la cantidad
actual. Como no quieres modificar 'indices', entonces tienes que reajustar
la cantidad con el desplazamiento 'contarFilas'.


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/20140103/44c94a3d/attachment.html>


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