analisis codigos de ordenamiento

Iniciado por m@o_614, 18 Septiembre 2013, 18:59 PM

0 Miembros y 2 Visitantes están viendo este tema.

m@o_614

Saludos rir3760 ya le quite al codigo la libreria unistd.h, ya entendi que no es necesario usarla, pero con respecto al feof no tengo idea de que otra manera sustituirlo.le hice unos cambios al codigo para que en vez de que me imprimiera el vector ordenado en el archivo me imprima el numero de intercambios que se hacen en el metodo de ordenamiento pero me imprime una cantidad que no es en un arreglo  desordenado me dice que solo necesita un intercambio

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

void Ordenacion_Burbuja(int v[],int n,FILE *fd);
void analizar_Burbuja(char nombreArchivo[],FILE *fd,int n);

int main()
{
    FILE *fd;
    if((fd = fopen("F:\\Analisis_algoritmos.txt","w"))!=NULL)
    {/*
        analizar_Burbuja("5-Ordenados",fd,5);
        analizar_Burbuja("10-Ordenados",fd,10);
        analizar_Burbuja("100-Ordenados",fd,100);
        analizar_Burbuja("1000-Ordenados",fd,1000);
        analizar_Burbuja("10000-Ordenados",fd,10000);
        analizar_Burbuja("100000-Ordenados",fd,100000);
        analizar_Burbuja("1000000-Ordenados",fd,1000000);*/

        analizar_Burbuja("5-Desordenados",fd,5);/*
        analizar_Burbuja("10-Desordenados",fd,10);
        analizar_Burbuja("100-Desordenados",fd,100);
        analizar_Burbuja("1000-Desordenados",fd,1000);
        analizar_Burbuja("10000-Desordenados",fd,10000);
        analizar_Burbuja("100000-Desordenados",fd,100000);
        analizar_Burbuja("1000000-Desordenados",fd,1000000);*/

    }
    else
       printf("No se pudo leer archivo");
    return 0;
}

void Ordenacion_Burbuja(int v[],int n,FILE *fd)
{
    int i,j,aux,intercambio=0;
    for(i=1;i < n;i++)
    {
        for(j=0;j < n-i;j++)
        {
            if(v[j] > v[j+1])
            {
                aux = v[j+1];
                v[j+1] = v[j];
                v[j] = aux;
                intercambio++;
            }
        }
    }
    fprintf(fd,"El numero de intercambios es %d",intercambio);
}

void analizar_Burbuja(char nombreArchivo[],FILE *fd,int n)
{
    int i;
    FILE *entrada;
    int *arreglo;
    char ruta[50];

    sprintf(ruta,"F:\\%s.txt",nombreArchivo);
    puts(ruta);

    if((entrada = fopen(ruta,"r"))!=NULL)
    {
        arreglo = (int*)malloc(n*sizeof(int));
        i = 0;
        while(!feof(entrada))
        {
            fscanf(entrada,"%d",&arreglo[i]);
            i++;
        }
        Ordenacion_Burbuja(arreglo,n,fd);
    }
    else
       printf("No se pudo abrir archivo");

}


de antemano gracias

rir3760

Cita de: m@o_614 en 22 Septiembre 2013, 19:33 PMcon respecto al feof no tengo idea de que otra manera sustituirlo.
Solo tienes que verificar el valor de retorno de la función de entrada/salida, casi todas retornan un valor particular en caso de error o fin de archivo.

En el caso de fscanf esta retorna el numero de conversiones realizadas con exito o EOF en caso de error o fin de archivo, tu bucle:
i = 0;
while(!feof(entrada))
{
   fscanf(entrada,"%d",&arreglo[i]);
   i++;
}

Realiza una iteración de mas y es demasiado largo. Utilizando el valor de retorno de fscanf se puede reducir a:
for (i = 0; i < n && fscanf(entrada, "%d", arreglo + i) == 1; i++)
   ;

Se debe realizar la verificación "i < n" para asegurarnos de no leer mas de lo que se puede almacenar en el bloque de memoria.

Cita de: m@o_614 en 22 Septiembre 2013, 19:33 PMle hice unos cambios al codigo para que en vez de que me imprimiera el vector ordenado en el archivo me imprima el numero de intercambios que se hacen en el metodo de ordenamiento pero me imprime una cantidad que no es en un arreglo  desordenado me dice que solo necesita un intercambio
Si el archivo de entrada es correcto (texto plano) el programa da los resultados esperados, eso lo debes verificar en tu PC.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language