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

ordenar la deuda usando qsort

Estas en el tema de ordenar la deuda usando qsort en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 01/06/2010, 05:24
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 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. }
  #2 (permalink)  
Antiguo 02/06/2010, 03:49
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: ordenar la deuda usando qsort

Hola, en este programa, ¿cómo puedo hacer para que me de la opción de ordenar tanto por el nombre como por la deuda? he intentado hacerlo con un switch, pero no me aclaro. Ayudadme, por, favor. Gracias.
  #3 (permalink)  
Antiguo 02/06/2010, 04:12
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 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. }

Etiquetas: Ninguno
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 22:01.