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

Hola, el siguiente ejercicio ordena el nombre utilizando el qsort e imprime los nombres ordenados alfabéticamente junto con la deuda, pero si en lugar de ordenar los nombres quiero ordenar la factura y que me imprima ésta junto con el nombre, ¿cómo lo haría?

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