Ver Mensaje Individual
  #3 (permalink)  
Antiguo 02/06/2010, 04:12
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: ordenar la deuda usando qsort

Cómo puedo hacer para que después de ordenar por el nombre me aparezca otra vez el menú es que no me lo muestra. Este es el codigo:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. /* macro para leer cadenas con caracteres blanco filtrando los return y
  5.    blancos iniciales  */
  6. #define lee_cad(cad,n,fin) cad[0]=getchar(); \
  7.                            while(((int)cad[0] == 10) || ((int)cad[0] == 32)) \
  8.                               cad[0]=getchar();\
  9.                            n=0; \
  10.                            while(((int)cad[n]!= 10) && (n < fin)){ \
  11.                        n++; cad[n]=getchar();} \
  12.                    cad[n]='\0';
  13.  
  14. #define LEE_CAR(c)\
  15.         c=getchar();\
  16.         while((c=='\n') || (c==' ') || (c=='\t'))\
  17.             c=getchar();
  18.  
  19.  
  20. #define T_NOM 100
  21.  
  22. struct registro{
  23.    char nombre[T_NOM];
  24.    float deuda;
  25. };
  26.  
  27. int main(){
  28.   FILE * df;
  29.   struct registro cliente;
  30.   int i,fin;
  31.   char op;
  32.   int num_registros;
  33.   struct registro *punt_memoria;
  34.   int compara();
  35.  
  36.   if((df=fopen("apuestas.dat","wb")) == NULL){
  37.      printf("\nError al crear el fichero apuestas.dat\n");
  38.      exit(1);
  39.   }
  40.  
  41.  
  42.   do{
  43.      printf("Nombre del apostante: ");
  44.      lee_cad(cliente.nombre,i,T_NOM);
  45.      //scanf("%49s",cliente.nombre);
  46.      printf("Deuda: ");
  47.      scanf("%f",&cliente.deuda);
  48.      fwrite(&cliente,sizeof(cliente),1,df);
  49.      printf("Otro(0 --> No / 1 --> Sí) ");
  50.      scanf("%d",&fin);
  51.   }
  52.   while(fin!=0);
  53.  
  54.   do{
  55.      printf("Elija una opción:\n1--> Ordenar por nombre\n2--> Ordenar por deuda\n3--> Salir\n");
  56.      LEE_CAR(op);
  57.   }
  58.   while((op < '1') || (op > '3'));
  59.  
  60.   switch(op){
  61.         case '1': { compara(df); break;}
  62.   }
  63.  
  64.   fclose(df);
  65.  
  66.   if((df=fopen("apuestas.dat","rb")) == NULL){
  67.      printf("\nError al abrir el fichero apuestas.dat\n");
  68.      exit(1);
  69.   }
  70.   /* Para ver cuantos registros hay en el fichero, pongo el puntero
  71.   al final, obtengo su posición y divido por el tamaño del registro */
  72.   fseek(df,0,SEEK_END);
  73.  
  74.   num_registros = ftell(df)/sizeof(cliente);
  75.  
  76.   /* Reservo la memoria necesaria para estos registros */
  77.   punt_memoria = (struct registro *)calloc(num_registros, sizeof(cliente));
  78.  
  79.   /* Leo los registro del fichero y los guardo en memoria */
  80.  
  81.   rewind(df); /* Llego el descriptor de fichero al principio */
  82.   /* Leo todos los registros y los guardo en la zona reservada de memoria */
  83.   fread(punt_memoria,sizeof(cliente),num_registros,df);
  84.  
  85.   fclose(df);
  86.   /* Ordeno el vector con qsort() */
  87.  
  88.   qsort(punt_memoria,num_registros,sizeof(cliente),compara);
  89.  
  90.   /* Guarda los registros ordenados en el fichero */
  91.   if((df=fopen("apuestas.dat","wb")) == NULL){
  92.      printf("\nError al crear el fichero apuestas.dat\n");
  93.      exit(1);
  94.   }
  95.   fwrite(punt_memoria,sizeof(cliente),num_registros,df);
  96.   fclose(df);
  97.  
  98.   /* Mostrar el contenido del fichero ordenado */
  99.   if((df=fopen("apuestas.dat","rb")) == NULL){
  100.      printf("\nError al abrir el fichero apuestas.dat\n");
  101.      exit(1);
  102.   }
  103.   fread(punt_memoria,sizeof(cliente),num_registros,df);
  104.   for(i=0; i < num_registros; i++)
  105.     printf("%s  %.2f\n",(punt_memoria+i)->nombre, (punt_memoria+i)->deuda);
  106.   fclose(df);
  107.   free(punt_memoria);
  108. } /* main() */
  109.  
  110. /* La función compara usa strcmp para ordenar alfabéticamente
  111.    el fichero */
  112. int compara(struct registro *r1, struct registro *r2){
  113.     return(strcmp(r1->nombre, r2->nombre));
  114. }