lunes, 29 de agosto de 2011

Ordenación de fichero por el método de selección directa

Aplicación que genera un fichero binario con estructuras que contienen dos datos de tipo entero, uno conteniendo un NIF y otro un importe.

La aplicación realiza una ordenación del archivo por el método del algoritmo de selección directa, ordenando por el número de DNI.

Enlace Codepad
http://codepad.org/eLInSOFS


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Código Fuente
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


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

struct Tficha
{
int dni;
int importe;
};

int vaf_aleatorio_entre (int minimo, int maximo);
void escribir (void);
void leer (void);
void ordenar_fichero_seleccion_directa (void);
void ordenar_fichero_burbuja (void);

int main()
{
    srand ( time(NULL) );

    escribir ();

    leer ();

    //getchar ();

    printf ("\nOrdenando fichero, por favor espere un momento...\n");

    ordenar_fichero_seleccion_directa();

    //getchar ();

    leer();

    //getchar ();

    return 0;
}

void leer (void)
{
    struct Tficha ingreso;
    FILE * fichero;
    int i=1;

    fichero = fopen("datos.dat", "rb");

    while (!feof(fichero))
    {
        fread (&ingreso, sizeof(ingreso), 1,fichero);
        if (!feof(fichero)) printf("%06d - %d %d\n", i, ingreso.dni,ingreso.importe);
        i++;
    }

    fclose(fichero);
}


void escribir (void)
{
    struct Tficha ingreso;
    FILE * fichero;
    int i=0;

    fichero = fopen("datos.dat", "wb");

    //printf("\nO valor xerado e %d", vaf_aleatorio_entre(10, 20));

    for (i = 0; i < 1000; i++)
    {
        ingreso.dni = vaf_aleatorio_entre(10000000, 99999999);
        ingreso.importe = vaf_aleatorio_entre(10, 99999);
        fwrite (&ingreso, sizeof(ingreso), 1,fichero);
    }

    fclose(fichero);
}


void ordenar_fichero_seleccion_directa (void)
{
    struct Tficha auxiliar, menor, actual;
    FILE * fichero;
   	int i, j,pos_menor, total_estructuras;

    //se abre el fichero como rb+ para poder sobreescribir los datos
    fichero = fopen("datos.dat", "rb+");

    //nos colocamos al final del fichero y con ftell y sizeof obtenemos el
    //numero total de estructuras almacenadas en el fichero
    fseek (fichero, 0, SEEK_END);
    total_estructuras = ftell (fichero) / sizeof (struct Tficha);

    printf("\nO numero de estructuras e: %d, comezando proceso de ordenacion\n", total_estructuras);

    //regresamos al principio del fichero
    rewind(fichero);

	for (i=0; i<=(total_estructuras - 2); i++) //k es la posicion de la estructura que se esta a pegar
	{
	    pos_menor=i;

		fseek (fichero, i * sizeof (struct Tficha), SEEK_SET);

		//leemos en ficha aux la posicion a escribir
		fread (&menor, sizeof (struct Tficha), 1, fichero);

		auxiliar = menor;

		for (j=i+1; j<=(total_estructuras - 1); j++)
		{
            fseek (fichero, j * sizeof (struct Tficha), SEEK_SET);

            //leemos en ficha aux la posicion a escribir
            fread (&actual, sizeof (struct Tficha), 1, fichero);


            if (actual.dni < menor.dni)
            {
                pos_menor=j;
                menor=actual;
            }
		}

        if (pos_menor != i)
        {
            fseek (fichero, i * sizeof (struct Tficha), SEEK_SET);

            //leemos en ficha aux la posicion a escribir
            fwrite (&menor, sizeof (struct Tficha), 1, fichero);
            //vector[i] = vector[k];

            fseek (fichero, pos_menor * sizeof (struct Tficha), SEEK_SET);

            //leemos en ficha aux la posicion a escribir
            fwrite (&auxiliar, sizeof (struct Tficha), 1, fichero);
        }
	}

    fclose(fichero);

}

int vaf_aleatorio_entre (int minimo, int maximo)
{
    // Inicizase o xerador de números aleatorios
    //srand ( time(NULL) );

    // Xeramos un número aleatorio entre minimo e maximo
    return rand () % (maximo-minimo+1) + minimo;
}

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...