elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problemas con qsort y bsearch
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con qsort y bsearch  (Leído 1,851 veces)
alt_369

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Problemas con qsort y bsearch
« 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. }


En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Problemas con qsort y bsearch
« Respuesta #1 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


« Última modificación: 19 Mayo 2013, 02:42 am por durasno » En línea

Ahorrate una pregunta, lee el man
alt_369

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Problemas con qsort y bsearch
« Respuesta #2 en: 19 Mayo 2013, 09:30 am »

¡Muchas gracias durasno!, ahora funciona correctamente.

¡Saludos!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problemas Nero-problemas Roxio-problemas sonido de PC
Multimedia
mohabe 1 3,566 Último mensaje 5 Abril 2006, 04:47 am
por fer63
listas enlazadas problemas resueltos todo un paquete de 13 problemas
Java
fiisi 4 55,380 Último mensaje 9 Junio 2009, 02:25 am
por sapito169
ordenar por nombre o deuda con la función qsort
Programación C/C++
minette1988 2 3,560 Último mensaje 2 Junio 2010, 15:23 pm
por Gallu
qsort
Programación C/C++
Dato Vagabundo 1 1,808 Último mensaje 26 Agosto 2016, 18:36 pm
por AlbertoBSD
Usar qsort para guardar
Programación C/C++
Elkabeson 3 2,861 Último mensaje 31 Octubre 2021, 17:55 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines