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!
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 (c) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char carrer[16];
char num[5];
char poblacio[16];
char codiPostal[5];
}adreca;
typedef struct{
char nom[11];
char cognom1[16];
char cognom2[16];
adreca dir;
int dni;
char sexe;
}persona;
int ordenar(const void *,const void *);
int main(void){
int n, i;
persona *v, *trobat, p, *ap;
printf("numero persones: ");
scanf("%d", &n);
if(n<1){ printf("no hi ha suficients persones\n"); exit(1); }
v = (persona *)malloc(n*sizeof(persona));
if(v==NULL){ printf("no hi ha memoria\n"); exit(1); }
for(i=0; i<n; i++){
scanf(" %s", v[i].nom);
scanf(" %s", v[i].cognom1);
scanf(" %s", v[i].cognom2);
scanf(" %s", v[i].dir.carrer);
scanf(" %s", v[i].dir.num);
scanf(" %s", v[i].dir.poblacio);
scanf(" %s", v[i].dir.codiPostal);
scanf("%d", &v[i].dni);
scanf(" %c", &v[i].sexe);
}
qsort(v,n,sizeof(persona *),ordenar);
printf("cognom a buscar: ");
scanf(" %s", p.cognom1);
ap = &p;
trobat = (persona *)bsearch(ap,v,n,sizeof(persona *), ordenar);
if(trobat==NULL){ printf("no s'ha trobat %s\n", p.cognom1); exit(1); }
printf("nom: %s\n", trobat->nom);
printf("primer cognom: %s\n", trobat->cognom1);
printf("segon cogmon: %s\n", trobat->cognom2);
printf("carrer: %s\n", trobat->dir.carrer);
printf("numero del carrer: %s\n", trobat->dir.num);
printf("poblacio: %s\n", trobat->dir.poblacio);
printf("codi postal: %s\n", trobat->dir.codiPostal);
printf("DNI: %d\n", trobat->dni);
if(trobat->sexe=='H') printf("sexe: home\n");
else printf("sexe: dona\n");
return 0;
}
int ordenar(const void *a1, const void *a2){
persona p1, p2;
int k;
p1 = *(persona *)a1;
p2 = *(persona *)a2;
k = strcmp(p1.cognom1,p2.cognom1);
if(k!=0) return k;
return p1.dni - p2.dni;
}