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

Ali Rincon alrincon1963 en hotmail.com
Dom Ene 5 00:53:42 CET 2014


El pasado 2014-01-03 23:19:58, Steven Davidson escribió:
 
SD> Hola Ali,
SD> 2014/1/3 Ali Rincon <alrincon1963 en hotmail.com>
SD> >
SD> > Gracias nuevamente, Steven, por tu ayuda y orientación. Mira, realmente
SD> > tienes razón con respecto a los indices, y concluyo que mi algoritmo no
SD> > sirve para lo que pretendo. Me explico: Inicialmente el código funciona si
SD> > pedimos eliminar las filas donde aparezca el numero 1 (tomado como ejemplo)
SD> > de la matriz del fichero origen escrita como:
SD> >
SD> >
SD> [CORTE]
SD> el código no funciona. Y no funciona por la razón que tu dices. Al llegar a
SD> > la ultima fila k=9, el programa no encuentra la fila k+1. Por esta razón lo
SD> > que escribí no me sirve. Tu idea de almacenar las filas que me interesan
SD> > eliminar (dado el valor por teclado) me parece muy buena. Yo había separado
SD> > la tarea de búsqueda y eliminación, tal cual como a continuación te escribo:
SD> >
SD> El problema está aquí en la eliminación de las filas:
SD>     for(i=0; i<indices; i++)
SD> >
SD> Te comenté que necesitas usar la cantidad actual de las filas y no la
SD> cantidad máxima. Escribe:
SD> for( i=0; i<indices-contarFilas; i++ )
SD> Honestamente, no se como copiar las filas que me interesan de una matriz
SD> > dada, donde los indices se almacenan en el vector filasparaeliminar[10]. Me
SD> > puedes dar una idea de como hacer esto, por favor??
SD> >
SD> Podrías eliminar cada fila una a una, que es como lo tenías originalmente,
SD> pero creo que conviene mudar todas las filas en un solo recorrido.
SD> Sugiero implementar el método de inserción, pero usando el mismo array como
SD> origen y destinatario. Recorre el array para buscar un hueco en el que
SD> colocar la siguiente fila (válida). Se representa el "hueco" con el índice
SD> de la fila guardado en el array, 'aFilasParaEliminar'. Necesitas dos
SD> índices: uno para recorrer la matriz y otro para recorrer el array,
SD> 'aFilasParaEliminar';
SD> también necesitamos una variable para indicar el "hueco". Analizando el
SD> comportamiento, podemos tratar la primera fila a eliminar y la última como
SD> casos especiales. Podemos saltarnos las primeras filas de la matriz y
SD> comenzar el algoritmo directamente con la primera fila a eliminar. Por
SD> ejemplo,
SD> int indiceEliminar = 0;
SD> ...
SD> hueco = aFilasParaEliminar[0];  // Podría haber escrito:  hueco =
SD> aFilasParaEliminar[indiceEliminar], pero el resultado es el mismo
SD> for( i=hueco+1; i<aFilasParaEliminar[contarFilas-1]; i++ )  // La última
SD> fila: aFilasParaEliminar[contarFilas-1]
SD> {
SD>   ...
SD> }
SD> Ahora vamos comprobando cada fila por si se elimina o no. Si no se elimina
SD> la fila, que estamos procesando, entonces la copiamos al "hueco" y
SD> aumentamos el "hueco" para la siguiente comprobación. Si tal fila sí se
SD> elimina, entonces la ignoramos: no se copia, y aumentamos 'indiceEliminar'
SD> para indicar la siguiente fila a eliminar.
SD> Para el caso de la última fila a eliminar, no hace falta comprobar las
SD> filas restantes, porque ya no hay más filas a eliminar. Por lo tanto, sólo
SD> nos queda mudar esas filas restantes. Podemos hacer esto en otro bucle
SD> después del bucle general anterior. Visto de otra manera, tenemos este
SD> esquema:
SD> // Caso general: copia condicionada
SD> for( ... )
SD> {
SD>   if( fila a eliminar )
SD>   {
SD>     ...
SD>   }
SD>   else  // fila a copiar
SD>   {
SD>     ...
SD>   }
SD> }
SD> // Caso especial: copia directa/regular
SD> for( ... )
SD> {
SD>   // Copia las demás filas
SD>   ...
SD> }
SD> Espero que todo esto te sirva.
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


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


#include <stdio.h>
#include <stdlib.h>

//Matrizprueba4.
//Programa que elimina todas las filas donde aparezca el valor dado por
//teclado, de una matriz 10x10 leida de un fichero origen y muestra la
//matriz final reducida.

int main()
//void main()
{
    int matriz[10][10];
    int filasparaeliminar[10];
    int i,j,k,m,n;
    int valor,posicion,contarfilas;
    int indices=10;
    char nombrefichero[40];
    FILE *fichero;

    //Lectura del fichero origen.

    printf("\nIntroduzca el nombre del fichero origen: ");
    scanf("%s39[^\n]s",nombrefichero);
    printf("\n");

    fichero = fopen(nombrefichero, "r");

    if (fichero != NULL)
    {
        for(i=0; i<10; i++)
        {
            for(j=0; j<10; j++)
            {
                fscanf(fichero, "%d", &matriz[i][j]);
            }
        }

    //Visualizar la matriz.

    for(i=0; i<10; i++)
    {
        for(j=0; j<10; j++)
        {
            printf("%4d", matriz[i][j]);
        }
        printf("\n\n");
    }

    //Imposicion de la condicion.

    printf("Introduzca el numero cuya fila sera eliminada: ");
    scanf("%d", &valor);

    contarfilas=0;
    for(i=0; i<10; i++)
    {
        for(j=0; j<10; j++)
        {
            if(matriz[i][j] == valor)
            {
                printf("El valor se encuentra en la fila: %d", i);
                printf("\n");
                filasparaeliminar[contarfilas++]=i;
                //contarfilas=contarfilas+1;
            }
        }
    }
    printf("El numero de filas en que se encuentra el numero %d son: %d", valor, contarfilas);
    printf("\n");

    printf("\nfilasparaeliminar = ");
    for(k=0; k<4; k++)
    {
        printf("%d ",filasparaeliminar[k]);
    }
    printf("\n\n");

    //Remover la fila donde se encuentre el valor introducido por teclado.

    m=0;
    for(i=0; i<10; i++)
    {
        if(i != 9)
        {
            n=0;
            for(j=0; j<10; j++)
            {
                matriz[m][n] = matriz[i][j];
                n++;
            }
            m++;
        }
    }

    //Mostrar la matriz final reducida.

    printf("La matriz final sera: \n");
    printf("\n");

    for(i=0; i<indices-1; i++)
    {
        for(j=0; j<10; j++)
        {
            printf("%4d", matriz[i][j]);
        }
        printf("\n\n");
    }

    //Cerrar fichero.

    fclose(fichero);
    }
    else
        printf("Error al abrir el fichero");

    //Fin del programa.



    return 0;
}


El programa efectivamente elimina cualquier fila que este en el vector filasparaeliminar[10]. En el caso anterior elimina la fila 9, como te muestro a continuacion:


Introduzca el nombre del fichero origen: c:\matriz4.txt

   1   2   3   4   5   6   7   8   9  10

  11  12  13  14  15  16  17  18  19  20

  21  22  23  24  25  26  27  28  29  30

  31  32  33  34  35  36   1  38  39  40

  41  42  43  44  45  46  47  48  49  50

  51  52  53  54  55  56  57  58  59  60

  61  62  63  64  65  66  67  68  69  70

  71  72  73  74  75  76  77  78  79  80

  81  82  83  84  85  86  87   1  89  90

  91  92  93   1  95  96  97  98  99 100

Introduzca el numero cuya fila sera eliminada: 1
El valor se encuentra en la fila: 0
El valor se encuentra en la fila: 3
El valor se encuentra en la fila: 8
El valor se encuentra en la fila: 9
El numero de filas en que se encuentra el numero 1 son: 4

filasparaeliminar = 0 3 8 9

La matriz final sera:

   1   2   3   4   5   6   7   8   9  10

  11  12  13  14  15  16  17  18  19  20

  21  22  23  24  25  26  27  28  29  30

  31  32  33  34  35  36   1  38  39  40

  41  42  43  44  45  46  47  48  49  50

  51  52  53  54  55  56  57  58  59  60

  61  62  63  64  65  66  67  68  69  70

  71  72  73  74  75  76  77  78  79  80

  81  82  83  84  85  86  87   1  89  90


Process returned 0 (0x0)   execution time : 9.844 s
Press any key to continue.

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!!!
        {
            n=0;
            for(j=0; j<10; j++)
            {
                matriz[m][n] = matriz[i][j];
                n++;
            }
            m++;
        }
    }
.
.
.
Obviamente los indices en la parte de mostrar matriz deberán modificarse acorde a esto.

De verdad, te agradezco altamente toda la ayuda y orientacion que me has prestado. Mira, si deseas enviarme algun archivo puedes hacerlo a la direccion de correo alrincon1963 en hotmail.com.

Ali Rincon



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