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

Davidson, Steven srd4121 en njit.edu
Sab Ene 4 00:19:58 CET 2014


Hola Ali,

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

>
> Gracias nuevamente, Steven, por tu ayuda y orientación. Mira, realmente
> tienes razón con respecto a los indices, y concluyo que mi algoritmo no
> sirve para lo que pretendo. Me explico: Inicialmente el código funciona si
> pedimos eliminar las filas donde aparezca el numero 1 (tomado como ejemplo)
> de la matriz del fichero origen escrita como:
>
>
[CORTE]

el código no funciona. Y no funciona por la razón que tu dices. Al llegar a
> la ultima fila k=9, el programa no encuentra la fila k+1. Por esta razón lo
> que escribí no me sirve. Tu idea de almacenar las filas que me interesan
> eliminar (dado el valor por teclado) me parece muy buena. Yo había separado
> la tarea de búsqueda y eliminación, tal cual como a continuación te escribo:
>

El problema está aquí en la eliminación de las filas:

    for(i=0; i<indices; i++)
>

Te comenté que necesitas usar la cantidad actual de las filas y no la
cantidad máxima. Escribe:

for( i=0; i<indices-contarFilas; i++ )

Honestamente, no se como copiar las filas que me interesan de una matriz
> dada, donde los indices se almacenan en el vector filasparaeliminar[10]. Me
> puedes dar una idea de como hacer esto, por favor??
>

Podrías eliminar cada fila una a una, que es como lo tenías originalmente,
pero creo que conviene mudar todas las filas en un solo recorrido.

Sugiero implementar el método de inserción, pero usando el mismo array como
origen y destinatario. Recorre el array para buscar un hueco en el que
colocar la siguiente fila (válida). Se representa el "hueco" con el índice
de la fila guardado en el array, 'aFilasParaEliminar'. Necesitas dos
índices: uno para recorrer la matriz y otro para recorrer el array,
'aFilasParaEliminar';
también necesitamos una variable para indicar el "hueco". Analizando el
comportamiento, podemos tratar la primera fila a eliminar y la última como
casos especiales. Podemos saltarnos las primeras filas de la matriz y
comenzar el algoritmo directamente con la primera fila a eliminar. Por
ejemplo,

int indiceEliminar = 0;
...
hueco = aFilasParaEliminar[0];  // Podría haber escrito:  hueco =
aFilasParaEliminar[indiceEliminar], pero el resultado es el mismo
for( i=hueco+1; i<aFilasParaEliminar[contarFilas-1]; i++ )  // La última
fila: aFilasParaEliminar[contarFilas-1]
{
  ...
}

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.

Para el caso de la última fila a eliminar, no hace falta comprobar las
filas restantes, porque ya no hay más filas a eliminar. Por lo tanto, sólo
nos queda mudar esas filas restantes. Podemos hacer esto en otro bucle
después del bucle general anterior. Visto de otra manera, tenemos este
esquema:

// Caso general: copia condicionada
for( ... )
{
  if( fila a eliminar )
  {
    ...
  }
  else  // fila a copiar
  {
    ...
  }
}

// Caso especial: copia directa/regular
for( ... )
{
  // Copia las demás filas
  ...
}


Espero que todo esto te sirva.

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


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