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