Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/05/2010, 05:37
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
ordenar fichero por orden alfabético

Hola, el siguiente programa da de alta ciclistas y he creado un subprograma usando el quicksort para ordenar el nombre de los equipos alfabéticamente. Quiero que me muestre por pantalla los equipos ordenados seguido del tiempo realizado por cada equipo, pero no me sale.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NUM_EQUIPOS 4
  6.  
  7. #define LEE_CAR(c)\
  8.         c=getchar();\
  9.         while((c=='\n') || (c==' ') || (c=='\t'))\
  10.             c=getchar();
  11.  
  12. #define LEE_CAD(c,n) { int i=0; \
  13.                      c[i]=getchar();\
  14.              while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  15.              while ((c[i]!='\n') && (i < (n-1))){ \
  16.                 i++;\
  17.             c[i]=getchar(); }\
  18.              c[i]='\0'; }
  19.  
  20. typedef struct {
  21.     int dorsal;
  22.     char equipo[20];
  23.     char nom[50];
  24.     char apell[100];
  25.     char nacion[30];
  26.     double tiempo;
  27. } ciclista;
  28.  
  29. int main(){
  30.     void crear_fich();
  31.        
  32.    
  33.    
  34.         int ordenar_por_equipos(FILE *);  
  35.    
  36.        
  37.     char op;
  38.  
  39.         FILE * pf; /* Puntero al fichero */
  40.         /* Abre el fichero para trabajar con él en Lectura / Escritura */
  41.         if((pf = fopen("tour_france.dat", "rb+")) == NULL) {
  42.            /* Si no existe, ejecuta el módulo que lo cree */
  43.        crear_fich();
  44.        /* Una vez creado lo habre en lectura/escritura */
  45.            if((pf = fopen("tour_france.dat", "rb+")) == NULL) {
  46.         perror("Fichero no accesible");
  47.                 exit(3);
  48.        }
  49.         }
  50.         do {
  51.         printf("Elija opción:\n1--> Crear el fichero del Tour\n");
  52.         printf("2--> Ordenar el fichero\n 3--> Salir");
  53.                
  54.                 do{
  55.                      LEE_CAR(op);
  56.                 }while((op < '1') || (op > '3'));
  57.        
  58.         switch(op) {
  59.             case '1': { crear_fich(pf);
  60.                     /* Una vez creado lo habre en lectura/escritura */
  61.                     if((pf = fopen("tour_france.dat", "rb+")) == NULL) {
  62.                     perror("Fichero no accesible");
  63.                             exit(3);
  64.                     }
  65.                     break; }
  66.             case '2': {ordenar_por_equipos(pf); break;}
  67.                      
  68.         } /* switch */
  69.     }while (op!= '9');
  70.         if(fclose(pf) == EOF)
  71.         printf("Error al cerrar el fichero, compruebe si ha perdido información\n");
  72.         exit(0);
  73. } /* main() */
  74. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. void crear_fich(FILE* pf) {
  76.          char otro;
  77.          ciclista nuevo_corredor;
  78.  
  79.      if((pf = fopen("tour_france.dat", "wb")) == NULL) {
  80.         perror("Al crear el fichero de Tour de Francia");
  81.                 exit(1);
  82.          }
  83.          
  84.          /* Lectura de los ciclistas */
  85.          do {
  86.         printf("Deme el dorsal(entero): "); scanf("%d",&nuevo_corredor.dorsal);
  87.                 printf("Equipo: "); LEE_CAD(nuevo_corredor.equipo, 20);
  88.         printf("Nombre: "); LEE_CAD(nuevo_corredor.nom, 50);
  89.         printf("Apellidos: "); LEE_CAD(nuevo_corredor.apell, 100);
  90.         printf("Nacionlidad: "); LEE_CAD(nuevo_corredor.nacion, 30);
  91.                 nuevo_corredor.tiempo = 0.0;
  92.         printf("Tiempo: "); scanf("%lf",&nuevo_corredor.tiempo);
  93.                 /*Escribe el corredor en el fichero */
  94.                 fwrite(&nuevo_corredor, sizeof(ciclista),1, pf);
  95.         printf("¿Otro? (s/n) ");
  96.                 LEE_CAR(otro);
  97.     }while((otro=='s') || (otro=='S'));
  98.     if(fclose(pf) == EOF){
  99.         printf("Error al cerrar el fichero, compruebe si hay información\n");  
  100.                 exit(2);
  101.         }
  102. } /* crear_fich()*/
  103. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  104. int ordenar_por_equipos(FILE * pf){
  105.    ciclista *p;
  106.    char nom_equipo[100];
  107.    double tiempo;
  108.    int n,i;
  109.    
  110.    int ordenar();
  111.      
  112.    printf("Cuantas personas vamos a leer: ");
  113.    scanf("%d",&n);
  114.    p=(ciclista*)calloc(n,sizeof(ciclista));
  115.    
  116.    for(i=0; i < n; i++) {
  117.       printf("Nombre del equipo: ");
  118.       LEE_CAD(nom_equipo,100);
  119.       strcpy((p+i)->equipo,nom_equipo);
  120.       printf("Tiempo: ");
  121.       scanf("%lf",(p+i)->tiempo);
  122.    }  
  123.      
  124.    qsort(p,n,sizeof(ciclista),ordenar);
  125.    
  126.    for(i=0; i < n; i++)
  127.       printf("%s\t%.2lf\n",(p+i)->equipo,(p+i)->tiempo);
  128.      
  129.    exit(0);    
  130. }
  131.  
  132. int ordenar(ciclista *c1, ciclista *c2){
  133.     return(strcmp(c1->equipo, c2->equipo));
  134. }