Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: alt_369 en 18 Mayo 2013, 22:11 pm



Título: Problemas con qsort y bsearch
Publicado por: alt_369 en 18 Mayo 2013, 22:11 pm
Buenas,

es la primera vez que utilizo las funciones qsort y bsearch, y miro y miro el código y no entiendo qué hago mal, así que si alguien lo ve, me haría un gran favor al decírmelo.

El programa se trata de crear una lista que ordene por el primer apellido (cognom1), y, si se da el caso de que hubieran dos iguales, se escribe la información sobre el DNI menor.

aquí lo dejo, y ante todo, ¡muchas gracias por vuestro tiempo!

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct{
  5. char carrer[16];
  6. char num[5];
  7. char poblacio[16];
  8. char codiPostal[5];
  9. }adreca;
  10. typedef struct{
  11. char nom[11];
  12. char cognom1[16];
  13. char cognom2[16];
  14. adreca dir;
  15. int dni;
  16. char sexe;
  17. }persona;
  18. int ordenar(const void *,const void *);
  19. int main(void){
  20. int n, i;
  21. persona *v, *trobat, p, *ap;
  22. printf("numero persones: ");
  23. scanf("%d", &n);
  24. if(n<1){ printf("no hi ha suficients persones\n"); exit(1); }
  25. v = (persona *)malloc(n*sizeof(persona));
  26. if(v==NULL){ printf("no hi ha memoria\n"); exit(1); }
  27. for(i=0; i<n; i++){
  28. scanf(" %s", v[i].nom);
  29. scanf(" %s", v[i].cognom1);
  30. scanf(" %s", v[i].cognom2);
  31. scanf(" %s", v[i].dir.carrer);
  32. scanf(" %s", v[i].dir.num);
  33. scanf(" %s", v[i].dir.poblacio);
  34. scanf(" %s", v[i].dir.codiPostal);
  35. scanf("%d", &v[i].dni);
  36. scanf(" %c", &v[i].sexe);
  37. }
  38. qsort(v,n,sizeof(persona *),ordenar);
  39. printf("cognom a buscar: ");
  40. scanf(" %s", p.cognom1);
  41. ap = &p;
  42. trobat = (persona *)bsearch(ap,v,n,sizeof(persona *), ordenar);
  43. if(trobat==NULL){ printf("no s'ha trobat %s\n", p.cognom1); exit(1); }
  44. printf("nom: %s\n", trobat->nom);
  45. printf("primer cognom: %s\n", trobat->cognom1);
  46. printf("segon cogmon: %s\n", trobat->cognom2);
  47. printf("carrer: %s\n", trobat->dir.carrer);
  48. printf("numero del carrer: %s\n", trobat->dir.num);
  49. printf("poblacio: %s\n", trobat->dir.poblacio);
  50. printf("codi postal: %s\n", trobat->dir.codiPostal);
  51. printf("DNI: %d\n", trobat->dni);
  52. if(trobat->sexe=='H') printf("sexe: home\n");
  53. else printf("sexe: dona\n");
  54. return 0;
  55. }
  56. int ordenar(const void *a1, const void *a2){
  57. persona p1, p2;
  58. int k;
  59. p1 = *(persona *)a1;
  60. p2 = *(persona *)a2;
  61. k = strcmp(p1.cognom1,p2.cognom1);
  62. if(k!=0) return k;
  63. return p1.dni - p2.dni;
  64. }


Título: Re: Problemas con qsort y bsearch
Publicado por: durasno en 19 Mayo 2013, 02:40 am
Hola! uno de los problemas es el tamaño de "v" que le pasas tanto a qsort como a bsearch: no tenes que usar sizeof(persona *), lo correcto es sizeof(persona)

El problema principal es que la funcion comparar no sirve para bsearch. A comparar la adaptaste para que si o si retorne un valor mayor a cero o menor a cero pero nunca igual, lo cual es necesario para bsearch(sino nunca va a devolver el objeto buscado)

Crea para bsearch otra funcion:
Código
  1.    int ordenar1(const void *a1, const void *a2){
  2.    persona p1, p2;
  3.    int k;
  4.    p1 = *(persona *)a1;
  5.    p2 = *(persona *)a2;
  6.    k = strcmp(p1.cognom1,p2.cognom1);
  7.    return k;

Saludos


Título: Re: Problemas con qsort y bsearch
Publicado por: alt_369 en 19 Mayo 2013, 09:30 am
¡Muchas gracias durasno!, ahora funciona correctamente.

¡Saludos!