lectura de

Cree un programa que ordene los 100 registros dentro de un archivo mediante BubbleSort.
Asuma que el archivo ya existe y tiene estructuras del tipo.

struct tAlumno{ char nombre[20]; int promedio; }

Ordene el archivo respecto al promedio, de menor a mayor.
NO use arreglos y ordene todo dentro del MISMO archivo.

Código:

#include <stdio.h>

int main(int argc, char *argv[])
{
    typedef struct{
        char nombre[20+1]; /* +1 por el '\0' */
        int promedio;
    }tAlumno;

    int i, j, k;
    tAlumno s, tmp;
    FILE *alumnos = fopen("db.dat", "rb+");

    if(alumnos == NULL){
        printf("Ha ocurrido un error al abrir el archivo\n");
        return 1;
    }
    
    /* Obtener el numero de estructuras hay en el archivo */
    fseek(alumnos, 0, SEEK_END);
    k = ftell(alumnos ) / sizeof(tAlumno);
        
    /* Ordenar las estructuras !! */
    for(i=0; i<k; i++){
        rewind(alumnos);
        fread(&tmp, sizeof(tAlumno), 1, alumnos);
        for(j=0; j<k-i; j++){
            fread(&s, sizeof(tAlumno), 1, alumnos);
            if(tmp.promedio>s.promedio){
                /* Retroceder el largo de 2 estructuras*/
                fseek(alumnos, (-2)*sizeof(tAlumno), SEEK_CUR);
                
                /* escribir la estructura s */
                fwrite(&s, sizeof(tAlumno), 1, alumnos);
                
                /* escribir la estructura tmp */
                fwrite(&tmp, sizeof(tAlumno), 1, alumnos);
                
                /* Quedamos a donde mismo */
            }
            if(tmp.promedio<=s.promedio)
                /* si tmp es menor o igual que s, pasarle la pelota a s para que siga avanzando */
                tmp = s;
        }
    }
    
    /* Mostrar las estructuras ordenadas */
    rewind(alumnos);    
    while(fread(&s, sizeof(tAlumno), 1, alumnos)){
        printf("Nombre: %-20s\t\tPromedio: %3d\n", s.nombre, s.promedio);
    }
    fclose(alumnos);
    return 0;
}

/* by JPEG @ http://mammut.github.io */

Generador al azar de nombres y promedios, guardados en el archivo db.dat:

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

#define MAX_STRUCTS 100 /* Candidad de alumnos para generar */
#define MAX_NOM 20      /* Largo maximo de los nombres para generar */  
#define MIN_NOM 5       /* Largo minimo de los nombres para generar */


int main(int argc, char *argv[])
{
    srand(time(NULL));
    typedef struct{
        char nombre[20+1];  /* +1 por el '\0' */
        int promedio;
    }tAlumno;

    int i,jp,j,tmp; 
    tAlumno musik;
    FILE *alumnos = fopen("db.dat", "wb+"); /* + para mostrar abajo el archivo generado :P */

    if(alumnos == NULL){
        printf("Ha ocurrido un error al abrir el archivo\n");
        fclose(alumnos);
        return 1;
    }
    
    for(i=1; i<=MAX_STRUCTS; i++){      
        jp = rand()%(MAX_NOM-MIN_NOM+1)+MIN_NOM;        /* Largo del nombre al azar */
            for(j=0;j<jp;j++){  /* cada caracter al azar */
                tmp = rand()%27+97;
                if(tmp == 123)
                    musik.nombre[j] = ' ';
                else
                    musik.nombre[j] = tmp;
            }
            musik.nombre[j] = '\0';
            musik.promedio = rand()%100+1;  /* promedio al azar */
            fwrite(&musik, sizeof(tAlumno), 1, alumnos);
    }
    
    rewind(alumnos);
    while(fread(&musik, sizeof(tAlumno), 1, alumnos)){
        printf("Nombre: %-20s\t\t\tPromedio: %3d\n", musik.nombre, musik.promedio);
    }
    fclose(alumnos);
    return 0;
}

/* by JPEG @ http://mammut.github.io */


Eso seria... cualquier duda dejen un comentario.
Blog Logo

Juan Pablo Escalona G.


Publicado el

comments powered by Disqus
Image

JPEG {codes}

Códigos azarosos en múltiples lenguajes, JavaScript, Ruby, C, Python. Bienvenidos aquellos que quieran aprender.

Volver al inicio