Étant donné un tableau de structure (en C), je tente d’imprimer les résultats en groupes de genre et en sous-ordre par ordre numérique. Par exemple:
struct employee{
char gender[13]
char name[13];
int id;
};
Disons que je définis le tableau de structure comme suit:
struct employee info[2]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};
Comment puis-je imprimer les résultats comme
1234 Matt
1235 Josh
2345 Jessica
Vous devrez implémenter une fonction de tri comparant les structures à votre guise.
int compare(const void *s1, const void *s2)
{
struct employee *e1 = (struct employee *)s1;
struct employee *e2 = (struct employee *)s2;
int gendercompare = strcmp(e1->gender, e2->gender);
if (gendercompare == 0) /* same gender so sort by id */
return e1->id - e2->id;
else
return -gendercompare; /* the minus puts "male" first as in the question */
}
Et utilisez ensuite qsort de la bibliothèque standard.
qsort(data, count, sizeof(struct employee), compare);
Dans la fonction de comparaison, vous pouvez vérifier si l'identifiant est égal, puis vous pouvez trier par nom (en utilisant également strcmp()
) comme vous le souhaitez.
Ken
Edit: vient de compiler et de corriger cela. Voici un petit programme de test
#include <stdio.h>
#include <stdlib.h>
struct employee{
char gender[13];
char name[13];
int id;
};
int compare(const void *s1, const void *s2)
{
struct employee *e1 = (struct employee *)s1;
struct employee *e2 = (struct employee *)s2;
int gendercompare = strcmp(e1->gender, e2->gender);
if (gendercompare == 0) /* same gender so sort by id */
return e1->id - e2->id;
else
return -gendercompare;
}
main()
{
int i;
struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};
for (i = 0; i < 3; ++i)
printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
qsort(info, 3, sizeof(struct employee), compare);
for (i = 0; i < 3; ++i)
printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name);
}
Avec sortie:
$ ./a.exe
1234 male Matt
2345 female Jessica
1235 male Josh
1234 male Matt
1235 male Josh
2345 female Jessica
Utilisez votre algorithme de tri préféré sur le tableau struct. Lorsque vous comparez deux éléments du tableau pour déterminer lequel est le plus "grand", comparez leurs genres; si les sexes sont les mêmes, comparez leurs nombres. (Vous souhaiterez peut-être définir une fonction distincte pour effectuer cette comparaison afin de clarifier les choses.) Ensuite, imprimez le tableau trié dans l'ordre en utilisant le formatage souhaité. Gardez une trace du moment où le genre bascule d'homme à femme pour pouvoir ajouter trois nouvelles lignes supplémentaires, comme dans votre exemple.
Edit: pour emprunter sans vergogne à kallikak, vous pouvez simplement passer votre fonction de comparaison à qsort, mais le renvoyer 1 si une structure est "supérieure", -1 si elle est "inférieure" et (si nécessaire) 0 si elle est identique (en utilisant la procédure que j'ai décrite ci-dessus). Jetez un oeil à Comment écrire une fonction de comparaison pour qsort à partir de stdlib? pour obtenir de l’aide sur l’écriture d’une fonction de comparaison personnalisée.
Pense que c'est plus facile à comprendre, comme je suis faible en pointeur, j'espère que ça aide ............
#include<bits/stdc++.h>
using namespace std;
struct employee{
char gender[13];
char name[13];
int id;
};
bool compare(employee s1,employee s2)
{
return s1.id<s2.id;
}
main()
{
int i;
struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}};
sort(info,info+3,compare);
for (i = 0; i < 3; i++)
printf("%d\t%s\t%s\n",info[i].id,info[i].gender,info[i].name);
}