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

Davidson, Steven srd4121 en njit.edu
Dom Ene 5 05:01:58 CET 2014


Hola Ali,

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

>
> Hola Steven. Creo que logre hacer algo en el código que te muestro a
> continuacion:
>

[CORTE]

El problema que tengo, y aqui entras tu, si me puedes ayudar por supuesto,
> es que no se como hacer para que la sentencia if(i != 9) lea todos los
> valores que estan contenidos en el vector filasparaeliminar[] cada vez que
> se repita el bucle:
> .
> .
> .
> //Remover la fila donde se encuentre el valor introducido por teclado.
>
>     m=0;
>     for(i=0; i<10; i++)
>     {
>         if(i != 9)<--Aqui no se como hacer!!!
>

Esta condición no tiene mucho sentido, porque sabemos de antemano su
veracidad. Sabemos que siempre será verdadera las primeras 8 iteraciones y
siempre será falsa la última iteración. Por lo tanto, no tiene sentido
"castigar" al procesador a hacer algo que nosotros ya sabemos.

Como no nos interesa hacer la última iteración, simplemente no llegamos a
tal iteración en nuestro bucle. Por lo tanto, escribimos,

for( i=0; i<9; i++ )

        {
>             n=0;
>             for(j=0; j<10; j++)
>

No necesitas 'n', porque se comporta de manera idéntica a 'j', por lo que
puedes usar 'j' en lugar de 'n'.

            {
>                 matriz[m][n] = matriz[i][j];
>

'm' también se comporta como 'i', por lo que puedes usar 'i' directamente.

Esto significa que tenemos,

matriz[i][j] = matriz[i][j];

No estoy entendiendo muy bien por qué estás haciendo esta asignación.

                n++;
>             }
>             m++;
>         }
>     }
> .
> .
> .
> Obviamente los indices en la parte de mostrar matriz deberán modificarse
> acorde a esto.
>
>
Sí, por eso necesitas usar la variable 'indices' para guardar la cantidad
actual de filas (válidas).


Volviendo a tu pregunta original, la verdad es que la contesté en mi
correo-e anterior:

Ahora vamos comprobando cada fila por si se elimina o no. Si no se elimina
la fila, que estamos procesando, entonces la copiamos al "hueco" y
aumentamos el "hueco" para la siguiente comprobación. Si tal fila sí se
elimina, entonces la ignoramos: no se copia, y aumentamos 'indiceEliminar'
para indicar la siguiente fila a eliminar.

La idea es ir comprobando cada fila, representada por su índice, que podría
ser:

int indiceEliminar = 0;
...
// Caso general: copia condicionada
hueco = aFilasParaEliminar[0];
for( i=hueco+1; i<aFilasParaEliminar[contarFilas-1]; i++ )
{
  if( i == aFilasParaEliminar[indiceEliminar] )
  {
    // Si tal fila sí se elimina, entonces la ignoramos: no se copia, y
aumentamos 'indiceEliminar' para indicar la siguiente fila a eliminar.
    indiceEliminar++;
  }
  else
  {
    // Si no se elimina la fila, que estamos procesando, entonces la
copiamos al "hueco" y aumentamos el "hueco" para la siguiente comprobación.
    for( ... )
    {
      // Copiamos esta fila "i" al "hueco"
      ...
    }
    hueco++;
  }
}

// Caso especial: copia directa/regular
// Al llegar aquí, i == aFilasParaEliminar[contarFilas-1]
// Copiamos a partir de "hueco"
for( i++; hueco < indices-contarFilas; hueco++, i++ )
{
  // Copia las demás filas
  for( .... )
    matriz[hueco][j] = matriz[i][j];
}


Analiza bien el código que he escrito, porque lo he hecho de cabeza y es
posible que haya cometido algún error, pero se basa en el análisis y diseño
que ya expliqué en mi correo-e anterior.


Espero que esto aclare el tema.

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


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