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

Ali Rincon alrincon1963 en hotmail.com
Jue Ene 2 01:56:02 CET 2014


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.

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

int main()
//void main()
{
    int matriz[10][10];
    int i,j,k;
    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 y eliminacion de filas.

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

    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", i);
                printf("\n");
                contarfilas=contarfilas+1;
                posicion = i;

                for(k=posicion; k<(indices-contarfilas); k++)  //Con este bucle deberian de retroceder las filas!!
                {
                   for(j=0; j<10; j++)
                   {
                       matriz[k][j] = matriz[k+1][j];
                   }
                }
            }
        }
    }

    printf("El numero de filas en que se encuentra el numero %d son: %d", valor, contarfilas);
    printf("\n");
    printf("La matriz final sera: \n");
    printf("\n");

    for(i=0; i<(indices-contarfilas); 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;
}
La salida que produce el programa para el caso que te comenté arriba es este:

Introduzca el nombre del fichero origen: c:\matriz2.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  94  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: 2
El valor se encuentra en la fila: 6
El numero de filas en que se encuentra el numero 1 son: 3
La matriz final sera:

  11  12  13  14  15  16  17  18  19  20

  21  22  23  24  25  26  27  28  29  30

  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

  91  92  93  94  95  96  97  98  99 100


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


Te agradezco de antemano tu gentileza y atención al respecto.

Ali Rincon


El pasado 2013-12-31 01:47:33, Steven Davidson escribió:
 
SD> Hola Ali,
SD> 2013/12/30 Ali Rincon <alrincon1963 en hotmail.com>
SD> > He estado investigando como "eliminar" filas en una matriz cualquiera y
SD> > creo que conseguí hacer algo simpático y funcional. Aunque no es lo que
SD> > exactamente estoy tratando de solucionar, si me sirve para mejorar el
SD> > código y hacerlo un poco mas general. Sin embargo tengo un problema con la
SD> > salida de la matriz final la cual no consigo hacerla bien, es decir, se
SD> > mezclan algunas filas al final y desearía saber si alguien pudiera decirme
SD> > cual es el error o que es lo que me hace falta en el código.
SD> >
SD> >
SD> Veamos el código fuente.
SD> Aquí envío el código:
SD> >
SD> >
SD> >
SD> [CORTE]
SD>     //Remover la fila donde se encuentre el valor
SD> >
SD> >     for(k=posicion; k<indices; k++)
SD> >
SD> Esto va a suponer un problema, porque usas el índice 'k+1'. Por lo tanto,
SD> si 'k' llega al último índice, eprintf("\n");ntonces accederás a la siguiente "fila",
SD> que no existe. Por ejemplo, si 'indices' es 10, entonces k=9, pero
SD> accederás a la fila 10, que obviamente está fuera de las limitaciones del
SD> array.
SD> Debes usar 'indices-1', por lo que aconsejo que hagas la resta de 'indices'
SD> antes del bucle 'for'; esto es,
SD> indices--;
SD> for( k=posicion; k<indices; k++ )
SD>   for( j=0; j<10; j++ )
SD>     matriz[k][j] = matriz[k+1][j];
SD> Ahora, los intervalos de los índices son correctos:
SD> k    := [posicion,8]
SD> k+1 := [posicion+1,9]
SD> Otro matiz a destacar es que al buscar el valor para eliminar su fila,
SD> sigues buscando a pesar de haberlo encontrado. Deberías salirte de los
SD> bucles 'for' una vez que hayas encontrado lo que buscas. Dicho esto,
SD> también deberías tener en cuenta la posibilidad de que no encuentre tal
SD> valor pedido a eliminar. Si es el caso, entonces no deberías eliminar nada,
SD> especialmente por el hecho de que 'posicion' no contiene un valor deseado -
SD> es basura; esto puede provocar grandes errores, ya que usas 'posicion' como
SD> índice en la matriz.
SD> Espero que esto te aclare las dudas.
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


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