Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ordenar fichero por tiempos

Estas en el tema de ordenar fichero por tiempos en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 25/04/2010, 04:38
 
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.
  #2 (permalink)  
Antiguo 25/04/2010, 06:25
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: ordenar fichero por tiempos

Un ejecutable comienza su ejecucion en la primera instruccion de main(), y cuando estas compilando, le estas pasando 2 archivos, cada uno con una funcion main() dentro. Como hará el compilador para decidir cual es la que quieres usar para empezar?

El compilador no lo hace. No decide eso por ti. En vez de eso, te marca un error, indicando que tienes 2 mains, para que decidas tu.
  #3 (permalink)  
Antiguo 25/04/2010, 10:20
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: ordenar fichero por tiempos

Cuando voy a compilar el fichero "ordenar_fich_por_tiempos_4.c hago lo siguiente: gcc ordenar_fich_por_tiempos_4.c -o ordenar_fich_por_tiempos_4 y me sale lo siguiente: 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

¿Dónde está el error?

Etiquetas: fichero
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:43.