Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/04/2010, 04:38
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
ordenar fichero por tiempos

Hola, el enunciado dice así: El Comité del Tour de Francia, nos ha pedido un programa para la gestión de la información de la clasificación de la carrera. La información necesaria es:

Número del dorsal.
Equipo.
Nombre.
Apellido.
Nacionalidad.
Tiempo acumulado.

Sobre esta información, almacenada en un fichero, se necesita realizar las operaciones siguientes:

Crear el fichero con todos los participantes.
Buscar fichas usando el dorsal para actualizar el tiempo acumulado.
Cálculo de la clasificación por equipos (suma de los tiempos de los miembros del equipo).
Ordenar el fichero según el tiempo de los corredores.
Listar el fichero por tiempos.
Listar el fichero por tiempos y equipos.
Dar de baja dorsales.

Lo que he hecho es, por un lado, crear un fichero donde doy de alta los ciclistas, busco una ficha para actualizar el tiempo y sumo todos los tiempos de los miembros. Es este:

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define LEE_CAR(c)\
  6.           c=getchar();\
  7.           while((c=='\n') || (c==' ') || (c=='\t'))\
  8.             c=getchar();
  9.  
  10. #define LEE_CAD(c,n) { int i=0;\
  11.                        c[i]=getchar();\
  12.                        while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  13.                        while((c[i]!='\n') && (i<(n-1))){ \
  14.                           i++;\
  15.                           c[i]=getchar(); }\
  16.                        c[i]='\0';}
  17.  
  18. typedef struct{
  19.          char num_dorsal[3];
  20.          char equipo[50];
  21.          char nom[50];
  22.          char ape[50];
  23.          char nacionalidad[50];
  24.          float tiempo_acum;
  25. }ciclista;
  26.  
  27. void alta_ciclista (FILE *);
  28. void modif_fich (FILE *);
  29. float total_tiempos (FILE *);
  30.  
  31. int main(){
  32.           char op;
  33.           FILE *pf;
  34.          
  35.           if((pf=fopen("ciclistas.dat", "ab+"))==NULL){
  36.               fprintf(stderr, "Error al abrir el fichero ciclistas.dat.\n");
  37.               exit(1);}
  38.  
  39.           do{
  40.              printf("a-->Alta\nb--> Buscar/Modificar ficha\nt--> Total tiempos\n");
  41.              LEE_CAR(op);
  42.  
  43.              switch(op){
  44.                   case 'a':
  45.                   case 'A': {alta_ciclista(pf); break;}
  46.                   case 'b':
  47.                   case 'B': {modif_fich(pf); break;}
  48.                   case 't':
  49.                   case 'T': {printf("\n%s %.2f\n","El total de los tiempos es:",total_tiempos(pf)); break;}
  50.              }
  51.           }while((op != 's') && (op != 'S'));
  52.           if(pf != NULL)
  53.             if(fclose(pf) == EOF)
  54.                fprintf(stderr, "Error al cerrar el fichero ciclistas.dat.\n");
  55.                exit(0);
  56. }
  57.  
  58. void alta_ciclista(FILE *d){
  59.           ciclista participante;
  60.  
  61.           printf("Número del dorsal: ");
  62.           scanf("%2s", participante.num_dorsal);
  63.           printf("Equipo: ");
  64.           LEE_CAD(participante.equipo, 50);
  65.           printf("Nombre: ");
  66.           LEE_CAD(participante.nom, 50);
  67.           printf("Apellido: ");
  68.           LEE_CAD(participante.ape, 50);  
  69.           printf("Nacionalidad: ");
  70.           LEE_CAD(participante.nacionalidad, 50);
  71.           printf("Tiempo acumulado: ");
  72.           scanf("%f", &participante.tiempo_acum);
  73.           fwrite(&participante, sizeof(participante), 1, d);
  74. }
  75.  
  76. void modif_fich(FILE *d){
  77.           char op;
  78.           char num_dorsal[3];
  79.           ciclista parti;
  80.           int comp;
  81.           FILE *aux;
  82.  
  83.           if((aux=fopen("ciclistas.dat", "wb+"))!=NULL){
  84.               printf("Número del dorsal a buscar/modificar: ");
  85.               scanf("%2s", num_dorsal);
  86.               rewind(d);
  87.               fread(&parti, sizeof(parti), 1, d);
  88.               comp=strcmp(parti.num_dorsal, num_dorsal);
  89.               while((comp != 0) && (!feof(d))){
  90.                   fwrite(&parti, sizeof(parti), 1, aux);
  91.                   fread(&parti, sizeof(parti), 1, d);
  92.                   comp=strcmp(parti.num_dorsal, num_dorsal);}
  93.               if(comp == 0){
  94.                  printf("Ciclista encontrado:\n");
  95.                  printf("%s\n%s\n%s\n%s\n%s\n%.2f\n", parti.num_dorsal, parti.equipo, parti.nom, parti.ape, parti.nacionalidad, parti.tiempo_acum);
  96.                  printf("Modificar tiempo (s/n)?");
  97.                  LEE_CAR(op);
  98.                  if((op=='s') || (op=='S')){
  99.                     printf("Tiempo acumulado: ");
  100.                     scanf("%f", &parti.tiempo_acum);
  101.                     fwrite(&parti, sizeof(parti), 1, aux);
  102.                     fread(&parti, sizeof(parti), 1, d);
  103.                      while(!feof(d)){
  104.                          fwrite(&parti, sizeof(parti), 1, aux);
  105.                          fread(&parti, sizeof(parti), 1, d);}
  106.                      if(fclose(aux) == EOF)
  107.                         fprintf(stderr, "Error al cerrar el fichero ciclistas.dat.\n");        
  108.                      remove("ciclistas.dat");
  109.                      rename("ciclistas.aux", "ciclistas.dat");
  110.                      if((d=fopen("ciclistas.dat", "ab+"))==NULL){
  111.                         fprintf(stderr, "Error al abrir el fichero ciclistas.dat.\n");
  112.                         exit(2);}
  113.                  }
  114.                  else{
  115.                    if(fclose(aux) == EOF)
  116.                      fprintf(stderr, "Error al cerrar el fichero ciclistas.aux.\n");
  117.                  }
  118.               }  
  119.               else{
  120.                  printf("Ciclista no encontrado.\n");
  121.                  if(fclose(aux) == EOF)
  122.                    fprintf(stderr, "Error al cerrar el fichero ciclistas.aux.\n");
  123.               }  
  124.           }    
  125. }
  126.  
  127. float total_tiempos(FILE *d){
  128.            ciclista parti;
  129.            float total=0.0;
  130.            rewind(d);
  131.            fread(&parti,sizeof(parti),1,d);
  132.            while(!feof(d)){
  133.               total+=parti.tiempo_acum;
  134.               fread(&parti,sizeof(parti),1,d);
  135.            }
  136.            return(total);
  137. }

Por otro lado, he creado otro fichero para ordenar el tiempo de los corredores:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct ciclista{
  6.          char num_dorsal[3];
  7.          char equipo[50];
  8.          char nom[50];
  9.          char ape[50];
  10.          char nacionalidad[50];
  11.          float tiempo_acum;
  12. };
  13.  
  14. int main(int argc, char *argv[]){
  15.        
  16.         void ordena_fich_tiempos();
  17.         void muestra_fich_tiempos();
  18.  
  19.         ordena_fich_tiempos(argv[1]);
  20.         printf("\n%s\n\n",argv[1]);
  21.         muestra_fich_tiempos(argv[1]);
  22.         exit(0);
  23. }
  24.  
  25. void ordena_fich_tiempos(const char *nom_fich){
  26.         FILE *pf;
  27.         struct ciclista p1, p2;
  28.         int fin=0;
  29.         long int pos;
  30.  
  31.         if((pf=fopen(nom_fich,"rb+"))==NULL)
  32.           printf("Error al abrir el fichero de ciclistas.\n");
  33.         else{
  34.              fread(&p1,sizeof(p1),1,pf);
  35.              fread(&p2,sizeof(p2),1,pf);
  36.              do{
  37.                 if(p1.tiempo_acum >p2.tiempo_acum){
  38.                   fseek(pf, -(2*sizeof(p1)), SEEK_CUR);
  39.                   fwrite(&p2,sizeof(p2),1,pf);
  40.                   fwrite(&p1,sizeof(p1),1,pf);
  41.                   fread(&p2,sizeof(p2),1,pf);
  42.                   fin=1;
  43.              }
  44.              else{
  45.                 p1=p2;
  46.                 fread(&p2,sizeof(p2),1,pf);
  47.              }
  48.              if(feof(pf)){
  49.                if(p1.tiempo_acum >p2.tiempo_acum){
  50.                   fseek(pf, -(2*sizeof(p1)), SEEK_CUR);
  51.                   fwrite(&p2,sizeof(p2),1,pf);
  52.                   fwrite(&p1,sizeof(p1),1,pf);
  53.                   fseek(pf,0,SEEK_SET);
  54.                   fin=0;
  55.                   fread(&p1,sizeof(p1),1,pf);    
  56.                   fread(&p2,sizeof(p2),1,pf);
  57.                }
  58.              }
  59.              if(feof(pf) && (fin==1)){
  60.                fseek(pf,0,SEEK_SET);
  61.                fin=0;
  62.                fread(&p1,sizeof(p1),1,pf);
  63.                fread(&p2,sizeof(p2),1,pf);
  64.              }
  65.              }while(!feof(pf));
  66.         }
  67.         if(fclose(pf)==EOF)
  68.             printf("Error al cerrar el fichero");
  69. }

Al compilarlo hago lo siguiente: gcc ficheros_4.c ordenar_fich_por_tiempos_4.c, pero me sale esto: In function `main':
ordenar_fich_por_tiempos_4.c:(.text+0x0): multiple definition of `main'
/tmp/ccUPh1Ba.o:ficheros_4.c:(.text+0x0): first defined here
/tmp/ccK0z4EM.o: In function `main':
ordenar_fich_por_tiempos_4.c:(.text+0x48): undefined reference to `muestra_fich_tiempos'
collect2: ld devolvió el estado de salida 1

¿Pueden ayudarme, por favor?. Gracias.